<?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>Zach Holman</title>
 
 <link href="http://zachholman.com/" />
 <updated>2013-05-13T01:23:40-07:00</updated>
 <id>http://zachholman.com</id>
 <author>
   <name>Zach Holman</name>
 </author>
 
 
 <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/holman" /><feedburner:info uri="holman" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
   <title>You Won't Regret Positive Feedback</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/cwiZvovyGxw/positive-feedback" />
   <updated>2013-04-29T00:00:00-07:00</updated>
   <id>http://zachholman.com/posts/positive-feedback</id>
   <content type="html">&lt;p&gt;Every product that has ever existed has had to deal with feedback.&lt;/p&gt;

&lt;p&gt;The most interesting feedback happens before the product ever ships, in
comments and discussion amongst your teammates. Should we leave this as-is?
Does it look right? How can we improve this part of it?&lt;/p&gt;

&lt;p&gt;It&amp;#39;s governed by taste and design. They&amp;#39;re subjective measurements, which means
there&amp;#39;s inevitably going to be conflict.&lt;/p&gt;

&lt;p&gt;I can&amp;#39;t think of a time I&amp;#39;ve ever regretted giving someone positive feedback
on their work. But I still cringe years later when I think of the times I&amp;#39;ve
been overly critical in past feedback.&lt;/p&gt;

&lt;h2&gt;&amp;quot;The products &lt;em&gt;suck&lt;/em&gt;! There&amp;#39;s no sex in them anymore!&amp;quot;&lt;/h2&gt;

&lt;p&gt;While not the originator, Steve Jobs is the personification of this culture of
cruelty-as-management-tactic. There are stories all over the Valley about
directors berating their staff in an effort to motivate them to push harder.
My friend worked at a startup that typified this: her boss would stand over
her desk, tell her how the work she just did &lt;em&gt;was shit&lt;/em&gt; and how she needed to
redo it. I told her that her boss was an asshole; she said he was a genius.&lt;/p&gt;

&lt;p&gt;Maybe that really is a motivator in the short term. It seemed to work for
Apple. But it also led to a lot of burnt-out, unhappy employees, and a really
hostile work environment.&lt;/p&gt;

&lt;h2&gt;Regret&lt;/h2&gt;

&lt;p&gt;There was this thing a few years ago.&lt;/p&gt;

&lt;p&gt;It was something our company was going to launch, and it seemed like there
were parts of it slipping through the cracks. I wanted to see this succeed, so
I devised a sarcastic approach in an effort to drum up more attention to the
launch&amp;#39;s deficiencies. I figured this would be an edgy way to help get more
people involved in turning the ship around, so to speak.&lt;/p&gt;

&lt;p&gt;It was the wrong way to handle it. It shed more negative light internally on
the people involved in the launch, who in the end had great reasons as to why
they made the choices they did. Sometimes circumstances are just shitty.
Sometimes you don&amp;#39;t know the whole story. Or sometimes the shit you&amp;#39;re
stressing out about &lt;em&gt;just doesn&amp;#39;t matter that much&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;Drive-by design&lt;/h2&gt;

&lt;p&gt;I think our industry does feedback really poorly. I sure as hell do. My first
impulse whenever I see a comp is to shit on it. Honestly. Even if it looks
great. &lt;em&gt;Especially&lt;/em&gt; if it looks great. We instinctively want to pick apart any
deficiencies as soon as possible because that&amp;#39;s how product is created. We
build things incrementally, chipping away the rough edges until we have a
clean polished surface underneath it all.&lt;/p&gt;

&lt;p&gt;I think that leads to a feeling that being emotional or cruel is actually
&lt;em&gt;helpful&lt;/em&gt; during design or code reviews. That the approach cuts away the fat
even quicker, which is a great thing since we can get to that finished product
quicker, right? Because that&amp;#39;s really all that matters anyway, after
everything is said and done: if The Product is unimpeachable, everything was
worth it. Sleeping under your desk. Yelling at your coworkers. Pushing to make
that final iteration. It&amp;#39;s all for The Sake Of The Product.&lt;/p&gt;

&lt;p&gt;It&amp;#39;s really all bullshit though. Maybe it does produce good product, but I
don&amp;#39;t really care about that directly anymore. I want to make good companies.
Good, healthy, positive companies produce good products. And if things still
go south, and your good company produces a product that just wasn&amp;#39;t good
enough, well, at least you&amp;#39;re all still happy. Companies with hostile
environments can fail just as easily, but the difference is that they leave
depressed and angry people in their wake.&lt;/p&gt;

&lt;h2&gt;It doesn&amp;#39;t matter that much&lt;/h2&gt;

&lt;p&gt;It really doesn&amp;#39;t.&lt;/p&gt;

&lt;p&gt;I&amp;#39;m still bad at giving feedback. I want to slam my mouse on that big submit
button in the comment form as soon as I can. But I&amp;#39;ve found that&amp;#39;s almost
always &lt;em&gt;a reaction&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;If I see a monumentally bad idea come across my inbox, I&amp;#39;ve been trying to
first let it simmer for a few hours or days. It&amp;#39;s surprisingly made me a much
happier human. You don&amp;#39;t get suckered into as many passionate debates because
you&amp;#39;re able to come into the discussion with a much cooler head. Many times I
end up seeing why the decision was made in the first place. There are always a
myriad of tiny invisible decisions that go into building a product, and you
can&amp;#39;t understand all of them three minutes into glancing at someone&amp;#39;s work.&lt;/p&gt;

&lt;p&gt;In turn, you also avoid shitting on the work of people you care about:
friends, colleagues, humans. You should still say what&amp;#39;s on your mind —
disagreements will always happen, after all — but coming at it with a cooler
head makes for less sarcasm and fewer lines drawn in the sand. And you can be
proud about that.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/cwiZvovyGxw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/posts/positive-feedback</feedburner:origLink></entry>
 
 <entry>
   <title>The Conference Circuit</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/lYwbqArWJII/the-conference-circuit" />
   <updated>2013-04-22T00:00:00-07:00</updated>
   <id>http://zachholman.com/posts/the-conference-circuit</id>
   <content type="html">&lt;p&gt;You&amp;#39;re at a new conference, but the faces look the same.&lt;/p&gt;

&lt;p&gt;The speakers all are familiar. The names? Few surprises. You&amp;#39;re seeing the
conference circuit at work.&lt;/p&gt;

&lt;h2&gt;Hedging Their Bet&lt;/h2&gt;

&lt;p&gt;This isn&amp;#39;t some conspiracy. What you&amp;#39;re seeing is simple: it&amp;#39;s a  hedge.
Conference organizers like people who have given talks before.&lt;/p&gt;

&lt;p&gt;The quality gulf between your first talk and your second talk is unnervingly
large. You learn how to talk to a group of people. You discover how to stand
on a stage. You micromanage an internal monologue while delivering an external
monologue. During your first talk, the dumbest things — plugging your laptop
in, drinking water, even &lt;em&gt;breathing&lt;/em&gt; — are things to worry about, things that
could cause a stumble.&lt;/p&gt;

&lt;p&gt;They dissipate some by your second talk. By reaching your second talk, you&amp;#39;re
suddenly Accomplished: you have made it through at least one talk without
dying or collapsing into a small ball of tears and embarrassment.&lt;/p&gt;

&lt;p&gt;People who do this process over and over again are Very Accomplished. They&amp;#39;re
a known quantity. Someone who can Get Things Done, at least on stage.&lt;/p&gt;

&lt;p&gt;Watching a bad talk at a conference can waste thirty minutes of your time.
That&amp;#39;s irritating. On a conference level, though, you&amp;#39;re wasting thirty
minutes of two hundred people&amp;#39;s time. That&amp;#39;s intimidating.&lt;/p&gt;

&lt;p&gt;So they hedge. Organizers ask people who have done this before, and they hope
to avoid disaster.&lt;/p&gt;

&lt;h2&gt;The Circuit&lt;/h2&gt;

&lt;p&gt;The Conference Circuit is a weird thing to be on. I flew around 200,000 miles
last year to primarily give talks at conferences. It&amp;#39;s exhausting, and it&amp;#39;s a
lot of fun. It&amp;#39;s also really surreal sometimes.&lt;/p&gt;

&lt;p&gt;People look up to you. Often, literally: you&amp;#39;re on a stage, towering over tidy
rows of folding chairs. Typically, metaphorically: you&amp;#39;re &lt;em&gt;the expert&lt;/em&gt;, you&amp;#39;re
&lt;em&gt;flown in&lt;/em&gt;, you go to &lt;em&gt;special speakers dinners&lt;/em&gt;. It&amp;#39;s hard to not feel some
feeling of superiority.&lt;/p&gt;

&lt;p&gt;This isn&amp;#39;t necessarily bad when it comes to your talk. It&amp;#39;s helpful to feel
like you have some special power over these people because &lt;em&gt;holy fuck they&amp;#39;re
all looking at &lt;b&gt;me&lt;/b&gt; why did I think I ever deserved to be up here in the
first place holy bajeezus I should just duck behind this podium and maybe I
can disappear in poof of nervousness&lt;/em&gt;. Anything that makes you feel confident
in the face of this insecurity is a good thing.&lt;/p&gt;

&lt;p&gt;The real trick is dropping the schtick after the talk. More often than not,
the attendees know more than you do, and the speakers just happen to have some
additional experiences in the small realm of their talk. Many times, people on
The Conference Circuit can&amp;#39;t drop the schtick: I&amp;#39;ve heard of plenty who only
show for their talk session and ditch the rest of the conference like some
conference prima donna. If that was a thing that existed, I mean.&lt;/p&gt;

&lt;p&gt;Most speakers aren&amp;#39;t magical; they&amp;#39;re just prepared (and some not even that).
It&amp;#39;s not cause for some special elevated status.&lt;/p&gt;

&lt;h2&gt;Small and focused&lt;/h2&gt;

&lt;p&gt;So how do we address this problem of stale speakers? It&amp;#39;s a problem that won&amp;#39;t
ever go away, but good conferences can help combat the tide.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Stories&lt;/strong&gt;. Focus on stories rather than ideas. For one, ideas are harder to
capture for first-time speakers: they&amp;#39;re typically abstract concepts that are
difficult to communicate unless you&amp;#39;ve thought about it a &lt;em&gt;lot&lt;/em&gt;. But if you&amp;#39;re
just telling a story of a problem you&amp;#39;ve solved in your career, you&amp;#39;re just
regurgitating experiences. It&amp;#39;s easier to deliver, and reduces the risk of a
new speaker bombing on-stage.&lt;/p&gt;

&lt;p&gt;Hidden bonus: stories are typically far more captivating to listen to for an
audience.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Discussions&lt;/strong&gt;. For smaller conferences, breaking into groups of less than
50, ideally seated informally, can really change an experience. Have someone
talk about their experiences for twenty minutes, and then have an informal
discussion around the room for the next forty. In this format, the discussions
are usually more fascinating than the talk, as each person contributing to the
discussion can share their own experiences in that domain.&lt;/p&gt;

&lt;p&gt;Good moderation, of course, is crucial here.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Shorter talks&lt;/strong&gt;. Speaking for twenty minutes is a wildly different
experience than trying to fill an entire hour. Almost no technically-minded
talk can keep a room full of people engaged for a full hour. Shorter, targeted
talks get people focused on very specific problems, and they&amp;#39;re simply more
exciting.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;

&lt;p&gt;These suggestions won&amp;#39;t work for every conference, though. Larger conferences
can&amp;#39;t break up into small, intimate sessions. Abstract talks — which are just
as important — don&amp;#39;t lend themselves to stories as easily. Still, facilitating
these types of interactions can really make your conference stand out.&lt;/p&gt;

&lt;p&gt;There are a lot of great speakers out there. A lot of them haven&amp;#39;t discovered
it yet, though. There&amp;#39;s nothing wrong with wanting to seeing our favorite
speakers at conferences, but I&amp;#39;d love to discover even more new faces, too.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/lYwbqArWJII" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/posts/the-conference-circuit</feedburner:origLink></entry>
 
 <entry>
   <title>Keeping People</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/gO6CEFQnp1U/keeping-people" />
   <updated>2013-04-11T00:00:00-07:00</updated>
   <id>http://zachholman.com/talk/keeping-people</id>
   <content type="html">&lt;p&gt;Tech companies do a generally poor job at keeping employees from leaving.&lt;/p&gt;

&lt;p&gt;There are plenty of reasons for this: competing offers, unhappiness, and just generally itchy feet. Because of this, sometimes it&amp;#39;s difficult to focus on building a strong culture of company solidarity, particularly when you&amp;#39;re trying to juggle the hundreds of other needs of a growing business.&lt;/p&gt;

&lt;p&gt;This is a talk about keeping people.&lt;/p&gt;

&lt;h3&gt;Slides&lt;/h3&gt;

&lt;script async class="speakerdeck-embed" data-id="ab05286085100130b5b41231381d2437"
  data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"&gt;&lt;/script&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/gO6CEFQnp1U" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/talk/keeping-people</feedburner:origLink></entry>
 
 <entry>
   <title>If Only I Knew This Shit in College</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/UAiPgqia_cs/if-only-i-knew-this-shit-in-college" />
   <updated>2013-03-28T00:00:00-07:00</updated>
   <id>http://zachholman.com/talk/if-only-i-knew-this-shit-in-college</id>
   <content type="html">&lt;p&gt;I knew I wanted to work in tech.&lt;/p&gt;

&lt;p&gt;Looking back, that&amp;#39;s really all I knew prior to graduating from university and
joining the working world. I was invited back to give a talk at my alma mater
recently and I wanted to give a talk to my less-than-knowledgeable former self
and explain to him what he&amp;#39;ll learn in the subsequent years after school.&lt;/p&gt;

&lt;p&gt;This is that talk.&lt;/p&gt;

&lt;h3&gt;Slides&lt;/h3&gt;

&lt;script async class="speakerdeck-embed" data-id="d3f56f007adf01307e7722000a9f0395"
  data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"&gt;&lt;/script&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/UAiPgqia_cs" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/talk/if-only-i-knew-this-shit-in-college</feedburner:origLink></entry>
 
 <entry>
   <title>GitHub: Behind the Feature</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/EIIPlUir0dM/github-behind-the-feature" />
   <updated>2013-03-28T00:00:00-07:00</updated>
   <id>http://zachholman.com/talk/github-behind-the-feature</id>
   <content type="html">&lt;p&gt;In the beginning of 2013, we shipped a new version of Search to GitHub.com. This
talk takes a peek behind the scenes to illustrate how we build features at GitHub.
It&amp;#39;s a good beginner-level look at how startups work in teams together and deploy
a product to the general public (initially this talk was given at a university).&lt;/p&gt;

&lt;h3&gt;Slides&lt;/h3&gt;

&lt;script async class="speakerdeck-embed" data-id="058a431079f80130a8d9123138098c12"
  data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"&gt;&lt;/script&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/EIIPlUir0dM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/talk/github-behind-the-feature</feedburner:origLink></entry>
 
 <entry>
   <title>Retina or Death</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/6f3jU36KdsI/retina" />
   <updated>2013-01-07T00:00:00-08:00</updated>
   <id>http://zachholman.com/posts/retina</id>
   <content type="html">&lt;p&gt;It&amp;#39;s been six months since the Retina MacBook Pro shipped and web developers
everywhere are still clutching their keyboards to their chest, ignoring
Progress, and rocking themselves into a dark, pixel-fearing delusion.&lt;/p&gt;

&lt;p&gt;Pixels are the future, be it on an iPad or MacBook or Android phone. Photos
jump out at you. Icons pierce your soul. Letterforms curve through your screen
like a polka dancer dropping acid.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cl.ly/image/291l0H3q0h2l/content" alt="Dat interface"&gt;&lt;/p&gt;

&lt;p&gt;The Retina MacBook Pro is still very much a luxury item, but we&amp;#39;ve had a
Retina iPad for almost a year and the iPhone 4 for two and half years. High
definition displays in widespread usage are five times older than Gangam
Style.&lt;/p&gt;

&lt;p&gt;And yet, the internet is still having a hard time adopting. Startups slave for
months meticulously designing their new marketing site and are completely
oblivious that, to people on a Retina display, it looks like a jumbled
pixelated mess.&lt;/p&gt;

&lt;p&gt;Here&amp;#39;s an actual, unretouched screenshot I took of a new startup that launched
this week:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cl.ly/image/2H090c2l3y2s/content" alt="See? I even pixel-double my shitty screenshots"&gt;&lt;/p&gt;

&lt;p&gt;See? Pixels everywhere. I don&amp;#39;t even see the sites anymore: all I see is
yellow pixel, brown pixel, red pixel…&lt;/p&gt;

&lt;h2&gt;The Fix is In&lt;/h2&gt;

&lt;p&gt;The fix is easy, but few implement the fix: serve higher-resolution assets.&lt;/p&gt;

&lt;p&gt;There are a few ways to do this. Apple.com is one of the approximately two
sites on the internet that have mostly switched-over to high resolution assets,
but they &lt;a href="http://blog.cloudfour.com/how-apple-com-will-serve-retina-images-to-new-ipads/"&gt;use some janky JavaScript&lt;/a&gt;
to first download the image at 1x (normal resolution), shoot another request
to test the existence of the image at 2x (twice the size), download the image
at 2x, and swap the 1x image out of the DOM with the 2x image. It gives your
eyes the distinct impression that they have cataracts as they adjust to
the blurry image for a split-second before it bumps up to something pleasant
to look at. On top of that, Retina devices incur the additional overhead of
loading two images and an additional request in order to render the image at
2x.&lt;/p&gt;

&lt;p&gt;The easier way is to just load the 2x asset for all clients:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="html language-html" data-lang="html"&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;/images/header-500px.png&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;250&amp;quot;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Modern browsers are pretty decent now at scaling down assets in-page. That&amp;#39;s
typically fine for photos, and for things like logos — where you want pixel-
perfect scaling at smaller sizes — you can send a designer to go off and
calculate different scale ratios to figure out what fits best in the grid for
that asset.&lt;/p&gt;

&lt;p&gt;You incur additional bandwidth overhead for low-fi screens, but that can be
remedied with &lt;a href="http://coding.smashingmagazine.com/2012/08/20/towards-retina-web/"&gt;CSS media selectors&lt;/a&gt;
by conditionally displaying assets depending on pixel density. You can even
&lt;a href="http://37signals.com/svn/posts/3271-easy-retina-ready-images-using-scss"&gt;automate a lot of this&lt;/a&gt;
with SCSS or other frontend frameworks.&lt;/p&gt;

&lt;p&gt;Beyond that, explore vector technologies like SVG and webfonts.
&lt;a href="https://github.com/blog/1135-the-making-of-octicons"&gt;Creating your own icon set&lt;/a&gt;
or using &lt;a href="http://symbolset.com"&gt;other&lt;/a&gt; &lt;a href="http://fortawesome.github.com/Font-Awesome/"&gt;sets&lt;/a&gt;
can play a huge role in making buttons and navigation controls really pop on
a high DPI screen.&lt;/p&gt;

&lt;h2&gt;1x1.gif&lt;/h2&gt;

&lt;p&gt;Doing this shit takes longer. It&amp;#39;s easier, I know, to just take your same
favorite 16x16 icon from 1992 and blow it up to 128x128 because &lt;em&gt;that&amp;#39;s just
what you&amp;#39;ve done&lt;/em&gt; for the last few decades. But deal with it. High resolutions
displays aren&amp;#39;t quite in widespread usage &lt;em&gt;yet&lt;/em&gt;, but by the end of 2013 that&amp;#39;s
certainly going to start to change. Get ahead of the curve now.&lt;/p&gt;

&lt;p&gt;Remember back in the days before ajax, before DHTML, and before CSS? We had
five years of gloriously designing sites using &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt; tags and the
inimitable &lt;code&gt;1x1.gif&lt;/code&gt; transparent GIF to move elements around on-page. It was
badass, and served us well. But then things like &lt;a href="http://www.csszengarden.com"&gt;Zen Garden&lt;/a&gt;
exploded on the scene and fundamentally changed how the internet collectively &lt;em&gt;looks&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;That&amp;#39;s where we&amp;#39;re at now. There&amp;#39;s a post 1x1.gif world happening now, and you
better serve up some Retina images soon or else your company is going to
crumble and no one will use your product and your children will drop out of
school and do drugs but not the fun drugs the really scary drugs that even you
don&amp;#39;t like and you&amp;#39;re positive they&amp;#39;re doing them because they&amp;#39;ll be uploading
high-resolution photos of themselves doing lines off of the new Retina iPad
you bought them last Christmas.&lt;/p&gt;

&lt;p&gt;So cover your assets, and go update your CSS.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/6f3jU36KdsI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/posts/retina</feedburner:origLink></entry>
 
 <entry>
   <title>Chat Trumps Meetings</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/YWifWABRnfI/chat" />
   <updated>2012-12-12T00:00:00-08:00</updated>
   <id>http://zachholman.com/posts/chat</id>
   <content type="html">&lt;p&gt;I do a lot of public speaking about our &lt;a href="http://zachholman.com/posts/how-github-works-asynchronous/"&gt;asynchronous workflow&lt;/a&gt; at
GitHub. Our office is filled with chat rooms, email, and pull requests rather
than development meetings and in-person code review.&lt;/p&gt;

&lt;p&gt;I think people understand why this may be a better way to work, overall. We
can avoid distractions, work from anywhere, and recruit globally.&lt;/p&gt;

&lt;p&gt;But I think it goes further than most realize: &lt;strong&gt;chat is a better way to
communicate&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;The Explicit&lt;/h2&gt;

&lt;p&gt;Text is explicit. By forcing communication through a textual medium, you&amp;#39;re
forcing people to better formulate their ideas.&lt;/p&gt;

&lt;p&gt;Real-time oral communication has drawbacks. In normal, conversational dialog,
most of us know the direction we want to take our argument, but it&amp;#39;s difficult
to think about what you&amp;#39;re going to say until a few moments before you say it.
This leads to filler words (like &lt;code&gt;um&lt;/code&gt; and &lt;code&gt;uh&lt;/code&gt;), excess rambling, and lack of
clarity in speech.&lt;/p&gt;

&lt;p&gt;If you&amp;#39;ve ever wanted to scream at someone &lt;em&gt;get to the damn point already&lt;/em&gt;,
you know this pain.&lt;/p&gt;

&lt;p&gt;Text is the opposite. It takes only a moment to go back and rephrase a
sentence before hitting &lt;code&gt;return&lt;/code&gt;. The bit of freedom from being a purely
synchronous, real-time medium means you can editorialize and clean up your
words to better clarify your point.&lt;/p&gt;

&lt;p&gt;Focused text is skimmable, quicker to mentally process, and leaves less room
for ambiguity of thought.&lt;/p&gt;

&lt;h2&gt;The Record&lt;/h2&gt;

&lt;p&gt;Text is also on-record. You should be logging everything that&amp;#39;s said through
your company chat so that people working remotely don&amp;#39;t miss out on what was
happening in the office. This makes communication in your company searchable
and accessible.&lt;/p&gt;

&lt;p&gt;We drop into our transcripts every day to gain more context about previous
decisions. You don&amp;#39;t get that level of granularity even from meeting minutes:
what you think is worth writing down after the meeting may not be what was
&lt;em&gt;important&lt;/em&gt; from that meeting. The discussion is sometimes more important than
the decision.&lt;/p&gt;

&lt;h2&gt;The High-Level&lt;/h2&gt;

&lt;p&gt;Brainstorming is the one area of work where this falls flat.&lt;/p&gt;

&lt;p&gt;During brainstorming, you &lt;em&gt;don&amp;#39;t want&lt;/em&gt; that editorializing step during the
moment before you tap &lt;code&gt;return&lt;/code&gt;. That split-second hesitance can mean the
difference between a multi-million dollar idea and a flop, a clean object
model and a mess, a new policy or the same broken policy.&lt;/p&gt;

&lt;p&gt;At GitHub, we get together a few times a year in the same physical room with
everyone in the company and talk high-level brainstorming. We take notes for
posterity, but talking is the best way to stimulate geniusly-dumb ideas.&lt;/p&gt;

&lt;p&gt;It&amp;#39;s important to not use this excuse for all work, though: most problems
would benefit from a paper and pencil and a room to yourself rather than a
large disruptive meeting. Big ideas require big brainstorming, and small ideas
just take some self-reflection.&lt;/p&gt;

&lt;p&gt;Next time, use your words.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/YWifWABRnfI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/posts/chat</feedburner:origLink></entry>
 
 <entry>
   <title>Left: A Jekyll Theme</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/x4hO6qxwuwM/left" />
   <updated>2012-12-11T00:00:00-08:00</updated>
   <id>http://zachholman.com/posts/left</id>
   <content type="html">&lt;p&gt;I murdered my blog today, and when I plunged my knife into its soft underside,
it bled open source.&lt;/p&gt;

&lt;h2&gt;A New Look, an Old Look&lt;/h2&gt;

&lt;p&gt;After redesigning zachholman.com, I realized I still wanted a nice foundation
on which others could build their own
&lt;a href="https://github.com/mojombo/jekyll"&gt;Jekyll&lt;/a&gt; blogs. Jekyll&amp;#39;s a lot of fun to
use, but it can be a bit of a pain to set up. Today I&amp;#39;m open sourcing
&lt;a href="https://github.com/holman/left"&gt;holman/left&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cl.ly/image/3S2r1p2C0E2B/content" alt="Left Screenshot"&gt;&lt;/p&gt;

&lt;p&gt;Left is the previous theme I had for zachholman.com: left-aligned, white-and-
black, and simple. It features the font I helped popularize:
&lt;a href="http://www.yanone.de/typedesign/kaffeesatz/"&gt;Yanone Kaffeesatz&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Left is what I half-assed previously: it has clear directions for
setting it up yourself, it removes lovely paid-for icon fonts from
&lt;a href="http://symbolset.com"&gt;Symbolset&lt;/a&gt; that I felt funny putting in a public repo
since that company is so cool, and it&amp;#39;s fully MIT licensed without any silly
attribution caveats.&lt;/p&gt;

&lt;p&gt;Enjoy Left, and go forth and &lt;a href="http://tom.preston-werner.com/2008/11/17/blogging-like-a-hacker.html"&gt;blog like a hacker&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/x4hO6qxwuwM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/posts/left</feedburner:origLink></entry>
 
 <entry>
   <title>Open Source Misfeasance</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/1IxRRNeMTE4/open-source-misfeasance" />
   <updated>2012-11-20T00:00:00-08:00</updated>
   <id>http://zachholman.com/talk/open-source-misfeasance</id>
   <content type="html">&lt;p&gt;DID YOU KNOW OPEN SOURCE IS A SWIMMING POOL FILLED WITH MILK SHAKES AND A
WALRUS. Seriously it&amp;#39;s amazing. I don&amp;#39;t think people realize how amazing open
source can be for your life, for your salary, and your company.&lt;/p&gt;

&lt;p&gt;Life shouldn&amp;#39;t be all about Linux device drivers and suicidal key value stores; build silly things. With a little spit-shining and a lot of dumb ideas, we can all grow to become the Notorious B.I.G. of open source. (Minus the guns, drugs, and eventual murder. Unless that&amp;#39;s what you&amp;#39;re into, I mean.)&lt;/p&gt;

&lt;h3&gt;Slides&lt;/h3&gt;

&lt;script async class="speakerdeck-embed" data-id="f45b665015820130009522000a1e9b2a"
  data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"&gt;&lt;/script&gt;

&lt;h3&gt;Video&lt;/h3&gt;

&lt;iframe width="750" height="422" src="https://www.youtube.com/embed/Lee7NJjSyPE" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/1IxRRNeMTE4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/talk/open-source-misfeasance</feedburner:origLink></entry>
 
 <entry>
   <title>The Product is the Byproduct</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/9m-zKmyhHiw/product-is-the-byproduct" />
   <updated>2012-10-12T00:00:00-07:00</updated>
   <id>http://zachholman.com/talk/product-is-the-byproduct</id>
   <content type="html">&lt;p&gt;People in Silicon Valley perpetuate this idea that if you&amp;#39;re
smart enough, have an amazing vision, and keep pushing at it, then you&amp;#39;ll end
up with a great product. Take a look at startup success stories, though: a ton
of them succeeded in &lt;em&gt;spite&lt;/em&gt; of their original vision. A great product
is closer to an accident. It&amp;#39;s the byproduct of the environment you build at
your company. This environment may actually be harder to build than the
product itself, but you&amp;#39;ll be left with a better everything by the end of it.&lt;/p&gt;

&lt;h3&gt;Slides&lt;/h3&gt;

&lt;script async class="speakerdeck-embed" data-id="50782d6c1d371f000204c59a"
    data-ratio="1.7777777777777777"
    src="//speakerdeck.com/assets/embed.js"&gt;&lt;/script&gt;

&lt;h3&gt;Video&lt;/h3&gt;

&lt;iframe width="750" height="422" src="http://www.youtube.com/embed/_SCarNW0Vc4" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/9m-zKmyhHiw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/talk/product-is-the-byproduct</feedburner:origLink></entry>
 
 <entry>
   <title>Abusing Emoji in iOS and Your Mac &#x1f451;&#x1f4a9;</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/AQhlMJwfBV0/abusing-emoji" />
   <updated>2012-09-20T00:00:00-07:00</updated>
   <id>http://zachholman.com/posts/abusing-emoji</id>
   <content type="html">&lt;p&gt;Like most fourteen-year-old Japanese schoolchildren, my social circle in
Silicon Valley has embraced the usage of emoji, a subset of Unicode that uses
pretty pictures as letters.&lt;/p&gt;

&lt;p&gt;You can easily tell a story with emoji:&lt;/p&gt;

&lt;p style="text-align: center"&gt;&#x1f385; &#x1f680; &#x1f46c; &#x1f41f; &#x1f355; &#x1f3e9; &#x1f3a5; &#x1f3a7; &#x1f349; &#x1f6b2; &#x1f413; &#x1f648;&lt;/p&gt;

&lt;p&gt;For example, this string of emoji means &amp;quot;Let&amp;#39;s go meet at Chipotle and build a
nuclear fallout shelter out of pinto beans and discarded burritos&amp;quot;. See? Emoji
is efficient.&lt;/p&gt;

&lt;p&gt;Apple&amp;#39;s support for emoji in the last few years has been admirable. You can
add an emoji keyboard to your iPhone or iPad by tapping through &lt;strong&gt;Settings ➡
About ➡ General ➡ International ➡ Keyboards ➡ Add New Keyboard...&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;On OS X Lion or Mountain Lion, just hit &lt;code&gt;option + command + T&lt;/code&gt; in most text
boxes and text areas and you&amp;#39;ll be able to drag and drop from the character
viewer.&lt;/p&gt;

&lt;p&gt;Naturally the next step is to see how far we can take this.&lt;/p&gt;

&lt;h2&gt;Your computer&amp;#39;s name and hostname&lt;/h2&gt;

&lt;p&gt;I don&amp;#39;t know about you, but my computer is a dick. It keeps not doing all of
my work for me. What a piece of shit.&lt;/p&gt;

&lt;p&gt;So what better way to show our affection to your hunk of metal than to rename
it as a literal steamy pile of shit? &#x1f4a9;&lt;/p&gt;

&lt;p&gt;In the &amp;quot;Sharing&amp;quot; preference pane, you can set the computer name of your
machine. Let&amp;#39;s set it to a piece of poo:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cl.ly/image/0E0o42160W26/content" alt="poo"&gt;&lt;/p&gt;

&lt;p&gt;If you have File Sharing turned on, your machine will proudly display its
emoji in the Finder&amp;#39;s sidebar on other OS X machines on your network:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cl.ly/image/0s262W432e2I/content" alt="share"&gt;&lt;/p&gt;

&lt;p&gt;But this is where we run into our first problem. OS X is smart enough not to
set emoji as your actual hostname; it keeps a separate internal plaintext
hostname alongside the emoji name. Unfortunately it sets that plaintext to
&lt;code&gt;Macintosh.local&lt;/code&gt;. I don&amp;#39;t know about you, but I have a hard time attracting
potential mates once they discover I have such a boring hostname. After
setting your emoji computer name, be sure to click &lt;code&gt;Edit&lt;/code&gt; and change it to
something sure to entice potential partners, like &lt;code&gt;i-smell-like-cheetos.local&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;AirPort Extreme&lt;/h2&gt;

&lt;p&gt;They say the two hardest problems in computer science are cache invalidation
and naming things, but they must not have had emoji.&lt;/p&gt;

&lt;p&gt;I have an AirPort Extreme at home, along with an AirPort Express attached to
some speakers. I decided to emoji those, too.&lt;/p&gt;

&lt;p&gt;In AirPort Utility, you can rename your router as you see fit:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cl.ly/image/0r3F1v1i2D0f/content" alt="router"&gt;&lt;/p&gt;

&lt;p&gt;You can also name your actual wifi network as emoji, too:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cl.ly/image/0S3S1L2z0z3L/content" alt="network"&gt;&lt;/p&gt;

&lt;p&gt;There&amp;#39;s some serious problems here, though:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Other clients&lt;/strong&gt;: You can use emoji names for your wifi network and it works
great if you connect to your base station with OS X Lion (and above), iPhone,
or iPad. But if you run a more diverse network you&amp;#39;re going to run into
problems. Snow Leopard and earlier, for example, renders emoji as square boxes
since the OS just didn&amp;#39;t understand emoji until Lion. Your Xbox 360 also won&amp;#39;t
render emoji, but it seems to connect just fine. It appears that Windows
clients will refuse to connect to any emoji network name at all. Might be a
feature instead of a bug, though.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Time Machine&lt;/strong&gt;: If you have a hard drive attached to your AirPort Extreme
for use with Time Machine, you shouldn&amp;#39;t name &lt;em&gt;that&lt;/em&gt; drive with emoji
characters. Your Mac will mount it correctly, but it&amp;#39;ll spin indefinitely at
the &amp;quot;preparing backup&amp;quot; phase. You&amp;#39;ll likely run into the same problem if you
instead use a Time Capsule, too.&lt;/p&gt;

&lt;h2&gt;iPhone, iPad, and iOS&lt;/h2&gt;

&lt;p&gt;In a few keystrokes you can turn your shiny, expensive Apple device into a
shiny, expensive Apple device with an emoji name. Just go into
&lt;strong&gt;Settings ➡ About ➡ Name&lt;/strong&gt; and adjust it there:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cl.ly/image/2U3W0Y41351o/content" alt="iOS rename"&gt;&lt;/p&gt;

&lt;p&gt;This&amp;#39;ll show up neatly on your iTunes sidebar:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cl.ly/image/2s1k0X2p0w0e/content" alt="iTunes Sidebar"&gt;&lt;/p&gt;

&lt;p&gt;While you&amp;#39;re there, use emoji to name your &lt;strong&gt;iTunes playlists&lt;/strong&gt;. For example,
I use &#x1f195; for the last 100 songs added to my library, and &#x1f51d; for my top 100
most-played songs.&lt;/p&gt;

&lt;p&gt;Don&amp;#39;t be stingy, now. You can use &lt;strong&gt;emoji as iOS folder names&lt;/strong&gt;, too. Here I
use a big ol&amp;#39; warning sign as a reminder to myself to avoid showing a couple
of our internal GitHub apps publicly:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cl.ly/image/382m1D2w2y3S/content" alt="iOS Folder"&gt;&lt;/p&gt;

&lt;p&gt;Wait, ignore that last bit.&lt;/p&gt;

&lt;h2&gt;Passwords&lt;/h2&gt;

&lt;p&gt;Turns out, you can use emoji as your OS X user password. It&amp;#39;s probably not a
good idea, but then entire civilizations have been built on bad ideas before.
Oddly enough, if you drag emoji into the password box, a single emoji shows up
as two characters:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cl.ly/image/003Z061t251c/content" alt="Passwords"&gt;&lt;/p&gt;

&lt;p&gt;You can&amp;#39;t bring up the character palette at the password prompt, though, and
you can&amp;#39;t paste from the clipboard, so you&amp;#39;d never be able to log into the
account. In other words, it&amp;#39;s perfect security.&lt;/p&gt;

&lt;h2&gt;OS X Home Directory&lt;/h2&gt;

&lt;p&gt;Sure, this can&amp;#39;t go wrong.&lt;/p&gt;

&lt;p&gt;Let&amp;#39;s create a new user:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cl.ly/image/2U1M2l052D1H/content" alt="create"&gt;&lt;/p&gt;

&lt;p&gt;By this point, OS X has figured out what you&amp;#39;re up to and probably thinks
you&amp;#39;re a moron, so it stops you. You can&amp;#39;t drag or copy and paste emoji into
the &amp;quot;Account Name&amp;quot; box, so there&amp;#39;s no way to create a home directory with
non-legal characters.&lt;/p&gt;

&lt;p&gt;Time to force the issue. After you create a user with a vanilla account name,
you can right click it on the sidebar and select &amp;quot;Advanced Options&amp;quot;. From
here, OS X is apparently cool with emoji:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cl.ly/image/3s3j3Q2g0Z0t/content" alt="explicit"&gt;&lt;/p&gt;

&lt;p&gt;I chose a dress shirt with a nice necktie (&#x1f454;). No one suspects the
mild-mannered office worker.&lt;/p&gt;

&lt;p&gt;Surprisingly enough, OS X takes one look at that respectable necktie and says
&amp;quot;YEAH SURE LOOKS GOOD TO ME! IS THAT A FULL WINDSOR???&amp;quot;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cl.ly/image/01432r1g032x/content" alt="confirm"&gt;&lt;/p&gt;

&lt;p&gt;Click OK, because this is certainly something that can&amp;#39;t go wrong.&lt;/p&gt;

&lt;p&gt;At this point OS X chugs along and creates the user. Log out, switch users,
and behold, the most beautiful sight these eyes have ever seen: emoji in your
menu bar.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cl.ly/image/1B1y2B0C1g0X/content" alt="Menu Bar, somehow"&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ls&lt;/code&gt; has some issues with emoji files, but bash seems to handle things
okay-ish (and note that Terminal.app supports emoji, which is new in Mountain
Lion):&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cl.ly/image/0n2k071n3R2o/content" alt="Terminal"&gt;&lt;/p&gt;

&lt;p&gt;Finder, in contrast, seems not to care one bit:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cl.ly/image/3d3N0m0l1D04/content" alt="Finder"&gt;&lt;/p&gt;

&lt;p&gt;After playing around with it for a bit, it looks like OS X handled it like a
champ. Nothing overtly crashed, no processes were amuck in Activity Monitor. I
recommend all serious technologists move their home directory at their
earliest convenience.&lt;/p&gt;

&lt;h2&gt;&#x1f38a;&#x1f388; HOORAY &#x1f381;&#x1f389;&lt;/h2&gt;

&lt;p&gt;I really hope with this newfound knowledge that you now feel  confident enough
to go venture out into the world and accomplish nothing of value.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/AQhlMJwfBV0" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/posts/abusing-emoji</feedburner:origLink></entry>
 
 <entry>
   <title>Unsucking Your Team's Development Environment</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/YPk_1nAbt34/unsucking-your-teams-development-environment" />
   <updated>2012-09-14T00:00:00-07:00</updated>
   <id>http://zachholman.com/talk/unsucking-your-teams-development-environment</id>
   <content type="html">&lt;p&gt;Success can bring many glamorous changes to your company: hiring more
employees, getting free coffee, and giving everyone a private jet filled with
cash and endangered African predatory cats.&lt;/p&gt;

&lt;p&gt;Success can lead to less-glamorous problems, though. As you grow, your team&amp;#39;s
development environment becomes really important. How long does it take to
clone, set up, and boot your apps? Can your employees still be productive on
an aging codebase? How can you automate CI, hooks, and other setup for new
projects? Is any of this fun anymore?&lt;/p&gt;

&lt;p&gt;GitHub ran into these problems as we expanded our team tremendously over the
last two years. Let&amp;#39;s look at some of the ways we&amp;#39;ve improved our employees&amp;#39;
development environments.&lt;/p&gt;

&lt;h3&gt;Slides&lt;/h3&gt;

&lt;script async class="speakerdeck-embed" data-id="505376778282a900020560da" data-ratio="1.3333333333333333"
    src="//speakerdeck.com/assets/embed.js"&gt;&lt;/script&gt;

&lt;h3&gt;Video&lt;/h3&gt;

&lt;iframe width="750" height="422" src="http://www.youtube.com/embed/Xa8r2xcK1e4" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/YPk_1nAbt34" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/talk/unsucking-your-teams-development-environment</feedburner:origLink></entry>
 
 <entry>
   <title>How to Build a GitHub</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/5PGLvTgq-Mo/how-to-build-a-github" />
   <updated>2012-08-06T00:00:00-07:00</updated>
   <id>http://zachholman.com/talk/how-to-build-a-github</id>
   <content type="html">&lt;p&gt;GitHub&amp;#39;s been through a lot of growth the past five years. Expanding to two
million users and almost seven million repositories can push the limits of how
we interact with a tool like Git (which wasn&amp;#39;t at all designed to work at
scale like this).&lt;/p&gt;

&lt;p&gt;This talk is about the systems we&amp;#39;ve built to handle that growth. Starting
from a &lt;b&gt;local&lt;/b&gt; Git architecture, migrating to a  &lt;b&gt;networked&lt;/b&gt; backend
setup, then optimizing our disk usage with &lt;b&gt;net-shard&lt;/b&gt;, and finally I
talk about our newest addition, &lt;b&gt;GitRPC&lt;/b&gt;, which we haven&amp;#39;t talked
publicly about until now.&lt;/p&gt;

&lt;p&gt;This talk also covers the human side of things. We&amp;#39;ve gained &lt;b&gt;100+
employees&lt;/b&gt; in two years and &lt;b&gt;we&amp;#39;ve never had anyone quit&lt;/b&gt;. That won&amp;#39;t
last forever, but I think it&amp;#39;s a good indication of the type of company we&amp;#39;ve
built. There are certain things you can do to retain employees, and by
worrying about employee happiness you&amp;#39;ll ultimately create a much better
product.&lt;/p&gt;

&lt;h3&gt;Slides&lt;/h3&gt;

&lt;script async class="speakerdeck-embed" data-id="50201aab215173000200213d" data-ratio="1.3333333333333333"
        src="//speakerdeck.com/assets/embed.js"&gt;&lt;/script&gt;
  

&lt;h3&gt;Slides with Audio&lt;/h3&gt;

&lt;iframe src="http://player.vimeo.com/video/47017314?badge=0" width="750" height="563" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen&gt;&lt;/iframe&gt;

&lt;h3&gt;Video&lt;/h3&gt;

&lt;p&gt;Coming soon.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/5PGLvTgq-Mo" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/talk/how-to-build-a-github</feedburner:origLink></entry>
 
 <entry>
   <title>How to Screencast Your Talk</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/7leCG4n_GAI/how-to-screencast-your-talk" />
   <updated>2012-06-21T00:00:00-07:00</updated>
   <id>http://zachholman.com/posts/how-to-screencast-your-talk</id>
   <content type="html">&lt;p&gt;So you&amp;#39;re nervously up on stage in front of hundreds of strangers about to give
a talk, sweating profusely, petrified that you might get your own name wrong.&lt;/p&gt;

&lt;p&gt;SOUNDS LIKE A GOOD TIME TO RECORD YOUR WEAKNESS AND UNCERTAINTY!&lt;/p&gt;

&lt;p&gt;After my &lt;a href="http://zachholman.com/posts/what-they-dont-tell-you-about-public-speaking/"&gt;What They Don&amp;#39;t Tell You About Public Speaking&lt;/a&gt; post made the rounds this week, I got a number of questions asking
about how I record the audio and slide transitions of my talks.&lt;/p&gt;

&lt;h2&gt;QuickTime on OS X&lt;/h2&gt;

&lt;p&gt;There&amp;#39;s a million ways to do this. Keynote, for example, has a recording
function built directly into presenter mode, although it&amp;#39;s difficult to tweak
and to export. Beyond that, there&amp;#39;s a million different apps you can use to do
this, too. I try to stay as simple as possible: on my Mac, I just use
QuickTime&amp;#39;s &lt;em&gt;Screen Recording&lt;/em&gt; feature.&lt;/p&gt;

&lt;p&gt;Either before a talk on-stage or at home practicing my slides, running a quick
screen recording session is pretty simple. Start a new Screen Recording:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cl.ly/16413P1u0s0b1m3k1i1Z/content" alt="Screen Recording"&gt;&lt;/p&gt;

&lt;p&gt;...then hit record:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cl.ly/301V370n2G12360V0A0s/content" alt="Record"&gt;&lt;/p&gt;

&lt;p&gt;If you&amp;#39;re on stage and on a projector, the trick is to get QuickTime to record
your &lt;em&gt;projected slides&lt;/em&gt; rather than your presenter display. Luckily, QuickTime
makes it really easy. Before you start your slideshow, hit record, then mouse
over to the other screen (in other words, the projector). It&amp;#39;ll dim the screen
and inform you:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cl.ly/3w2K2e3d0d3r2s2Y1X0f/content" alt="Click to Record"&gt;&lt;/p&gt;

&lt;p&gt;Click it, then you&amp;#39;re off to the races. It&amp;#39;ll record your voice on your internal
microphone (surprisingly well, too), and as you flip through your slides it&amp;#39;ll
retain all the transitions and little details you can&amp;#39;t get from viewing slides
online.&lt;/p&gt;

&lt;h2&gt;It&amp;#39;s for you&lt;/h2&gt;

&lt;p&gt;The best thing about recording your talks is that it&amp;#39;s a great learning tool.
It&amp;#39;s cliché, but force yourself to listen to yourself. It will &lt;strong&gt;utterly change
your perspective&lt;/strong&gt;. You&amp;#39;ll hear all of the &lt;em&gt;uhhhhh&lt;/em&gt;s and &lt;em&gt;ummmmm&lt;/em&gt;s you didn&amp;#39;t
notice at the time. That&amp;#39;s good; listening to yourself talk is designed to make
you angry enough to change those habits.&lt;/p&gt;

&lt;h2&gt;It&amp;#39;s for them&lt;/h2&gt;

&lt;p&gt;As I mentioned previously, your mileage may vary when it comes to conference
videos of your talks. Half of conferences won&amp;#39;t film you, and the other half may
take months to publish all their talks while organizers take a well-deserved
breather post-conference.&lt;/p&gt;

&lt;p&gt;So think about recording your own talk so you can post it on your site
immediately after your talk. If you&amp;#39;ve wowed someone in the room, they&amp;#39;ll be
able to share the experience of your talk to their friends as soon as possible.&lt;/p&gt;

&lt;p&gt;I use &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt; for &lt;a href="https://vimeo.com/holman"&gt;my screencasts and talks&lt;/a&gt;
because they&amp;#39;re a swell company.&lt;/p&gt;

&lt;h2&gt;It&amp;#39;s mostly for me&lt;/h2&gt;

&lt;p&gt;Slides are great, but audio and video is better. Record your talks,
because I want to see and learn from them. I&amp;#39;m totally selfish like that.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/7leCG4n_GAI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/posts/how-to-screencast-your-talk</feedburner:origLink></entry>
 
 <entry>
   <title>What They Don't Tell You About Public Speaking</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/j30TiPgNyd8/what-they-dont-tell-you-about-public-speaking" />
   <updated>2012-06-19T00:00:00-07:00</updated>
   <id>http://zachholman.com/posts/what-they-dont-tell-you-about-public-speaking</id>
   <content type="html">&lt;p&gt;Looking back on a year of speaking at conferences, I&amp;#39;m rather flabbergasted that
I managed to make it without my pants falling off mid-sentence or my laptop
exploding in a fireball of self-doubt and international power cords.&lt;/p&gt;

&lt;p&gt;I&amp;#39;d read all the blog posts and heard all of the advice: slow down, speak
loudly, tell a story. But goddamn, no one told me I&amp;#39;d have to put my laptop down
on the ground twenty feet away behind a couch because that&amp;#39;s the only place the
projector&amp;#39;s VGA cable would reach.&lt;/p&gt;

&lt;p&gt;Turns out there&amp;#39;s all this other stuff to worry about, too!&lt;/p&gt;

&lt;h2&gt;The room isn&amp;#39;t your audience&lt;/h2&gt;

&lt;p&gt;When you&amp;#39;re on stage in front of a few hundred people, your brain is screaming
at you &lt;strong&gt;DON&amp;#39;T SCREW UP IN FRONT OF ALL THESE PEOPLE&lt;/strong&gt;. But these people aren&amp;#39;t
your main audience.&lt;/p&gt;

&lt;p&gt;Run the numbers: most technology talks are in front of 50-300 people. That&amp;#39;s
your most important audience; after all, they came to listen to &lt;em&gt;you&lt;/em&gt;. But if
you post your talk online afterwards, you could reach thousands more. It&amp;#39;s a
different audience. You can choose to ignore this audience completely, or you
can choose to embrace them.&lt;/p&gt;

&lt;p&gt;Most conferences are a crap shoot when it comes to video. Half the time they
won&amp;#39;t record your talk, and the other half of the time it may take months before
your talk is published.&lt;/p&gt;

&lt;p&gt;Something I&amp;#39;ve been &lt;a href="http://zachholman.com/talk/git-github-secrets"&gt;doing&lt;/a&gt;
&lt;a href="http://zachholman.com/posts/how-github-works/"&gt;recently&lt;/a&gt; is making a screen
recording of my talks using QuickTime on my Mac. It&amp;#39;ll record both my voice and
my slides as I flip through them. It&amp;#39;s a much better experience than just
posting contextless slides.&lt;/p&gt;

&lt;h2&gt;Last-minute prep&lt;/h2&gt;

&lt;p&gt;There are a number of things you&amp;#39;ll want to take care of before jumping into
your talk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Silence your phone&lt;/strong&gt;. That means airplane mode or non-vibrate mode. You&amp;#39;ll
(hopefully) be getting tweets or emails mentioning you during your talk; trust
me, feeling your pants vibrate will wreck your concentration.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Crank up your screen brightness&lt;/strong&gt;. You don&amp;#39;t want to be fighting to read
your notes. You should be plugged in, anyway, so don&amp;#39;t worry about draining your
battery.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rearrange your presenter display&lt;/strong&gt;. Rather than just mirror your slides, you
should be using a separate presenter display that shows your slide, your next
slide, a timer, your notes, and anything else you&amp;#39;d like to have up on-screen.
If you use Keynote, you can &lt;a href="http://www.apple.com/findouthow/iwork/#keynote09-customizepresenter"&gt;customize this screen&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Ground your talk in reality&lt;/h2&gt;

&lt;p&gt;I&amp;#39;ve done one or two talks that I thought were great ideas initially: projects
that weren&amp;#39;t finished yet, things that I thought would be interesting to talk
about, and so on. They&amp;#39;re talks I regret. Talks should always be &lt;em&gt;reactionary&lt;/em&gt;
rather than &lt;em&gt;anticipatory&lt;/em&gt;: they&amp;#39;re going to come off as more natural, more
interesting, and above all, more valuable.&lt;/p&gt;

&lt;p&gt;Think about writing a detailed blog post before you speak on any subject. That
way you&amp;#39;ll know your comfort level with the information, and, more importantly,
you can gauge the reaction of everyone else. Is it interesting? Are you wrong?
Does anyone care?&lt;/p&gt;

&lt;h2&gt;Your talk gets interesting when it&amp;#39;s over&lt;/h2&gt;

&lt;p&gt;My favorite part about talks are the questions afterwards (if your conference
allows it). Don&amp;#39;t shy away from them. They&amp;#39;re a great barometer of how well you
know your material, and, most importantly, whether your audience &amp;quot;got it&amp;quot;. If
you plan on giving your talk again, take special note of what happens in the
question-and-answer section. It&amp;#39;s a goldmine for improving and changing your
talk for the next time through.&lt;/p&gt;

&lt;h2&gt;Be excited&lt;/h2&gt;

&lt;p&gt;There&amp;#39;s one mistake I consistently see made by speakers both novice and
experienced: they&amp;#39;re not &lt;em&gt;excited&lt;/em&gt; about their talk. Changing this one thing
will completely, utterly change the perception of your talk for the better.&lt;/p&gt;

&lt;p&gt;You&amp;#39;re on stage, ostensibly talking about something that interests you or makes
your life better or saves you time. &lt;strong&gt;Be fucking excited about that&lt;/strong&gt;. Let your
enthusiasm bleed through. People absolutely react to emotion. The opposite is
just as true: a passive voice on-stage will lead to a passive response by your
audience.&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;These are some of the many things I&amp;#39;ve picked up on while giving talks, but it&amp;#39;s
certainly not a comprehensive list. Public speaking&amp;#39;s all about thinking on your
feet, of reading people. Like everything else, it all gets better with practice.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/j30TiPgNyd8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/posts/what-they-dont-tell-you-about-public-speaking</feedburner:origLink></entry>
 
 <entry>
   <title>Git and GitHub Secrets</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/QRZ2gqWufqo/git-github-secrets" />
   <updated>2012-05-22T00:00:00-07:00</updated>
   <id>http://zachholman.com/talk/git-github-secrets</id>
   <content type="html">&lt;p&gt;We tuck a lot of features away on github.com.&lt;/p&gt;

&lt;p&gt;Sometimes the UI just hasn&amp;#39;t been fleshed out. Or we have bigger plans in mind
for the feature in the future. Or it just hasn&amp;#39;t been finished yet. But we
still want to give you the flexibility of using that feature today.&lt;/p&gt;

&lt;p&gt;The same can be said about Git. If you&amp;#39;ve ever looked at the manpages, there&amp;#39;s
feature after feature and option after option in its binaries. Part of the
strength of Git and GitHub is having access to those features when you need
them, and getting them out of your way when you don&amp;#39;t.&lt;/p&gt;

&lt;p&gt;This talk covers both Git and GitHub: different tricks I&amp;#39;ve picked up after
two years at GitHub, helpful advice on common gripes I&amp;#39;ve seen in support
tickets and tweets, and just general nifty things that make you a faster, more
capable technologist.&lt;/p&gt;

&lt;p&gt;&lt;span style="font-size: 12px"&gt;Photo credit: &lt;a href="http://www.sheilamenezes.com"&gt;Sheila Menezes&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;

&lt;h3&gt;Video&lt;/h3&gt;

&lt;iframe width="750" height="422" src="http://www.youtube.com/embed/NFlViYmyADc?rel=0" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;

&lt;h3&gt;Slides&lt;/h3&gt;

&lt;script async class="speakerdeck-embed" data-id="4fbb466115a68f0022014f77" data-ratio="1.3333333333333333"
  src="//speakerdeck.com/assets/embed.js"&gt;&lt;/script&gt;

&lt;p&gt;&lt;/div&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/QRZ2gqWufqo" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/talk/git-github-secrets</feedburner:origLink></entry>
 
 <entry>
   <title>How to Survive Tech Conferences</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/Pk_gFU3v65s/how-to-survive-tech-conferences" />
   <updated>2012-04-27T00:00:00-07:00</updated>
   <id>http://zachholman.com/posts/how-to-survive-tech-conferences</id>
   <content type="html">&lt;p&gt;&lt;img src="http://cl.ly/0r0P1F3f0d2c3L2s2J0f/badges.jpg" alt="badges"&gt;&lt;/p&gt;

&lt;p&gt;For a large part of the last year of my life I&amp;#39;ve had the good fortune of being
able to speak and attend a number of technology conferences. Big, small,
corporate, indie, local, international... conferences come in so many delightful
forms.&lt;/p&gt;

&lt;p&gt;Conferences can be a lot of fun, but they can also be mentally and physically
exhausting. Here&amp;#39;s what I&amp;#39;ve learned.&lt;/p&gt;

&lt;h2&gt;Connect with a local&lt;/h2&gt;

&lt;p&gt;Some people you meet are going to be special.&lt;/p&gt;

&lt;p&gt;Every now and then I attend an event that transitions from interesting to
memorable. It tends to be locals who show you the way. Embrace the unplanned.
Instead of going to bed early, think about taking someone up on their offer to
go a town over to a hidden absinthe bar where everyone wears goofy hats. Or take
a day trip to pet some cheetahs in the surrounding wine country. Or go back to
someone&amp;#39;s home and play Rock Band with twenty new friends. These are the
memories that stick with me, and I experienced them only because locals took it
upon themselves to show off their area.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Look for open, friendly people&lt;/strong&gt;. They&amp;#39;re everywhere. They know the best tips,
and they are likely eager to tell you and show you their city.&lt;/p&gt;

&lt;p&gt;The reverse holds true, too. If you&amp;#39;re playing host in your city, pay it
forward. It&amp;#39;s your city. Show it off. Attendees are traveling for a reason, and
more often than not, showing them your favorite place in the city would thrill
them, too.&lt;/p&gt;

&lt;h2&gt;Take photos&lt;/h2&gt;

&lt;p&gt;&lt;img src="http://cl.ly/2k0P0A1H210z0M3c3M28/london.png" alt="London"&gt;&lt;/p&gt;

&lt;p&gt;I don&amp;#39;t typically check into Foursquare or anything like that, but I do try to
take a lot of photos. They tell a story and help me relive specifics of the trip.&lt;/p&gt;

&lt;p&gt;I try to &lt;strong&gt;geotag every photo&lt;/strong&gt;. When you&amp;#39;re traveling somewhere different —
particularly in a foreign country — it becomes really difficult to relate all of
different locations you visited to each other, particularly if you&amp;#39;re taking
cabs or public transportation. Geotagging photos gives you a very visual way of
piecing together your journey when you load them into iPhoto or Aperture later.&lt;/p&gt;

&lt;p&gt;If you&amp;#39;re overseas, usually you don&amp;#39;t have a full data plan on your phone 24/7,
but if you switch off of airplane mode it&amp;#39;ll still pick up the GPS coordinates
and geotag any photos you take.&lt;/p&gt;

&lt;p&gt;If you&amp;#39;re like me and like taking your DSLR out for some shots, it&amp;#39;s a pain to
go back and geotag those manually. There&amp;#39;s a few solutions, but the best one
I&amp;#39;ve found is &lt;a href="http://gps4cam.com"&gt;gps4cam&lt;/a&gt;. Before you start shooting, press
the button on your phone to start, and then it&amp;#39;ll record your GPS positioning
every minute or so. When you&amp;#39;re done, click finish, and then take a picture of
the QR code on your phone. That syncs up the clock on your camera to the clock
on your phone so it knows where you were when you took those photos. Then, load
your photos on your Mac, run the simple gps4cam sister app, and it&amp;#39;ll go through
all of your photos, geotag them and timesync them to the correct time from your
phone. It&amp;#39;s kind of like magic.&lt;/p&gt;

&lt;h2&gt;Get connected&lt;/h2&gt;

&lt;p&gt;Traveling is sometimes just one long quest to find good wifi, especially if
you&amp;#39;re not on your home mobile network. And, let me give you a hint:
&lt;strong&gt;conference wifi almost always sucks&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You can buy a SIM card for most phones, but I&amp;#39;ve found that to be a bit of a
pain, for a lot of reasons (the need to swap out SIM cards, and weird edge cases
like iMessage getting confused as to which number it&amp;#39;s on). If you&amp;#39;re going to
be traveling a lot, I&amp;#39;d suggest looking into getting an unlocked mifi. It&amp;#39;s
basically internet-in-a-box: buy a quick 1GB or 2GB data plan SIM card when you
arrive in the city, toss it in, and you have wifi for up to five devices. It
also means you can make four new friends if they desperately need connectivity,
too.&lt;/p&gt;

&lt;p&gt;I picked my mifi up from Amazon unlocked for a hundred bucks and change.&lt;/p&gt;

&lt;h2&gt;See the talks&lt;/h2&gt;

&lt;p&gt;The common rally cry is that conferences are worthless and that you really go
only to network and socialize. I think that&amp;#39;s shortsighted. I&amp;#39;ve been surprised
by talks in the past. Try to find talks about libraries or languages you haven&amp;#39;t
been exposed to. Even if you don&amp;#39;t understand all of the material, you likely
will come up with some interesting comparisons to your own world view.&lt;/p&gt;

&lt;p&gt;If you&amp;#39;re planning on giving your first talk in the future, pay attention to the
flip side of talks: what do you like about the speaker? Are you bored? Why are
you bored? What would you change? It&amp;#39;s pretty easy to drift into passive mode,
where you&amp;#39;ll miss these important questions, so take some time to consciously
think about these things.&lt;/p&gt;

&lt;h2&gt;Monitor&lt;/h2&gt;

&lt;p&gt;Another not-so-secret secret is the conference backchannel. Every conference I
go to I&amp;#39;ll add the conference hashtag as a saved search in
&lt;a href="http://fanzter.com/products/summizer"&gt;Summizer&lt;/a&gt; so that I can always see the
new tweets about what&amp;#39;s going on. It lets you keep track of the conference
pulse, which is helpful for conversation topics later on: &amp;quot;Were you at her talk?
It was hilarious!&amp;quot;, &amp;quot;What do you think about the drama about the sponsor&amp;#39;s
booth?&amp;quot;, and so on.&lt;/p&gt;

&lt;p&gt;You&amp;#39;ll also be able to see what people are doing after the conference- don&amp;#39;t be
afraid to ping new people and see if they wouldn&amp;#39;t mind another joining in. If
they&amp;#39;re tweeting about it, they&amp;#39;re probably happy to meet you, too.&lt;/p&gt;

&lt;h2&gt;Reconnect&lt;/h2&gt;

&lt;p&gt;The most lasting part of a conference is reconnecting with new friends after the
conference is over. Our industry is not that large, particularly if you&amp;#39;re in a
smaller community centered around a language or framework. The people you meet
today will have a tendency to show up at the conference later this year halfway
across the world. It will be a welcome sight to see familiar faces, and they&amp;#39;ll
be able to introduce you to new people, too.&lt;/p&gt;

&lt;p&gt;Don&amp;#39;t be afraid to follow people on Twitter or GitHub during a conference and
keep the lines of communication open. Sometimes it doesn&amp;#39;t take much to maintain
lasting friendships in situations like these... just a quick &amp;quot;hi&amp;quot; now and then.&lt;/p&gt;

&lt;h2&gt;Carry on&lt;/h2&gt;

&lt;p&gt;Conferences can be professionally enlightening, and, more importantly, fun. Go
and make the most of them. And if you see me, say hi. We&amp;#39;ll talk about the
conference wifi together.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/Pk_gFU3v65s" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/posts/how-to-survive-tech-conferences</feedburner:origLink></entry>
 
 <entry>
   <title>Aggressively Probing Ruby Projects</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/DoS2B9S4qt8/aggressively-probing-ruby-projects" />
   <updated>2012-04-19T00:00:00-07:00</updated>
   <id>http://zachholman.com/talk/aggressively-probing-ruby-projects</id>
   <content type="html">&lt;h2&gt;A Ruby Code Analysis Project&lt;/h2&gt;

&lt;p&gt;I just gave a talk in Kraków at &lt;a href="http://railsberry.com"&gt;Railsberry&lt;/a&gt;
where I announced &lt;a href="https://github.com/holman/hopper"&gt;Hopper&lt;/a&gt;, an
open source Ruby code analysis project.&lt;/p&gt;&lt;/p&gt;

&lt;h3&gt;Hopper&lt;/h3&gt;

&lt;p&gt;Hopper is a Sinatra app designed to pull down tens of thousands of Ruby
projects from GitHub, snapshot each repository into ten equidistant revisions,
run them through a battery of tests (which we call Probes), and hopefully come
up with some deeply moving insights about how we write Ruby.&lt;/p&gt;

&lt;h3&gt;Codestat&lt;/h3&gt;

&lt;p&gt;Codestat is the live version of Hopper. It&amp;#39;s available at &lt;a href="http://codestat.us"&gt;codestat.us&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;The Future&lt;/h3&gt;

&lt;p&gt;Codestat is a bit of a work-in-progress. It&amp;#39;s running on an underpowered
instance, and I&amp;#39;m pretty sure I might be blowing out the database from time to
time as we settle on what makes sense to model all the data.&lt;/p&gt;

&lt;p&gt;Hopper is one big experiment. I think where it is today is a long throw away
from where it could be tomorrow. I welcome your thoughts, issues, and Pull
Requests as we build something nifty together.&lt;/p&gt;

&lt;h3&gt;Slides&lt;/h3&gt;

&lt;script async class="speakerdeck-embed" data-id="4f8fdb2ba54208002201055e"
  data-ratio="1.3333333333333333" src="//speakerdeck.com/assets/embed.js"&gt;&lt;/script&gt;

&lt;h3&gt;Video&lt;/h3&gt;

&lt;iframe width="750" height="422" src="http://www.youtube.com/embed/7GStXCabFXw" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/DoS2B9S4qt8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/talk/aggressively-probing-ruby-projects</feedburner:origLink></entry>
 
 <entry>
   <title>Ruby Patterns from GitHub's Codebase</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/bkpckUsCpQs/ruby-patterns" />
   <updated>2012-02-29T00:00:00-08:00</updated>
   <id>http://zachholman.com/talk/ruby-patterns</id>
   <content type="html">&lt;p&gt;There are a few specific things we&amp;#39;ve done at GitHub to help our
maintainability and reliability of our Ruby apps. Focusing on improving
documentation, optimizing the first-run experience, splitting out our API as
Sinatra apps, and being careful about how we ship impacting infrastructure
changes has helped us out dramatically.&lt;/p&gt;

&lt;h3&gt;Slides&lt;/h3&gt;

&lt;script src="http://speakerdeck.com/embed/4f4e9f3260be14002200073e.js"&gt;&lt;/script&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/bkpckUsCpQs" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/talk/ruby-patterns</feedburner:origLink></entry>
 
 <entry>
   <title>Word of Mouth</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/7aASnlcW6uQ/word-of-mouth" />
   <updated>2012-02-25T00:00:00-08:00</updated>
   <id>http://zachholman.com/talk/word-of-mouth</id>
   <content type="html">&lt;p&gt;Word of mouth is not just about adding a Facebook &amp;quot;Like&amp;quot; button to your site.
How people talk about your product is entirely defined by how you build that
product.&lt;/p&gt;

&lt;h3&gt;Slides&lt;/h3&gt;

&lt;script src="http://speakerdeck.com/embed/4f4919a408476d07de006106.js"&gt;&lt;/script&gt;

&lt;h3&gt;Video&lt;/h3&gt;

&lt;iframe width="750" height="422" src="http://cdn.livestream.com/embed/superconf?layout=4&amp;clip=pla_f4c14dcd-abf6-41e9-b794-b9f623160056&amp;color=0xe7e7e7&amp;autoPlay=false&amp;mute=false&amp;iconColorOver=0x888888&amp;iconColor=0x777777&amp;allowchat=true&amp;height=422&amp;width=750" style="border:0;outline:0" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/7aASnlcW6uQ" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/talk/word-of-mouth</feedburner:origLink></entry>
 
 <entry>
   <title>The Apple Voice</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/f6em1MdqZCI/the-apple-voice" />
   <updated>2012-02-02T00:00:00-08:00</updated>
   <id>http://zachholman.com/posts/the-apple-voice</id>
   <content type="html">&lt;p&gt;Most startups don&amp;#39;t have the luxury of meeting every one of their customers. They can&amp;#39;t explain the case for their product in-person.&lt;/p&gt;

&lt;p&gt;Instead, we market our product with &lt;em&gt;words&lt;/em&gt;. We craft those words with our &lt;em&gt;voice&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;The Apple Voice&lt;/h2&gt;

&lt;p&gt;Apple commands their words exceedingly well. They aren&amp;#39;t the originator — or even the owner — of their particular voice, but they are the most visible.&lt;/p&gt;

&lt;p&gt;Mechanically, The Apple Voice is characterized by short, declarative sentences that are informally and personally delivered to you with a hint of smugness.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Our most amazing iPhone yet.&lt;/em&gt; &lt;em&gt;10,000 songs in your pocket.&lt;/em&gt; &lt;em&gt;We think you&amp;#39;ll like it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For Apple, this voicing evokes two feelings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Accessibility&lt;/strong&gt;. Formal tones feel heavier and more complex. The informal tone emits a feeling of simplicity, of fewer barriers to entry. Apple wants their products to be simple.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quality&lt;/strong&gt;. Smugness is always a gamble — and you can lose that gamble — but when executed well it can set your product&amp;#39;s quality apart from the rest. Apple wants their products to be high quality.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a consumer company, those feelings are appropriate for Apple. The Apple Voice is a far cry from Oracle&amp;#39;s voice or Kaiser Permanente&amp;#39;s voice, which both target very different markets.&lt;/p&gt;

&lt;p&gt;The Apple Voice, however, has a lot of crossover to most startups.&lt;/p&gt;

&lt;h2&gt;The Apple Voice in startups&lt;/h2&gt;

&lt;p&gt;&lt;img src="http://f.cl.ly/items/1F3W3P2D1e00030I3f2b/simple.png" width="650" height="150" class="noclip" /&gt;&lt;/p&gt;

&lt;p&gt;This voice is all over. Each put their own spin on it, but companies like 37signals, Square, and Simple use similar voicing in their copy. Square and Simple both use their words to mitigate often heavy-handed financial terminology. 37signals aims to assure us that our company&amp;#39;s data is safe in their high-quality, simple product.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cl.ly/0T381H1k3a342V0V0m27/37s.png" width="650" height="150" class="noclip" /&gt;&lt;/p&gt;

&lt;p&gt;The feelings Apple targets dovetail with the feelings many startups target. It&amp;#39;s a good, complimentary voice to select for your startup.&lt;/p&gt;

&lt;h2&gt;And you &lt;em&gt;should&lt;/em&gt; select a voice&lt;/h2&gt;

&lt;p&gt;This stuff is important. You should really think through what voicing is appropriate for your company&amp;#39;s copy, for your announcements, and for your tweets. It impacts you in subtle ways. A well-written post is more likely to be tweeted and linked to. Good copy could encourage more people to buy. Comforting your customers&amp;#39; fears encourages them to remain customers.&lt;/p&gt;

&lt;p&gt;Maintaining a standard voicing is hard for even one person. As your company grows, though, it becomes &lt;em&gt;exponentially&lt;/em&gt; more difficult to maintain a consistent voice as each person contributing to your copy dilutes your initial vision.&lt;/p&gt;

&lt;h2&gt;Pick gold standards&lt;/h2&gt;

&lt;p&gt;The best way to combat this is to select &lt;em&gt;gold standards of work&lt;/em&gt;: the pieces written by your founders or executives that can stand as examples of how each employee can target their writing.&lt;/p&gt;

&lt;p&gt;Steve Jobs was — to put it lightly — a fairly controlling personality. He certainly had a lot of control over marketing copy, with the classic &amp;quot;&lt;a href="http://www.youtube.com/watch?v=tjgtLSHhTPg"&gt;Here&amp;#39;s to the Crazy Ones&lt;/a&gt;&amp;quot; ad spot edited and written in part by Jobs himself. This crossed over to product announcements, too. Take a look at the recent Apple launch of iBooks 2. As a new employee to the Keynote stage, Roger Rosner almost certainly watched a number of Jobs introductions as he &lt;a href="http://www.youtube.com/watch?v=2Yqvy0QKMxU#t=46s"&gt;fairly successfully emulated&lt;/a&gt; Steve&amp;#39;s way of demoing a new product.&lt;/p&gt;

&lt;p&gt;Tim Cook hasn&amp;#39;t yet issued any informal press releases, but when he does it wouldn&amp;#39;t be surprising to see him emulate the writing style Jobs created in the original &lt;a href="http://www.apple.com/fr/hotnews/thoughtsonmusic/"&gt;Thoughts on Music&lt;/a&gt; anti-DRM post. It&amp;#39;s an expanded form of their ad copy: informal, persuasive, and data-heavy.&lt;/p&gt;

&lt;h2&gt;GitHub&amp;#39;s gold standards&lt;/h2&gt;

&lt;p&gt;On GitHub&amp;#39;s blog, the main posts are either &lt;em&gt;technical&lt;/em&gt; or &lt;em&gt;announcement-related&lt;/em&gt;. There are two specific gold standard GitHub pieces that have directly influenced most other GitHub blog posts.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://twitter.com/mojombo"&gt;Tom Preston-Werner&lt;/a&gt;&amp;#39;s 2009 post on &lt;a href="https://github.com/blog/530-how-we-made-github-fast"&gt;How We Made GitHub Fast&lt;/a&gt; characterized GitHub&amp;#39;s technical posts. Extremely detailed and formally written, it conveys an appropriate sheen of consummate professionalism. This directly impacted how later technical posts were written, particularly in regard &lt;a href="https://github.com/blog/597-a-note-on-the-recent-outages"&gt;towards&lt;/a&gt; &lt;a href="https://github.com/blog/808-today-s-downtime"&gt;downtime&lt;/a&gt;. When the site goes down, it&amp;#39;s important to plainly state the case, explain what happened, and detail what is changing to prevent this in the future.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://twitter.com/defunkt"&gt;Chris Wanstrath&lt;/a&gt; writes great launch posts. (His CodeConf &lt;a href="https://github.com/blog/780-announcing-codeconf-2011"&gt;announcement post&lt;/a&gt;, for example, is just impressively ballsy.) He collaborated with &lt;a href="http://twitter.com/kneath"&gt;Kyle Neath&lt;/a&gt; on the post for the &lt;a href="https://github.com/blog/674-introducing-organizations"&gt;launch of Organizations&lt;/a&gt; in 2010, and that style of post led directly to the &lt;a href="https://github.com/blog/831-issues-2-0-the-next-generation"&gt;Issues 2.0 launch&lt;/a&gt; post and the &lt;a href="https://github.com/blog/978-introducing-github-enterprise"&gt;Enterprise launch&lt;/a&gt; post. Most GitHub feature launches now employ this point-by-point, graphical, partially technical writing style.&lt;/p&gt;

&lt;p&gt;GitHub encourages employees to write their feature and announcement posts themselves. As more employees are hired, these posts can be pointed towards as gold standards in order to help get everyone on the same page.&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;It&amp;#39;s important to identify your company&amp;#39;s voice. It&amp;#39;s important to decide who is in charge of different aspects of your voice, and how you can keep that voicing consistent even as you grow larger and larger.&lt;/p&gt;

&lt;p&gt;Apple does a great job, and if their perspective is relevant to your own, take a look at emulating them and putting your own spin on their voice. Consistent, clear copy helps craft your experience.&lt;/p&gt;

&lt;p&gt;So go craft one.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/f6em1MdqZCI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/posts/the-apple-voice</feedburner:origLink></entry>
 
 <entry>
   <title>Scaling GitHub</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/6iaw-Y7ZPrc/scaling-github" />
   <updated>2012-01-26T00:00:00-08:00</updated>
   <id>http://zachholman.com/talk/scaling-github</id>
   <content type="html">&lt;p&gt;A month after launching, GitHub hosted one thousand repositories. Three years
later, we host over three million. In the same time we&amp;#39;ve gone from one
thousand users to over a million.&lt;/p&gt;

&lt;p&gt;This type of scaling presents some interesting technical challenges. I&amp;#39;ll dig
into our development workflow and how we address concepts like scaling,
deployment, code review, and testing.&lt;/p&gt;

&lt;p&gt;It also presents some interesting business challenges, too. How you grow your
company from three employees, how you work in teams, and how you split your
app up into services all help ensure that you&amp;#39;ll be able to react to your
product&amp;#39;s growth.&lt;/p&gt;

&lt;h3&gt;Slides&lt;/h3&gt;

&lt;script src="http://speakerdeck.com/embed/4f214f1172b45b00220048e9.js"&gt;&lt;/script&gt;

&lt;h3&gt;References&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://git.io/jByrlQ"&gt;GitHub Blog: GitHub is Moving to Rackspace&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://git.io/p5v2Ag"&gt;GitHub Blog: How We Made GitHub Fast&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://git.io/77Onfg"&gt;GitHub Blog: Unicorn&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/github/hubot"&gt;Hubot&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/github/janky"&gt;Janky&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/holman/play"&gt;Play&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/6iaw-Y7ZPrc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/talk/scaling-github</feedburner:origLink></entry>
 
 <entry>
   <title>Women Should Do Startups</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/B0UlCczQIu8/women-should-do-startups" />
   <updated>2011-12-12T00:00:00-08:00</updated>
   <id>http://zachholman.com/posts/women-should-do-startups</id>
   <content type="html">&lt;p&gt;Yesterday Penelope Trunk wrote a guest post on TechCrunch that told us all to &amp;quot;&lt;a href="http://techcrunch.com/2011/12/11/stop-telling-women-to-do-startups"&gt;Stop Telling Women To Do Startups&lt;/a&gt;&amp;quot;.&lt;/p&gt;

&lt;p&gt;Pardon me while I do just the opposite.&lt;/p&gt;

&lt;h2&gt;Startups don&amp;#39;t need to suck&lt;/h2&gt;

&lt;p&gt;Trunk&amp;#39;s article has a lot of arguments that just aren&amp;#39;t relevant to the problem of getting more women in startups. Most of them are an indictment against startups in general, and startups simply don&amp;#39;t have to work that way.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;[Women] are complaining about the lack of jobs with flexible hours. And I don’t see anyone on TechCrunch addressing that when they address women.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I don&amp;#39;t mean to sound like a broken record, but &lt;a href="http://zachholman.com/posts/how-github-works-hours/"&gt;hours are bullshit&lt;/a&gt;. You don&amp;#39;t need to enforce 9-5 hours at a company. You don&amp;#39;t even need a full 40 hour work week. Companies like GitHub, Heroku, Square, Simple… we&amp;#39;re still in the minority, but I think it&amp;#39;s safe to say that it&amp;#39;s okay to be successful without working 90 hour weeks and forcing everyone to come in at arbitrary hours.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;But I can tell that all three times I’ve done it, raising money for a startup has been hell, so I think we should really be asking why anyone would want to try to convince someone to do it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yes! Definitely! That&amp;#39;s why I argue &amp;quot;women should join startups&amp;quot; and not &amp;quot;women should join startups and then try to raise a lot of VC money&amp;quot;. Raising VC is important for some companies, but the number of companies that need VC is plummeting each day. For web startups, we have open source frameworks, technologies, and methodologies with decades of investment thrown into them. It&amp;#39;s easier than ever to bootstrap a business.  VC doesn&amp;#39;t need to be a limiting factor anymore.&lt;/p&gt;

&lt;h2&gt;Straw men&lt;/h2&gt;

&lt;p&gt;There&amp;#39;s some crazy statements in Trunk&amp;#39;s article. Indulge me.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Whoever started the TED Women’s conference is pathetic. Which would you rather say you spoke at? TED? Or the TED Ghetto?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I&amp;#39;d be thrilled to speak at (and attend!) TEDWomen, and I think it&amp;#39;s horseshit to call it a ghetto. TED decided that the topic of women in tech is so important that they &lt;em&gt;devoted a conference to the topic&lt;/em&gt; to try to help solve issues of diversity, exposure, and to perhaps help counter close-minded guest posts on sites like TechCrunch.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The people trying to give solutions are as lame as the people pointing to a problem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pro tip: if you ever see an argument disparaging both raising awareness &lt;em&gt;and&lt;/em&gt; presenting solutions, then something is wrong with the argument.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Try that for a few years, and then tell all the other women you know, who are out-earning the men they know, or taking care of kids, to trade their life for startup life.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That&amp;#39;s an appropriate argument if everyone were money-driven. Startups do offer decent money compared to non-tech industries, but the vast majority of people I know in the industry do it out of love and passion for technology rather than money. We do it to build products, to change the world, and to have fun. If money were our motivator we would have studied asbestos case law.&lt;/p&gt;

&lt;h2&gt;Everyone should do startups&lt;/h2&gt;

&lt;p&gt;I want more &lt;strong&gt;everyone&lt;/strong&gt; — including women — to be exposed to the idea of working at a startup or founding a startup. I think it&amp;#39;s one of the best careers on earth. More than any other industry, we&amp;#39;re able to work on interesting problems, create new things, maintain flexible hours, and impact lives across the entire world minutes after we launch a product.&lt;/p&gt;

&lt;p&gt;I worry about girls and boys in middle school and high school who are turned off from our industry entirely because they&amp;#39;ve been influenced early on that programming is only for white, middle-to-upper-class, geeky boys. It&amp;#39;s important to raise visibility to everyone — especially young women — that our industry can be both fulfilling and accessible to everyone.&lt;/p&gt;

&lt;h2&gt;Women should really do startups&lt;/h2&gt;

&lt;p&gt;I think, for certain women just as much as it is for certain men, that working in a startup can be a wholly positive experience in their lives. That&amp;#39;s why we should encourage more women to join startups. But as much as that&amp;#39;s a nice, benevolent gesture, I also want this for entirely selfish reasons: I think having more women in tech will improve our products, improve our work environments, and improve our industry. Today, startups mostly have a singular (and male!) perspective. On top of that, it&amp;#39;s hard enough to find good talent lately. Hiring for tomorrow means we need to snatch up all of the killer talent that both genders can provide.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/ginatrapani"&gt;Gina Trapani&lt;/a&gt; gave &lt;a href="http://ginatrapani.org/codeconf/"&gt;a wonderful talk&lt;/a&gt; at &lt;a href="http://codeconf.com/"&gt;CodeConf&lt;/a&gt; last year about the importance of community in open source software. One aspect was diversity. If you only surround yourself with like-minded individuals, you&amp;#39;re going to end up with solutions that suit that minority. It&amp;#39;s hard to change the world that way. By adding different perspectives to your project or company, you&amp;#39;re able to position yourself to better address the needs of a broader public.&lt;/p&gt;

&lt;p&gt;I think it&amp;#39;s harmful for such a visible publication like TechCrunch to suggest we shouldn&amp;#39;t encourage women to join the startup world.&lt;/p&gt;

&lt;p&gt;I think we should &lt;em&gt;all&lt;/em&gt; be telling women to do more startups.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/B0UlCczQIu8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/posts/women-should-do-startups</feedburner:origLink></entry>
 
 <entry>
   <title>From "Hack" to "Popular Project"</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/b0yqJ_mMTU4/from-hack-to-popular-project" />
   <updated>2011-11-23T00:00:00-08:00</updated>
   <id>http://zachholman.com/posts/from-hack-to-popular-project</id>
   <content type="html">&lt;p&gt;Last Monday, I sat down to hack.&lt;/p&gt;

&lt;p&gt;After a few hours, I open sourced the code. By the end of the week, it had
1,000 watchers and 70 forks on GitHub, and 500 upvotes on Hacker News.&lt;/p&gt;

&lt;p&gt;It&amp;#39;s my favorite example of open source recently. Here&amp;#39;s why it worked.&lt;/p&gt;

&lt;h2&gt;The project&lt;/h2&gt;

&lt;p&gt;The project was &lt;a href="https://github.com/holman/spark"&gt;spark&lt;/a&gt;. It&amp;#39;s a shell script that lets you graph tiny
&lt;a href="http://en.wikipedia.org/wiki/Sparkline"&gt;sparkline&lt;/a&gt; graphs from your command line. A quick example:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;spark 0 30 55 80 33 150
▁▂▃▅▂▇
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Common ground&lt;/h2&gt;

&lt;p&gt;I wrote spark in bash shell. From the start, &lt;strong&gt;this gave me a huge audience&lt;/strong&gt;.
Shell is a &lt;a href="/posts/glue-languages"&gt;glue language&lt;/a&gt;; it cuts across disparate communities as a
common foundation that we can all use. If spark were just another Ruby script I
wrote, I&amp;#39;m fairly certain it would have been largely ignored. Requiring a
nonstandard runtime already cuts out a big chunk of the market that might not
have it installed or aren&amp;#39;t interested in digging into another environment.&lt;/p&gt;

&lt;p&gt;It&amp;#39;s fun to bring different communities together. You get exposed to very
different perspectives.&lt;/p&gt;

&lt;h2&gt;Simplicity&lt;/h2&gt;

&lt;p&gt;As a shell script, all you have to do is copy that single script into your
&lt;code&gt;$PATH&lt;/code&gt;. Done.&lt;/p&gt;

&lt;p&gt;Don&amp;#39;t underestimate simplicity as marketing. If your project is easy to try out,
you reduce the time from the initial &amp;quot;oh wow!&amp;quot; statement to the final &amp;quot;I&amp;#39;m
going to tweet/upvote/fork this&amp;quot; statement. Every minute that passes between
the two reduces the chance that someone will end up sharing your project.&lt;/p&gt;

&lt;h2&gt;Code can be fun&lt;/h2&gt;

&lt;p&gt;spark is a silly little project that took a couple hours to come up with the
idea, code, and to ship. The concept isn&amp;#39;t very difficult to wrap your head
around, and it&amp;#39;s really easy to reimplement in a higher-level language. What&amp;#39;s
more, sparklines aren&amp;#39;t complicated, scientific graphs; spark is designed to be
a &lt;em&gt;fun project&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I exploited this. From the start, my &lt;code&gt;README&lt;/code&gt; had some interesting examples:
commits by author, number of characters per line of a file, and the magnitude
of earthquakes over the last 24 hours. I added a &lt;a href="https://github.com/holman/spark/wiki/Wicked-Cool-Usage"&gt;wiki page&lt;/a&gt; to keep
track of other cool usage of spark (which includes zany things like a sparkline
of Beijing&amp;#39;s air quality).&lt;/p&gt;

&lt;p&gt;Soon after launch, I added a wiki page for &lt;a href="https://github.com/holman/spark/wiki/Alternative-Implementations"&gt;alternative implementations&lt;/a&gt;,
too. Very quickly a small community arose, with some awesome results:
implementations in Ruby, Python, Haskell, Java, Lisp, and many others. An
implementation in obfuscated C whose code
&lt;a href="https://gist.github.com/1368661"&gt;actually looks like a sparkline&lt;/a&gt;. An &lt;a href="https://github.com/ajacksified/Clark"&gt;npm package&lt;/a&gt; for adding
spark to Hubot. The creator of Redis, Salvatore Sanfilippo,
&lt;a href="https://twitter.com/#!/antirez/status/136921138180788224"&gt;said it best&lt;/a&gt; while creating his own implementation:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Sometimes coding something useless, funny, from scratch, is the best way to
relax before the next burst of work.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Try to support people&amp;#39;s playful moods. Everyone gets in a rut sometimes, and
they&amp;#39;re just waiting for you to inspire them out of it.&lt;/p&gt;

&lt;h2&gt;Okay, your turn&lt;/h2&gt;

&lt;p&gt;spark is somewhat unusual. It&amp;#39;s a generic, simple, interesting library that
appeals to a broad segment of the developer population. But different aspects
of spark&amp;#39;s appeal can stand alone and be useful in your own projects.&lt;/p&gt;

&lt;p&gt;Don&amp;#39;t be afraid to experiment. Experimenting with sparklines drove a lot of
interest to my project, which was great. That was the least important part,
though. Seeing everyone excited to reimplement my project? Seeing developers
rush into applying spark to crazy datasets? Getting message after message of
helpful pointers on where my code could be improved? All of these were what
made this project so much fun.&lt;/p&gt;

&lt;p&gt;It all stemmed from a brief moment of, &amp;quot;hey, this afternoon I&amp;#39;m going to sit
down and hack on something fun&amp;quot;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/b0yqJ_mMTU4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/posts/from-hack-to-popular-project</feedburner:origLink></entry>
 
 <entry>
   <title>Swearing</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/M0EPOZ1WV0k/swearing" />
   <updated>2011-11-09T00:00:00-08:00</updated>
   <id>http://zachholman.com/posts/swearing</id>
   <content type="html">&lt;p&gt;Swearing is a strong tool. It can be a particularly strong tool during
presentations.&lt;/p&gt;

&lt;h2&gt;Emotion&lt;/h2&gt;

&lt;p&gt;When it comes to your talk, I want you to avoid bullet points. I want you to
avoid recitation. I want to learn and to experience what pains and problems you
faced, and then discover interesting solutions that grew from them.&lt;/p&gt;

&lt;p&gt;I want a story.&lt;/p&gt;

&lt;p&gt;Humans are storytellers. The best stories convey a sense of &lt;strong&gt;emotion&lt;/strong&gt;.
Emotion helps us identify with the speaker. Without fail, if I can plainly
identify with what the speaker is going through, I&amp;#39;m going to remember that
talk. Did your servers burn down? Is your app twice as fast? How did you handle
all of those new hires? Connect with me emotionally, and I&amp;#39;m going to better
apply what you say to my own life.&lt;/p&gt;

&lt;p&gt;As storytellers, our tools are words. Some of our most evocative  tools are
swear words. The emotions they raise can&amp;#39;t be reached as succinctly with other
tools. They&amp;#39;re powerful. When chosen with deliberate consideration, they aren&amp;#39;t
a cop-out; they&amp;#39;re the strongest way to connect with a particular audience.&lt;/p&gt;

&lt;p&gt;I want a story. I want emotion. I want the entire toolbox at my disposal, not a
subset.&lt;/p&gt;

&lt;h2&gt;Persona&lt;/h2&gt;

&lt;p&gt;I understand the argument that you shouldn&amp;#39;t swear at all; I really do. If
that&amp;#39;s your considered perspective, I&amp;#39;m happy for you. That&amp;#39;s not me, though.&lt;/p&gt;

&lt;p&gt;I maintain separate voices in long-form essays, over Twitter, and in talks.
Together, it&amp;#39;s a crafted persona. That persona includes edge, informality, and
passion for what I do. Sometimes I&amp;#39;ll swear to invoke that persona. Usually
it&amp;#39;s no more than 1-3 times on my slide deck, and I seldom swear much outside
of my slides. My deck takes 2-3 weeks to design and practice, so I can assure
you my words are not thrown in haphazardly. It&amp;#39;s all designed to support my
persona.&lt;/p&gt;

&lt;p&gt;This persona has served me well, judging from how people react to my talks,
tweets, and posts.&lt;/p&gt;

&lt;h2&gt;Audience&lt;/h2&gt;

&lt;p&gt;The common objection raised to swearing in talks is that it is bound to offend
someone, so why risk it? Why automatically reduce your potential audience?&lt;/p&gt;

&lt;p&gt;I don&amp;#39;t view it this way. I&amp;#39;m less concerned about my overall reach than I am
with &lt;strong&gt;connecting with my audience&lt;/strong&gt;. Put another way: I&amp;#39;m content with losing
a handful of people if that means I connect much stronger with everyone else.&lt;/p&gt;

&lt;p&gt;Your reputation is your brand. Just like a company, your brand can be deeply
impacted by a small group of passionate followers. I&amp;#39;ve been seeing this for
years- the same avatars retweet me, the same names show up in discussions about
me, the same sites help promote my projects. I&amp;#39;m fortunate and humbled to have
these people at my back.&lt;/p&gt;

&lt;p&gt;I wouldn&amp;#39;t have nearly as many of them if I played it safe. I enjoy keeping an
edge, and they respect that. Someone else could construct a beige persona and
cultivate a following, but that would be less effective for me because I&amp;#39;m not
nearly as good at fitting that personality.&lt;/p&gt;

&lt;h2&gt;For me&lt;/h2&gt;

&lt;p&gt;At the end of the day, the talks I give are intended for me. I don&amp;#39;t know any
other way to do it. I want to give talks that would interest me as a member of
the audience. The voice I choose, what words I project on a screen, and how I
present myself are all part of the talk.&lt;/p&gt;

&lt;p&gt;I&amp;#39;m just telling my story.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/M0EPOZ1WV0k" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/posts/swearing</feedburner:origLink></entry>
 
 <entry>
   <title>Stories From a Music-Fueled Distributed Streaming Bender</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/rT4IwXW6mi4/play" />
   <updated>2011-11-07T00:00:00-08:00</updated>
   <id>http://zachholman.com/talk/play</id>
   <content type="html">&lt;p&gt;I gave the closing keynote at &lt;a href="http://devslovebacon.com"&gt;BACON&lt;/a&gt;
in London about &lt;a href="https://github.com/play"&gt;Play&lt;/a&gt;, GitHub&amp;#39;s
internal music server. I also merged the &lt;em&gt;next&lt;/em&gt; branch into master,
which was a months-long effort to make Play possibly the greatest thing in
a million milliseconds.&lt;/p&gt;

&lt;p&gt;Play can be found &lt;a href="https://github.com/play/play"&gt;on GitHub&lt;/a&gt;,
and you can browse the &lt;a href="https://github.com/play"&gt;Play organization&lt;/a&gt;
on GitHub to check out our clients for iOS, Mac, Windows, Android, and
other projects we&amp;#39;ve open sourced.&lt;/p&gt;

&lt;h3&gt;Slides&lt;/h3&gt;

&lt;script async class="speakerdeck-embed" data-id="4f92b82bc9c654001f011e56" data-ratio="1.3333333333333333" src="//speakerdeck.com/assets/embed.js"&gt;&lt;/script&gt;

&lt;h3&gt;Video&lt;/h3&gt;

&lt;p&gt;The video for this talk can be found &lt;a href="https://vimeo.com/50679241"&gt;on Vimeo&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/rT4IwXW6mi4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/talk/play</feedburner:origLink></entry>
 
 <entry>
   <title>Hubot Play</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/XCEdHVA8GKI/play" />
   <updated>2011-11-07T00:00:00-08:00</updated>
   <id>http://zachholman.com/screencast/hubot-play</id>
   <content type="html">&lt;p&gt;Guy walks into a bar.&lt;/p&gt;

&lt;p&gt;Bartender glances at his shirt, which proudly proclaimed &amp;quot;INTRAMURAL FIELD
HOCKEY CHAMPIONS 2002&amp;quot;. Bartender comments: &amp;quot;You know, that shirt reminds me of
a story I once heard.&lt;/p&gt;

&lt;p&gt;&amp;quot;A team of researchers ended up shipwrecking their oceanliner on a beach.
Fearing death, they built shelters and huddled together for warmth. One
researcher, fed up with another&amp;#39;s statement that increased wine production in
Detroit led to the rise of Marxist sympathizers in Maryland, stormed off, left
the beach, and hailed a nearby taxicab.&amp;quot;&lt;/p&gt;

&lt;p&gt;Introducing &lt;a href="https://github.com/holman/play"&gt;play&lt;/a&gt;: your company&amp;#39;s DJ.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Edit: in April 2012 &lt;a href="/talk/play"&gt;I announced a new version of Play&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;play&lt;/h2&gt;

&lt;p&gt;We use play to play music on the speakers at work. It tallies up votes and
plays what people want. And all of it&amp;#39;s available through the web or through
&lt;a href="https://github.com/github/hubot"&gt;Hubot&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Suddenly, a screencast.&lt;/p&gt;

&lt;iframe src="http://player.vimeo.com/video/31712158" width="650" height="366" frameborder="0" webkitAllowFullScreen allowFullScreen&gt;&lt;/iframe&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/XCEdHVA8GKI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/screencast/play</feedburner:origLink></entry>
 
 <entry>
   <title>Don't Give Your Users Shit Work</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/H1qjZAvTFfw/shit-work" />
   <updated>2011-11-02T00:00:00-07:00</updated>
   <id>http://zachholman.com/posts/shit-work</id>
   <content type="html">&lt;p&gt;&lt;img src="http://cl.ly/BTt5/circles.png" class="noclip" width="650" height="200" /&gt;&lt;/p&gt;

&lt;p&gt;The problem with shit work is that no one likes doing it, but an awful lot of
people say they do.&lt;/p&gt;

&lt;h2&gt;Shit work&lt;/h2&gt;

&lt;p&gt;Take a look at Twitter Lists. The idea behind Twitter Lists was that users
would carefully cultivate lists on Twitter of different accounts they&amp;#39;re
following (or not following). These could be divided into lists like Family,
Friends, Coworkers, People I Find Mildly Attractive, People To Murder, People I
Find Mildly Attractive And Want To Murder, and so on.&lt;/p&gt;

&lt;p&gt;The problem is that, anecdotally, no one seems to use Lists. Twitter is filled
with users who have carefully made a few lists, and then promptly forgot about
them after they realized their clients don&amp;#39;t make it as easy to read List
tweets as it is to read tweets from people you follow.&lt;/p&gt;

&lt;p&gt;This is why I was never fascinated by Google+ and its concept of Circles. You
have to go through entire sub-communities of your friends and drop them into
arbitrary groupings. That sounds like shit work to me. What happens if I get
really hammered with a Business Acquaintance and he becomes a Close Drinking
Partner? Do I move his circles around? What happens if we hire him? Is he a
Coworker and a Close Drinking Partner? The last thing I want to have to worry
about is continually micromanaging another facet of life. This &lt;em&gt;is&lt;/em&gt; important,
since Google+ Circles is allegedly about privacy, and if you don&amp;#39;t continually
cultivate your circles, you could inadvertently send out the wrong update to
the wrong subset of contacts.&lt;/p&gt;

&lt;h2&gt;Smart work&lt;/h2&gt;

&lt;p&gt;Facebook used to have this problem. They went through a couple, multi-year
iterations of Groups. Initially — say, around 2005 or so — groups were outlets
for inside jokes. Not a lot of meaningful communication happened. Then Facebook
rightfully realized that they could have a real impact. They added Friend
Lists, with heavy-headed suggestions to create lists for family, friends,
coworkers, and so on, much akin to Google+&amp;#39;s circles.&lt;/p&gt;

&lt;p&gt;Recently they revamped Groups and their whole privacy permission structure.
Today, Facebook can anticipate most of what you want to do:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cl.ly/BNSL/fb.png" width="700" height="200" class="noclip" /&gt;&lt;/p&gt;

&lt;p&gt;I get to decide whether to send this status out to close friends, my work
network, my school, whoever I want. And I don&amp;#39;t need to set those groups up.
They already know who&amp;#39;s in my work network, who went to school with me, and who
lives where I live. Your product handles the smart work, and I won&amp;#39;t have to do
the shit work.&lt;/p&gt;

&lt;p&gt;This doesn&amp;#39;t work for all features in all products, of course. A stranger could
join my college network, friend me, get me to accept the friend request, and
then see statuses directed at my classmates. That seems unlikely, though. More
often than not, letting your app handle the shit work is going to be better
than letting your users handle it.&lt;/p&gt;

&lt;h2&gt;Don&amp;#39;t embrace the shit work&lt;/h2&gt;

&lt;p&gt;Some people still like shit work. They can spend an hour moving Twitter
accounts to special Lists, and then at the end of it look back and say &amp;quot;Boy, I
spent an hour doing this. I really accomplished a lot today!&amp;quot; You didn&amp;#39;t. You
did shit work.&lt;/p&gt;

&lt;p&gt;One of my favorite posts is Merlin Mann&amp;#39;s &lt;a href="http://www.43folders.com/2009/04/28/priorities"&gt;Mud Rooms, Red Letters, and Real
Priorities&lt;/a&gt;. His main point is that adding an assortment of labels, tags,
and priorities to your email inbox only serves to give you the illusion of
getting work done. Either something is important, or it isn&amp;#39;t. You don&amp;#39;t need
five levels of priorities to decide that, and spending time categorizing &lt;em&gt;isn&amp;#39;t
real work&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The same is true in any product. We need to get out of this idea that the act
of spending time on a project means that you spent your time wisely. Sometimes
you&amp;#39;re just wasting your time.&lt;/p&gt;

&lt;h2&gt;Don&amp;#39;t give your users the shit work&lt;/h2&gt;

&lt;p&gt;I used to carefully craft a bunch of buddy lists in my instant messenger.
Friends From Home, College Friends, Bay Area Friends, Work, Previous Work,
Current Work… it kept growing and growing until I suddenly realized how
fruitless it was for me. Then I merged everyone into one big group called
&amp;quot;Humans&amp;quot;.&lt;/p&gt;

&lt;p&gt;Simplify. Don&amp;#39;t give your users the shit work.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/H1qjZAvTFfw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/posts/shit-work</feedburner:origLink></entry>
 
 <entry>
   <title>Slide Design for Developers</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/7EQIY77hz8w/slide-design-for-developers" />
   <updated>2011-10-24T00:00:00-07:00</updated>
   <id>http://zachholman.com/posts/slide-design-for-developers</id>
   <content type="html">&lt;p&gt;So I gave this talk called &lt;a href="http://zachholman.com/talk/how-github-uses-github-to-build-github"&gt;How GitHub Uses GitHub to Build GitHub&lt;/a&gt;.
Someone submitted my slides to Hacker News, where it stayed at #1 for most of
the day.&lt;/p&gt;

&lt;p&gt;This was pretty strange to me at first.&lt;/p&gt;

&lt;p&gt;My slides are not designed for people who didn&amp;#39;t see the talk in person.
They&amp;#39;re designed to support my words, not some online audience. What&amp;#39;s more,
many commented that they found the &lt;em&gt;design of the slides&lt;/em&gt; to be noteworthy.
I&amp;#39;m expressly &lt;em&gt;not&lt;/em&gt; a designer.&lt;/p&gt;

&lt;p&gt;Working on your slide design pays off for the audience in front of you and for
the audience online reading your slides later. I learned a lot designing this
talk, and I think it can be helpful for you, too.&lt;/p&gt;

&lt;h2&gt;Colors&lt;/h2&gt;

&lt;p&gt;&lt;img src="http://cl.ly/BBQI/color.png" width="650" height="200" class="noclip" /&gt;&lt;/p&gt;

&lt;p&gt;Color is the very first thing people will notice. It should also be the very
first thing you think about.&lt;/p&gt;

&lt;p&gt;Head to a color site like &lt;a href="http://www.colourlovers.com"&gt;Colour Lovers&lt;/a&gt; and find a palette you like.
Pick colors with a lot of contrast- it gives you a lot of flexibility with
text, backgrounds, and objects. In my GitHub talk, I have around four colors I
use frequently, and 8-10 total (lighter green to augment a darker green,
lighter blue for my dark blue, and so on).&lt;/p&gt;

&lt;h2&gt;Size&lt;/h2&gt;

&lt;p&gt;&lt;img src="http://cl.ly/BAsT/fuck.png" width="650" height="300" class="noclip" /&gt;&lt;/p&gt;

&lt;p&gt;Make your text huge. And then get rid of half of the words and make it huger.
Almost all of the presentations I&amp;#39;ve ever seen at every conference screws this
up.&lt;/p&gt;

&lt;p&gt;Most of my text in my entire deck is at least 90pt. Usually I  like to sit
around 150pt, with spikes up to 300pt or more. You cannot get large enough.&lt;/p&gt;

&lt;p&gt;For the curious, I use &lt;a href="http://www.yanone.de/typedesign/kaffeesatz"&gt;Yanone Kaffeesatz&lt;/a&gt; as the typeface for both my
slide deck and the headings on my blog.&lt;/p&gt;

&lt;p&gt;One of my favorite tweets from my New Orleans talk said &amp;quot;Great slide design- I
was way in the back and could read every single word!&amp;quot; Forget the people in
front of you: &lt;strong&gt;design for people three rooms away from you&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;Words as Shapes&lt;/h2&gt;

&lt;p&gt;&lt;img src="http://cl.ly/BBqo/shape.png" width="650" height="300" class="noclip" /&gt;&lt;/p&gt;

&lt;p&gt;I took one design class in college. One of the most fascinating assignments
they gave us was a study of shape: you get one letter, in one typeface… do
something with it. The idea was that the severe limitation forced you to be
creative with duplication, rotation, scale, alignment, and whitespace. It
opened my mind to a lot of possibilities I hadn&amp;#39;t thought before. &lt;strong&gt;Letters
themselves can be part of the design&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Slides give you the same opportunity. The easiest way to make your slides
visually interesting is to play around with the physical &lt;em&gt;shape&lt;/em&gt; of the letters
that constitute the word. Line things up. Don&amp;#39;t line things up. Shift things
around. Worry about pixels. Almost every single slide in my talk is a different
font size, since I want things to work off of previous words, lines, and so on.
Text sizes of 94.5 points are not uncommon in my deck. They create a much more
interesting visual than throwing a random bullet point on-screen.&lt;/p&gt;

&lt;h2&gt;Repetition&lt;/h2&gt;

&lt;p&gt;&lt;img src="http://cl.ly/BBN2/repeat.png" width="650" height="300" class="noclip" /&gt;&lt;/p&gt;

&lt;p&gt;Humans love repetition. It&amp;#39;s one of the tricks used in lots of disciplines. The
best jazz soloists are capable of starting a melody, repeating it, and then
playing with it after the audience has identified with the repetition. The best
storytellers will repeat the same line throughout a story to build a sense of
familiarity, of excitement. Slides are no different.&lt;/p&gt;

&lt;p&gt;Steve Jobs did this often. Before moving onto the next product announcement,
he&amp;#39;d spend thirty seconds and go over the same information he just presented.
It&amp;#39;s a very simple way of keeping things memorable for your audience. I make
this explicit by giving recap sections big green stamps in the upper corner
saying &amp;quot;RECAP&amp;quot;. I also giving the start of each section of my talk bright
orange backgrounds with colorful, bold text. Simple reiteration is important.&lt;/p&gt;

&lt;p&gt;Simple reiteration is important.&lt;/p&gt;

&lt;h2&gt;Worry about it&lt;/h2&gt;

&lt;p&gt;A good set of slides won&amp;#39;t magically make your talk great. But a great talk is
really hurt by terrible slides. Spend some time thinking about your slides. Put
yourself in your audience&amp;#39;s shoes: is this readable? Is this interesting?
Should I pay attention, or should I get my laptop out and hack until lunch?&lt;/p&gt;

&lt;p&gt;I&amp;#39;m certainly not a designer, but it&amp;#39;s really remarkable how little design you
need to put yourself far ahead of most talks. Huge text. Consistent colors.
Less words. Worry about those, and it will already put you far ahead of the
pack.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/7EQIY77hz8w" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/posts/slide-design-for-developers</feedburner:origLink></entry>
 
 <entry>
   <title>Scaling GitHub's Employees</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/eWirGTjiHOk/scaling-github-employees" />
   <updated>2011-09-28T00:00:00-07:00</updated>
   <id>http://zachholman.com/posts/scaling-github-employees</id>
   <content type="html">&lt;p&gt;GitHub has been pretty public about &lt;a href="/posts/how-github-works/"&gt;how we work&lt;/a&gt;. We
love to write about it, tweet about it, and give talks about it. But there&amp;#39;s
usually a lingering question of whether this type of workflow scales.&lt;/p&gt;

&lt;p&gt;It does.&lt;/p&gt;

&lt;h2&gt;It scales.&lt;/h2&gt;

&lt;p&gt;We do things differently at GitHub: we work out of chat rooms, we don&amp;#39;t enforce
hours, and we have zero managers. People work on what they want to work on.
Product development is driven by whoever wants to drive product.&lt;/p&gt;

&lt;p&gt;I&amp;#39;m GitHub employee number nine, and although I wasn&amp;#39;t there at the beginning,
I&amp;#39;ve been hearing and reading the same things since even before I was hired a
year and a half ago: &lt;em&gt;GitHub really has a great work environment, but it&amp;#39;s not
going to scale as they grow&lt;/em&gt;. The common sentiment was once GitHub grew past
five employees, they&amp;#39;ll have to start changing their strategy.&lt;/p&gt;

&lt;p&gt;Once we made it to five employees, we heard the same thing about ten employees.
Once we made it to ten employees, then they talked about twenty. Then thirty.
Today we&amp;#39;re at forty employees, and, if anything, we&amp;#39;re even happier with our
way of working than ever before.&lt;/p&gt;

&lt;h2&gt;Code gets shipped fast&lt;/h2&gt;

&lt;p&gt;Central to scaling GitHub&amp;#39;s humans is a streamlined way to deliver code. With
each additional employee added, you&amp;#39;re exponentially growing potential pain
points as communication paths inside the company get more complex. &lt;strong&gt;Building
more barriers to product development is not the answer.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pull Requests are our major breakthrough. Scott Chacon went into great detail
about &lt;a href="http://scottchacon.com/2011/08/31/github-flow.html"&gt;how we use Pull Requests at GitHub&lt;/a&gt;. I &lt;a href="http://zachholman.com/talk/how-github-uses-github-to-build-github"&gt;gave a talk on it,
too&lt;/a&gt;. Pull Requests mean we can do away with code review meetings.
Pull Requests mean we can quickly and safely deploy features. Pull Requests
mean our designers and developers work together in one place.&lt;/p&gt;

&lt;p&gt;Pull Requests are the way we&amp;#39;re able to continually improve our product quickly
without sacrificing code quality.&lt;/p&gt;

&lt;h2&gt;Break apart the company&lt;/h2&gt;

&lt;p&gt;Companies like Instagram, Quora, and Reddit get a lot of press and buzz,
but GitHub&amp;#39;s bigger than all of them. Combined. We&amp;#39;re still a small company,
but at 42 employees and counting, we&amp;#39;re no longer a tiny company.&lt;/p&gt;

&lt;p&gt;We have very little hierarchy in GitHub — on some days our CEO ships more code
than the rest of us do — but as we&amp;#39;ve grown larger we&amp;#39;ve let natural breaks in
overall development happen. Embracing these as they happen is critical. We&amp;#39;re
far past the point where any single person can monitor every changed line of
code.&lt;/p&gt;

&lt;p&gt;We have natural groupings: a dozen or two work on the main Rails app, a small
team works on &lt;a href="http://fi.github.com"&gt;GitHub Firewall Install&lt;/a&gt;, a couple are in charge of &lt;a href="http://jobs.github.com"&gt;GitHub
Jobs&lt;/a&gt;, one works exclusively on the Git core team, and we break out into
a number of platform-specific teams like the &lt;a href="http://mobile.github.com"&gt;iPhone app&lt;/a&gt;, the &lt;a href="http://mac.github.com"&gt;Mac
app&lt;/a&gt;, and open source projects like Eclipse, libgit2, and others. There
aren&amp;#39;t a lot of barriers between teams, so we encourage you to move between
teams as your interest allows.&lt;/p&gt;

&lt;p&gt;These natural groupings let specific people focus on and own those areas.
Those teams are in charge when things break. Those teams are in charge of
improving the product. Our ability to trust individual teams to work
independently allows us to tackle more and more projects.&lt;/p&gt;

&lt;h2&gt;Automate, automate, automate&lt;/h2&gt;

&lt;p&gt;Another thing GitHub does well is automate tedious — and important — tasks.
There&amp;#39;s a &lt;a href="http://zachholman.com/posts/why-github-hacks-on-side-projects"&gt;very strong culture&lt;/a&gt; of building mini-apps and Hubot scripts
if it helps with automation.&lt;/p&gt;

&lt;p&gt;There&amp;#39;s two reasons for why we push hard on this. The first is most obvious:
you&amp;#39;re letting a scripted process save you time so you can focus on doing real
work. The second is more subtle: automation reduces institutional knowledge.
Institutional knowledge leads to a minority group inside of the company
retaining answers. That forces new employees to bother those few in order to
make impactful changes. It becomes a very verbal, synchronous process, which we
try to avoid.&lt;/p&gt;

&lt;p&gt;By automating deploys, a brand-new GitHubber can type &lt;code&gt;hubot deploy github to
production&lt;/code&gt; and deploy changes on their first day without needing to read up on
how our deploy script delivers code updates to 60+ servers. By running tests
automatically for each pushed Git branch, each developer doesn&amp;#39;t have to find
out how to get CI to run their tests. By scripting commonly-used Graphite
queries into Hubot, each employee can generate graphs of application
exceptions, deploys, and Twitter mentions to @github to visually determine if
there&amp;#39;s a problem with a recent deploy without having to learn the specific
Graphite syntax.&lt;/p&gt;

&lt;h2&gt;The Uphill Battle&lt;/h2&gt;

&lt;p&gt;This stuff doesn&amp;#39;t come easily, but it unfortunately leaves easily. Figuring
out ways to streamline, to improve your process, to grow your company as you
grow your employees is a constant struggle. It&amp;#39;s something that should be
continually re-evaluated.&lt;/p&gt;

&lt;p&gt;Is this workflow going to work for us when we&amp;#39;re 500 employees? Likely not. But
core values and ideas last. Figure out what your core values are, and adapt and
refine them as you grow.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/eWirGTjiHOk" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/posts/scaling-github-employees</feedburner:origLink></entry>
 
 <entry>
   <title>How GitHub Uses GitHub to Build GitHub</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/q7iZ7v7QTt0/how-github-uses-github-to-build-github" />
   <updated>2011-09-21T00:00:00-07:00</updated>
   <id>http://zachholman.com/talk/how-github-uses-github-to-build-github</id>
   <content type="html">&lt;p&gt;Build features fast. Ship them. That&amp;#39;s what we try to do at GitHub. Our
process is the anti-process: what&amp;#39;s the minimum overhead we can put up with to
keep our code quality high, all while building features &lt;em&gt;as quickly as
possible&lt;/em&gt;? It&amp;#39;s not just features, either: faster development means happier
developers.&lt;/p&gt;

&lt;h3&gt;Slides&lt;/h3&gt;

&lt;script src="http://speakerdeck.com/embed/4e79b461c9bdcb003f00331d.js?size=preview"&gt;&lt;/script&gt;

&lt;h3&gt;Video&lt;/h3&gt;

&lt;p&gt;&lt;video controls poster="http://confreaks.net/system/videos/images/706/preview/706-rubyconf2011-how-github-uses-github-to-build-github-thumb_0004.png?1322788659"&gt;
  &lt;source src="http://confreaks.net/system/assets/datas/2680/original/706-rubyconf2011-how-github-uses-github-to-build-github-small.mp4?1" /&gt;
&lt;/video&gt;&lt;/p&gt;

&lt;h3&gt;References&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://www.43folders.com/2009/04/28/priorities"&gt;Merlin Mann's "Mud Rooms, Red Letters, and Real Priorities"&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/atmos/sinatra_auth_github"&gt;sinatra_auth_github&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://zachholman.com/posts/why-github-hacks-on-side-projects/"&gt;Why GitHub Hacks on Side Projects&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://zachholman.com/posts/how-github-works/"&gt;How GitHub Works&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://scottchacon.com/2011/08/31/github-flow.html"&gt;Scott Chacon's "GitHub Flow"&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/q7iZ7v7QTt0" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/talk/how-github-uses-github-to-build-github</feedburner:origLink></entry>
 
 <entry>
   <title>Customer Support Doesn't Have to Suck</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/PjO6SLWWEuU/customer-support-doesnt-have-to-suck" />
   <updated>2011-09-07T00:00:00-07:00</updated>
   <id>http://zachholman.com/posts/customer-support-doesnt-have-to-suck</id>
   <content type="html">&lt;p&gt;We all have this feeling that fielding support requests is a monotonous job we
ought to dread.&lt;/p&gt;

&lt;p&gt;We shouldn&amp;#39;t. It doesn&amp;#39;t have to suck.&lt;/p&gt;

&lt;p&gt;I was at a dinner in Boulder for the 2011 Rocky Mountain Ruby conference, and
Hoyt (&lt;a href="http://twitter.com/jonmagic"&gt;@jonmagic&lt;/a&gt;) asked a simple question about
software support to a table-mate:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When was the last time you did something particularly nice for a customer?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I don&amp;#39;t think Hoyt intended this to be a particularly interesting or deep
question, but I think it&amp;#39;s much more important that it looks on the surface.&lt;/p&gt;

&lt;h2&gt;Support can substantially impact people&lt;/h2&gt;

&lt;p&gt;If you&amp;#39;re in a position of supporting a product — answering emails, fixing
bugs, responding to people over Twitter — you are in a position to &lt;strong&gt;improve
lives&lt;/strong&gt;. It sounds overly dramatic, but consider a support request:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I want something that I currently can&amp;#39;t attain in your product: a specific
end result, a feature, a bug fixed, or sufficient in-product help so I can do
it myself.&lt;/li&gt;
&lt;li&gt;This desire impacts me emotionally: if I&amp;#39;m helped, I will be happy, or I&amp;#39;ll
avoid feeling frustrated, or I&amp;#39;ll be impressed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The second aspect is most important. Support requests are almost always tied to
emotion, even if the asker doesn&amp;#39;t herself believe it. A lot of the time,
addressing someone&amp;#39;s concerns is as much about protecting against future
frustrations rather than improving today&amp;#39;s complacency. Fixing someone&amp;#39;s bug
may only lead to a three-second &amp;quot;oh good, they fixed that&amp;quot; response, but that
short-lived relief &lt;em&gt;is&lt;/em&gt; relief. Do that enough times, and you turn customers
into happy customers. Do it consistently and frequently, and your happy
customers turn into devoted customers.&lt;/p&gt;

&lt;h2&gt;Going over the top&lt;/h2&gt;

&lt;p&gt;Hoyt&amp;#39;s question was more about what happens if you go &amp;quot;over the top&amp;quot;. Are you
just going to give your customer a paste of steps they can take to fix their
problem? Can you spend some time and give them an executable script? Can you
manually go into the database to do it yourself so they don&amp;#39;t have to lift a
finger?&lt;/p&gt;

&lt;p&gt;Do they have a completely, irrationally-involved support request you usually
blow off? Can you fully address it at least one time this month?&lt;/p&gt;

&lt;p&gt;Can you read between the lines and recognize someone&amp;#39;s actual desires before
they do? If they&amp;#39;re asking for &lt;em&gt;x&lt;/em&gt;, give them &lt;em&gt;5x&lt;/em&gt;. Go over the top. Lose money
on it. Waste time on it. Don&amp;#39;t do it for the marketing exposure: &lt;strong&gt;do it
because you can make someone happy&lt;/strong&gt;. If they tweet or blog about it, great,
but if that&amp;#39;s the primary reason you&amp;#39;re doing it, they&amp;#39;ll know. Do it for the
right reasons.&lt;/p&gt;

&lt;p&gt;We&amp;#39;re limited by time. We&amp;#39;re limited by money. &amp;quot;Over the top&amp;quot; support responses
may only be feasible in your company every few weeks. Or months. Or even more.
But there will be times where it &lt;em&gt;is&lt;/em&gt; possible. When that happens, consider
whether you can help. In most cases, the other party won&amp;#39;t even notice the
lengths you&amp;#39;ve went to. That&amp;#39;s okay. Over time, &lt;em&gt;people will notice&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;All too often we forget that many companies aren&amp;#39;t built primarily to make
money: they&amp;#39;re built to solve problems. Money is the intended side-effect of
that. Connect with customers emotionally and you&amp;#39;ll start seeing happier
humans.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/PjO6SLWWEuU" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/posts/customer-support-doesnt-have-to-suck</feedburner:origLink></entry>
 
 <entry>
   <title>Glue Languages Make You a Better Coder</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/tBMHA75EDiU/glue-languages" />
   <updated>2011-09-06T00:00:00-07:00</updated>
   <id>http://zachholman.com/posts/glue-languages</id>
   <content type="html">&lt;p&gt;Glue languages are used everywhere. While you may identify as a Pythonista, or
a Lua fiend, or a C++ developer, we all end up congregating in some common
spaces. On the web, this means JavaScript. On the server, this means shell.
These are our &lt;strong&gt;glue languages&lt;/strong&gt;: languages that bring our disparate
programming communities together.&lt;/p&gt;

&lt;p&gt;JavaScript, shell scripting, SQL, and glue languages like them are ubiquitous.
Grab any UNIX box and you can dive right in with a shell script. JavaScript is
pushing the envelope on the client as well as the server. No matter what
language you primarily develop in, improving your chops in these common-ground
languages is one of the best things you can do for your career.&lt;/p&gt;

&lt;h2&gt;Specialization is for insects&lt;/h2&gt;

&lt;p&gt;It&amp;#39;s difficult to find a &amp;quot;shell scripting expert&amp;quot; or, to some extent, a
&amp;quot;JavaScript expert&amp;quot;. Both JavaScript and shell tend to expose &lt;em&gt;other&lt;/em&gt;
technologies rather than form the primary focus of your program: your shell
script exposes UNIX internals, your JavaScript binds HTML and CSS together.
Because of that, you&amp;#39;re much more likely to find generic &amp;quot;sysadmins&amp;quot; or
&amp;quot;front-end experts&amp;quot;.&lt;/p&gt;

&lt;p&gt;That&amp;#39;s your opportunity. You don&amp;#39;t need to become the &amp;quot;expert&amp;quot; in a particular
glue language, but the more you can improve your glue language skill set, the
more valuable you are to a wide variety of developers.&lt;/p&gt;

&lt;h2&gt;Futuristic Glue&lt;/h2&gt;

&lt;p&gt;This is why I find projects like Node.js so interesting. JavaScript isn&amp;#39;t
subservient to HTML and CSS anymore; it becomes a first-class language. Node is
just more accessible in JavaScript than if it were written in Ruby. This is
even apparent in shell: &lt;a href="https://github.com/wayneeseguin/rvm"&gt;rvm&lt;/a&gt;, a
platform-agnostic Ruby installer, is substantially written in shell rather than
Ruby. You don&amp;#39;t need to be a Rubyist to improve the project.&lt;/p&gt;

&lt;p&gt;It&amp;#39;s hard to consolidate in our industry. Technologies are forked, turned into
new projects, and forked again just as quickly. But we may start to see more
consolidation in the future. With more JavaScript developers, attention will
continue to be focused on improving the runtime efficiency of various
JavaScript engines, which will in turn continue to drive JavaScript adoption.&lt;/p&gt;

&lt;h2&gt;Back to Basics&lt;/h2&gt;

&lt;p&gt;Shell scripting syntax is fairly basic. JavaScript has a paltry standard
library. But those simplicities are strengths, not weaknesses.&lt;/p&gt;

&lt;p&gt;If your JavaScript skills consist mostly of running &lt;code&gt;alert()&lt;/code&gt; for input
validation, try stretching your legs with Node.js. If you still don&amp;#39;t know what
a pipe is, dive into shell scripting a bit further. These languages have been
around for ages, and will continue to be around for years to come.&lt;/p&gt;

&lt;p&gt;Look into other common areas, too: they needn&amp;#39;t even be languages. Make sure
you understand JSON and XML. Look into how you can expose your web frameworks
over REST. Consider real-time streaming protocols in your API. These are
concepts that transcend arbitrary language choice.&lt;/p&gt;

&lt;p&gt;The usage of cross-discipline, cross-culture glue languages is only going to
grow. Embrace it. Get out of your language comfort zone and work at becoming a
better programming citizen. The more our communities can work in glue
languages, the better we can work together.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/tBMHA75EDiU" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/posts/glue-languages</feedburner:origLink></entry>
 
 <entry>
   <title>A Documentation Talk</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/FKB21rFbpVI/a-documentation-talk" />
   <updated>2011-09-02T00:00:00-07:00</updated>
   <id>http://zachholman.com/talk/a-documentation-talk</id>
   <content type="html">&lt;p&gt;&amp;quot;A Documentation Talk&amp;quot; sounds pretty boring, right? Wouldn&amp;#39;t it be
scandalously titillating if this talk&amp;#39;s title included detailed analysis of
the expectations and results of the talk itself? Jeez it&amp;#39;s like someone&amp;#39;s
making an overt metaphor for how Rubyists document their code.&lt;/p&gt;

&lt;p&gt;At GitHub, we add docs to every single method we write, and we couldn&amp;#39;t be
more excited about it. It means faster and simpler code. It means stronger
tests. It means your developers can pay attention to new commits without
stressing about them. Documentation will make your project so very happy.&lt;/p&gt;

&lt;h3&gt;Slides&lt;/h3&gt;

&lt;script src="http://speakerdeck.com/embed/4e6109a732a2370001009968.js?size=preview"&gt;&lt;/script&gt;

&lt;h3&gt;Video&lt;/h3&gt;

&lt;p&gt;&lt;video controls poster="http://confreaks.net/system/videos/images/739/preview/739-rockymtnruby2011-a-documentation-talk-thumb_0004.png"&gt;
  &lt;source src="http://confreaks.net/system/assets/datas/2127/original/739-rockymtnruby2011-a-documentation-talk-small.mp4" /&gt;
&lt;/video&gt;&lt;/p&gt;

&lt;h3&gt;References&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://tom.preston-werner.com/2010/08/23/readme-driven-development.html"&gt;Readme Driven Development&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://tomdoc.org"&gt;TomDoc&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://zachholman.com/posts/documentation/"&gt;The Most Important Code Isn't Code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/FKB21rFbpVI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/talk/a-documentation-talk</feedburner:origLink></entry>
 
 <entry>
   <title>How GitHub Works: Creativity is Important</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/hIG3fgBYke4/how-github-works-creativity" />
   <updated>2011-08-18T00:00:00-07:00</updated>
   <id>http://zachholman.com/posts/how-github-works-creativity</id>
   <content type="html">&lt;p&gt;We want to foster a creative environment. We love it when employees &lt;a href="http://zachholman.com/posts/why-github-hacks-on-side-projects"&gt;hack on
side projects&lt;/a&gt;. It gets people excited. Excitement is contagious, and
spreads easily from one project to another. Even if we&amp;#39;ll never make money on
that side project, the excitement generated from it can bleed into things that
&lt;em&gt;will&lt;/em&gt; make us money.&lt;/p&gt;

&lt;h2&gt;Alcohol&lt;/h2&gt;

&lt;p&gt;It&amp;#39;s no secret that there&amp;#39;s more than a few people at GitHub who like to drink.
I mean, we have four beers on-tap at the office &lt;a href="http://octobeer.me"&gt;in our kegerator&lt;/a&gt;.
But alcohol is more important than just intoxication.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We meet people&lt;/strong&gt;. Through our sponsored drinkups, we meet a ton of people in
San Francisco and all over the world. This gets people excited about our
product, and gets people excited about working for GitHub. (It&amp;#39;s a &lt;em&gt;lot&lt;/em&gt; safer
to hire someone after you&amp;#39;ve had a few beers with them in a non-threatening
environment rather than create a large, stressful interview process.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We meet each other&lt;/strong&gt;. We all work together, but we&amp;#39;re not just coworkers;
we&amp;#39;re friends. We bleed friendship and work together, so it&amp;#39;s hard to tell when
we&amp;#39;re discussing work and when we&amp;#39;re chatting over beers. This is not just for
a fuzzy feel-good feeling. When you&amp;#39;re close to someone, you can be much more
honest with them. If they have an idea, tell them about it straight, help them
improve it, and move on. Going out socially is part of that. Alcohol&amp;#39;s called a
social lubricant for a reason.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We brainstorm&lt;/strong&gt;. Bars are a great environment to ask &amp;quot;what if&amp;quot;. Don&amp;#39;t stay
concrete- talk about industry direction, how it can apply to your product, what
we might be building three years from now. So many of our existing features
stem from vague sessions at San Francisco bars.&lt;/p&gt;

&lt;h2&gt;Encourage different&lt;/h2&gt;

&lt;p&gt;GitHub&amp;#39;s primarily a Ruby shop: most of the developers use Ruby full-time and
most of our projects use Ruby. But you shouldn&amp;#39;t be limited by your existing
workflow.&lt;/p&gt;

&lt;p&gt;We&amp;#39;re setting up an &lt;a href="http://www.arduino.cc/"&gt;Arduino&lt;/a&gt; shop in the office for those of us who
have never done meatspace programming projects. GitHub sponsors monthly gym
memberships. We have intense philosophical debates on who can gain the most
followers on Twitter. We encourage employees to give internal talks on
everything from arcane programming languages to mountain climbing.&lt;/p&gt;

&lt;p&gt;The point is to get people interested in a lot of different areas of life. Get
people excited. Get people exposed to completely different ways of thinking.
Improve the person, and it improves the company.&lt;/p&gt;

&lt;h2&gt;Creativity means self-direction&lt;/h2&gt;

&lt;p&gt;One of the initial questions Chris asked that led to this blog post was &lt;em&gt;I&amp;#39;m
sure anyone can&amp;#39;t just write whatever they want.&lt;/em&gt; That&amp;#39;s actually the case.&lt;/p&gt;

&lt;p&gt;There are certain things that are more pressing — overhauling our events table
before it crashed the site is a bit more important than a new footer, for
example — but for the most part GitHub is self-directed. If you&amp;#39;re interested
in working on something, then work on it. The best work is done by those who
are genuinely interested in finishing that project.&lt;/p&gt;

&lt;p&gt;We&amp;#39;re able to do this because we talk a lot about our product, so everyone&amp;#39;s on
the same page. Things like Pull Requests give us playgrounds to try out new
ideas before shipping them publicly. We thrive on experimentation and shun
grandstanding. If you&amp;#39;re interested in something, just do it. We can iterate on
top of your prototype from that point forward. It&amp;#39;s a great way to build a
product. Kyle &lt;a href="http://warpspire.com/posts/product-design/"&gt;has written extensively&lt;/a&gt; on this process at GitHub from a
design standpoint.&lt;/p&gt;

&lt;h2&gt;We&amp;#39;re hiring&lt;/h2&gt;

&lt;p&gt;Okay, I didn&amp;#39;t mean for this to be one huge plug for GitHub; I just think this
is a great way to build products. That said, we&amp;#39;re always looking for new
talent; follow &lt;a href="http://twitter.com/holman"&gt;@holman&lt;/a&gt; and
&lt;a href="http://twitter.com/github"&gt;@github&lt;/a&gt; on Twitter and we&amp;#39;ll let you know when we
have openings.&lt;/p&gt;

&lt;p&gt;If not, I hope this interests you. A large company like IBM may need to enforce
a lot of overhead, but in the startup world we can avoid all of that.  You
don&amp;#39;t need to mandate hours. You don&amp;#39;t need to mandate meetings. Your code
review can be ad-hoc. You can build fun companies that get shit done. It&amp;#39;s not
mutually exclusive.&lt;/p&gt;

&lt;p&gt;Don&amp;#39;t let your company get in the way of building your product.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/hIG3fgBYke4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/posts/how-github-works-creativity</feedburner:origLink></entry>
 
 <entry>
   <title>How GitHub Works: Be Asynchronous</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/_u8IEItbdvM/how-github-works-asynchronous" />
   <updated>2011-08-17T00:00:00-07:00</updated>
   <id>http://zachholman.com/posts/how-github-works-asynchronous</id>
   <content type="html">&lt;p&gt;This is — by far — my favorite aspect of working at GitHub. Everything is
asynchronous.&lt;/p&gt;

&lt;h2&gt;Chat&lt;/h2&gt;

&lt;p&gt;GitHub didn&amp;#39;t have an office for the first two years. Chat rooms (in our case,
&lt;a href="http://campfirenow.com"&gt;Campfire&lt;/a&gt;) is where things got done. Today we&amp;#39;ve moved into our
second office, and Campfire is &lt;em&gt;still&lt;/em&gt; where we get things done. There&amp;#39;s a
reason for that: chat is asynchronous.&lt;/p&gt;

&lt;p&gt;Asynchronous communication means I can take a step out for lunch and catch up
on transcripts when I get back. Asynchronous communication means I can ask my
coworker a question in-chat and not worry about bothering her since she&amp;#39;ll get
back to me when she&amp;#39;s available. Asynchronous communication means I can go to
rural Minnesota and feel like I&amp;#39;m working from the office like normal.&lt;/p&gt;

&lt;h2&gt;Pull Requests&lt;/h2&gt;

&lt;p&gt;The majority of our development workflow involves &lt;a href="https://github.com/features/projects/codereview#codereview_bucket"&gt;Pull Requests&lt;/a&gt;. I&amp;#39;m
going to be going into a lot more detail about this in future blog posts &lt;a href="http://zachholman.com/talks"&gt;and
talks&lt;/a&gt; but in the meantime let me say this: living in a pull request
world is sublime.  Gone are days at companies with complicated branching
strategies, with in-person code-on-a-screen code review.&lt;/p&gt;

&lt;p&gt;If I want to add a new feature or impact the codebase, I&amp;#39;ll push a new branch,
create a Pull Request for it, and my coworkers will review it 1) if they&amp;#39;re
impacted by those changes, 2) interested in the subject, or 3) when they have
ample time to check out my changes. At that point, we can run a partial deploy
of that branch on different subsets of machines and try things out in
production, and if everything looks good, merge into master.&lt;/p&gt;

&lt;p&gt;With Pull Requests, I don&amp;#39;t have to drag anyone into a meeting that&amp;#39;s
inconvenient for them and for me. There&amp;#39;s a good reason for that, too:&lt;/p&gt;

&lt;h2&gt;Meetings are fucking toxic&lt;/h2&gt;

&lt;p&gt;37signals &lt;a href="http://gettingreal.37signals.com/ch07_Meetings_Are_Toxic.php"&gt;originated&lt;/a&gt; &amp;quot;meetings are toxic&amp;quot; in Getting Real. I tend to
loathe meetings &lt;em&gt;even more&lt;/em&gt; than 37signals. I despise them.&lt;/p&gt;

&lt;p&gt;Meetings are usually called when you need to hash something out. They tend to
invite more people than necessary, and even if you&amp;#39;re pretty interested in the
meeting topic, you&amp;#39;re still going to be frustrated because &lt;strong&gt;meetings pull you
from doing actual work in order to talk about doing work&lt;/strong&gt;. It&amp;#39;s easier to push
a branch up, check out the diff, and then iterate on that diff rather than
assuming you&amp;#39;re going to perfectly whiteboard system design ahead of time.&lt;/p&gt;

&lt;p&gt;Beyond that, meetings are utterly forgettable. Even if you take meeting notes,
you can&amp;#39;t capture them all. You make a judgement at that point in time as to
what to write down for later. Then three weeks later you try to remember what
wasn&amp;#39;t written down when it becomes apparent that &lt;em&gt;that&lt;/em&gt; discussion was more
important. You don&amp;#39;t have this problem with chat transcripts. Forcing people to
reduce their otherwise rambling thoughts into concrete sentences helps focus
discussion, too.&lt;/p&gt;

&lt;p&gt;We&amp;#39;ll have meetings at GitHub, but I can count the number of full &amp;quot;meetings&amp;quot;
we&amp;#39;ve had in the last year and a half on one hand.&lt;/p&gt;

&lt;h2&gt;The Zone&lt;/h2&gt;

&lt;p&gt;This all goes back to what I was writing about yesterday: you want your
employees to be in &amp;quot;the zone&amp;quot;. Putting people in an atmosphere where they can
only work for an hour before a team meeting pulls them out of that flow.&lt;/p&gt;

&lt;p&gt;We&amp;#39;ve found that if you let responsible people handle their own priorities on
their own timeline, they&amp;#39;ll end up getting the important stuff finished and
still be able to work productively on other work.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/_u8IEItbdvM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/posts/how-github-works-asynchronous</feedburner:origLink></entry>
 
 <entry>
   <title>How GitHub Works: Hours are Bullshit</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/7xvKXvOhDZk/how-github-works-hours" />
   <updated>2011-08-16T00:00:00-07:00</updated>
   <id>http://zachholman.com/posts/how-github-works-hours</id>
   <content type="html">&lt;p&gt;Frederick Winslow Taylor wrote the seminal analysis of management and
efficiency in 1911 with &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/The_Principles_of_Scientific_Management"&gt;The Principles of Scientific Management&lt;/a&gt;&lt;/em&gt;. He
took the first scientific approach towards maximizing efficiency in
manufacturing jobs. Time is money. Faster is better. More hours are better.&lt;/p&gt;

&lt;h2&gt;Hours are bullshit&lt;/h2&gt;

&lt;p&gt;Hours are great ways to determine productivity in many industries, but not
ours. Working in a startup is a much different experience than working in a
factory. You can&amp;#39;t throw more time at a problem and expect it to get solved.
&lt;strong&gt;Code is a creative endeavor&lt;/strong&gt;. You need to be in the right mindset to create
high-quality code.&lt;/p&gt;

&lt;p&gt;Think back to the last time you were depressed or angry. How productive were
you? Now think back to the last time you were truly productive. Code flying
from your fingertips. Not just the sheer quantity- the sheer &lt;em&gt;quality&lt;/em&gt; of that
code. When you&amp;#39;re in the right mindset, your best day of coding can trump weeks
of frustrated keyboard-tapping.&lt;/p&gt;

&lt;p&gt;We want employees to be in the zone as often as possible. Mandating specific
times they need to be in the office hurts the chances of that. Forcing me in
the office at 9am will never, ever get me in the zone, but half of GitHub may
very well work &lt;em&gt;best&lt;/em&gt; in the morning.&lt;/p&gt;

&lt;p&gt;By allowing for a more flexible work schedule, you create an atmosphere where
employees can be excited about their work. Ultimately it should lead to &lt;em&gt;more&lt;/em&gt;
hours of work, with those hours being even &lt;em&gt;more&lt;/em&gt; productive. Working weekends
blur into working nights into working weekdays, since none of the work &lt;em&gt;feels&lt;/em&gt;
like work.&lt;/p&gt;

&lt;h2&gt;A day&lt;/h2&gt;

&lt;p&gt;Everyone at GitHub is different. I don&amp;#39;t really have an &amp;quot;average&amp;quot; day, but this
is a close approximation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wake up around 10am, check Campfire logs, clear overnight support tickets&lt;/li&gt;
&lt;li&gt;Bus into work and grab lunch around noon or 1&lt;/li&gt;
&lt;li&gt;Work from 1pm to somewhere around 6-9pm at the office&lt;/li&gt;
&lt;li&gt;Go home and work/relax from my couch until 2am, or:&lt;/li&gt;
&lt;li&gt;Go out and drink with coworkers (more on this later)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We have a contingent of (insane) people who come into work around 7am, we have
some who come in at 3pm. We have some who are more productive at home. You
don&amp;#39;t have to come into the office every day if you don&amp;#39;t feel like it
(although most of the time everyone comes in).&lt;/p&gt;

&lt;p&gt;Why is our day so &amp;quot;loose&amp;quot;? Because 1) working in chat rooms lets us work when
and where we want, and 2) we want to create an environment where people are
most productive.  There&amp;#39;s no one work day that fits everyone&amp;#39;s productive
hours, so we don&amp;#39;t enforce one.&lt;/p&gt;

&lt;h2&gt;Enforcement&lt;/h2&gt;

&lt;p&gt;We&amp;#39;re currently at 35 employees and growing, and this approach still works
great. But managers love to assign hours for a reason: it gives them the
illusion that hours can measure performance.&lt;/p&gt;

&lt;p&gt;If you don&amp;#39;t go hard on hours, you do have to look at different metrics. How
good is their code? Are they fixing bugs? Are they involved in work, or is the
greater flexibility not motivating them?&lt;/p&gt;

&lt;p&gt;It&amp;#39;s difficult to make these qualitative judgements, but they&amp;#39;re still going to
be more valuable than &amp;quot;did this guy put in his ten hours of work today&amp;quot;.
Because as soon as you make it about hours, their job becomes less about code
and more about hours.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/7xvKXvOhDZk" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/posts/how-github-works-hours</feedburner:origLink></entry>
 
 <entry>
   <title>How GitHub Works</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/PuljKl_ipDE/how-github-works" />
   <updated>2011-08-15T00:00:00-07:00</updated>
   <id>http://zachholman.com/posts/how-github-works</id>
   <content type="html">&lt;p&gt;In 2011, I wrote a three-part series called &lt;strong&gt;How GitHub Works&lt;/strong&gt;. I wanted to
detail how we planned ideas, built them, and shipped them.&lt;/p&gt;

&lt;h2&gt;Posts&lt;/h2&gt;

&lt;p&gt;The three posts are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="/posts/how-github-works-hours/"&gt;Hours are Bullshit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/posts/how-github-works-asynchronous/"&gt;Be Asynchronous&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/posts/how-github-works-creativity"&gt;Creativity is Important&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Talk&lt;/h2&gt;

&lt;p&gt;I&amp;#39;ve always wanted to expand this into a proper talk, though. While I&amp;#39;ve
done a few GitHub-related talks since then, I didn&amp;#39;t get to do a true
&amp;quot;How GitHub Works&amp;quot; talk until 2012.&lt;/p&gt;

&lt;h3&gt;Video&lt;/h3&gt;

&lt;iframe src="http://player.vimeo.com/video/43676958" width="750" height="488" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen&gt;&lt;/iframe&gt;

&lt;h3&gt;Slides&lt;/h3&gt;

&lt;script async class="speakerdeck-embed" data-id="a9c8d05026450130e0581231381d8149"
  data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"&gt;&lt;/script&gt;

&lt;p&gt;This is an updated deck; you may be interested in the
&lt;a href="https://speakerdeck.com/holman/how-github-works"&gt;first version&lt;/a&gt; of my How GitHub
Works talk.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/PuljKl_ipDE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/posts/how-github-works</feedburner:origLink></entry>
 
 <entry>
   <title>Steve Jobs Sometimes Lies to You</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/NFBPm-MUwNc/steve-jobs-sometimes-lies" />
   <updated>2011-07-27T00:00:00-07:00</updated>
   <id>http://zachholman.com/posts/steve-jobs-sometimes-lies</id>
   <content type="html">&lt;p&gt;&lt;img src="http://cl.ly/8qoq/animated.gif" height="200" width="650" class="noclip" /&gt;&lt;/p&gt;

&lt;p&gt;I love Apple. I love Apple so much that if someone gave me a bulletproof vest
made out of MacBook Airs, I&amp;#39;d strap it to my back and take a bullet to my chest
to protect my precious aluminum friends.&lt;/p&gt;

&lt;p&gt;But Steve&amp;#39;s lying to us when it comes to &lt;a href="http://www.apple.com/mac/facetime/"&gt;FaceTime&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;quot;And we&amp;#39;re going to take it all the way. We&amp;#39;re going to the standards bodies,
starting tomorrow, and we&amp;#39;re going to make FaceTime an &lt;strong&gt;open industry
standard&lt;/strong&gt;.&amp;quot;
&lt;cite&gt;Steve Jobs, &lt;a href="http://www.apple.com/apple-events/wwdc-2010/"&gt;2010 WWDC Keynote&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Steve went on stage and announced this to the world. Rumor is he also
simultaneously announced it to the majority of the FaceTime team, who until
that moment hadn&amp;#39;t yet been informed that their work was going to be
standardized.&lt;/p&gt;

&lt;p&gt;There&amp;#39;s certainly a possibility that FaceTime may still be ratified as an open
standard. Maybe Steve just misspoke when he gave concrete dates and steps to
open up the FaceTime protocol. Maybe it happens the day after I publish this
blog post. But regardless of the reason, we are stuck here more than a year
later, with FaceTime siloed strictly to Apple devices and (to my knowledge)
zero standards bodies reviewing a proposed FaceTime protocol spec.&lt;/p&gt;

&lt;h2&gt;OpenFaceTime™&lt;/h2&gt;

&lt;p&gt;If FaceTime were open, we&amp;#39;d certainly see people working on integrating it.
Within a day of Jobs&amp;#39; announcement, &lt;a href="http://www.engadget.com/2010/06/08/skype-eager-to-work-with-apple-facetime-pretty-much-anyone-else/"&gt;Skype had said&lt;/a&gt; that they were
interested in the technology available through FaceTime. I&amp;#39;d wager good money
that some of the Android-based phones would add FaceTime as an option. And the
indie market would have a blast... depending on how &amp;quot;open&amp;quot; FaceTime would be,
I&amp;#39;m sure we&amp;#39;d be building FaceTime into &lt;a href="http://zachholman.com/posts/why-github-hacks-on-side-projects/"&gt;Hubot&lt;/a&gt;, our chat room robot at
GitHub.&lt;/p&gt;

&lt;p&gt;Increasing the number of FaceTime-equipped devices means that FaceTime moves
from a novelty that you use when you stumble into a bar and find out it has
free Wi-Fi, to a serious communication medium that can start to supplant
telephone calls themselves.&lt;/p&gt;

&lt;h2&gt;&amp;quot;Open&amp;quot; isn&amp;#39;t just a buzz word&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&amp;quot;Open&amp;quot; isn&amp;#39;t just a buzz word&lt;/strong&gt;. People like the word &amp;quot;open&amp;quot;. Marketers love it.
It sounds inviting. It sounds safe. But it&amp;#39;s fundamentally an important concept
in computer science. Open source, open guidelines, transparent motivations.
These concepts &lt;em&gt;actually mean&lt;/em&gt; something to us.&lt;/p&gt;

&lt;p&gt;If a company goes on record and says they&amp;#39;re going to open up, we need to hold
their feet to the fire. We need to make it clear that you can&amp;#39;t garner goodwill
by embracing openness while at the same time not delivering on that promise.&lt;/p&gt;

&lt;p&gt;The stakes are just too high not to pursue this admirable goal. To be truly
happy, I need to be able to FaceTime in ASCII from my scientific calculator. Or
mount a FaceTime camera to my dog. Or run it through a Visual Basic GUI and
give my recipient a really huge nose. The point is: open is open, and FaceTime
is not. Apple needs to fix that or fess up.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/NFBPm-MUwNc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/posts/steve-jobs-sometimes-lies</feedburner:origLink></entry>
 
 <entry>
   <title>Blog Marketing for Ego-Centric Assholes</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/Uv56MR682m8/blog-marketing" />
   <updated>2011-07-21T00:00:00-07:00</updated>
   <id>http://zachholman.com/posts/blog-marketing</id>
   <content type="html">&lt;p&gt;&lt;img src="http://cl.ly/8bI0/pageviews.png" width="650" height="150" alt="Page views" class="noclip" /&gt;&lt;/p&gt;

&lt;p&gt;My official job title at GitHub is &amp;quot;&lt;a href="https://github.com/holman"&gt;Ego Surfer&lt;/a&gt;&amp;quot;, a tongue-in-cheek
reaction to my &lt;a href="https://github.com/holman/stars"&gt;stars&lt;/a&gt; project, a command line interface I wrote to tell
me who have starred my tweets. GitHub job titles are given to employees in a
comical fashion, but in my case I like to think it&amp;#39;s fairly accurate: I really
like to discover and manage people&amp;#39;s reactions to my blog posts, tweets, and
product launches.&lt;/p&gt;

&lt;p&gt;I use &amp;quot;assholes&amp;quot; in the title somewhat loosely; I hate spam like the rest of
you and being an asshole who pushes their work with wanton disregard for how
disrespectful they&amp;#39;re being is never a good idea. That said, if you&amp;#39;re writing
good content that could stimulate an appreciative audience, I see nothing wrong
with putting your best foot forward.&lt;/p&gt;

&lt;p&gt;This isn&amp;#39;t some old-school post about getting indexed in Technorati. Getting
buzz about the posts you write today is a bit different. How you initially
react to someone&amp;#39;s &lt;em&gt;own&lt;/em&gt; reaction to your work can turn your small buzz into a
lot of fucking eyeballs.&lt;/p&gt;

&lt;h2&gt;Writing your launch tweet&lt;/h2&gt;

&lt;p&gt;Twitter is the most important technology to leverage. As I wrote in
&lt;a href="http://zachholman.com/posts/fame/"&gt;Fame&lt;/a&gt;, tweets and their subsequent retweets can really snowball a
mediocre post into one that&amp;#39;s discussed all over the internet.&lt;/p&gt;

&lt;p&gt;Not all tweets are created equally. Here&amp;#39;s how to win:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When you write a post, simultaneously tweet a link to it.&lt;/li&gt;
&lt;li&gt;Make the tweet body interesting. Either overtly make it vague, or catchy. I
tend to swear a lot, which can jump out at you. (Or backfire, of course.)&lt;/li&gt;
&lt;li&gt;It&amp;#39;s helpful to get others to tweet you at around the same time. I&amp;#39;ll usually
pop into Campfire and pre-announce a post. If my coworkers decide to tweet it
at the same time, you end up generating a lot of talk on the same link. If
you have overlapping circles of followers, you can build a feeling of urgency
and freshness that is appealing to click on — and retweet.&lt;/li&gt;
&lt;li&gt;Reply to criticism and to compliments over Twitter. It&amp;#39;s sometimes surprising
how many outsiders read public @replies. Not only does replying to someone
directly generate goodwill (regardless of whether or not they ultimately
agree with your position), but you can sometimes generate interest in third
parties that would have otherwise missed your post entirely.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Monitoring tweets&lt;/h2&gt;

&lt;p&gt;On a good post, you&amp;#39;ll see a lot of activity in the first hours and day. The
best ways to monitor that are using &lt;a href="http://favstar.fm"&gt;Favstar&lt;/a&gt; and
&lt;a href="http://fanzter.com/products/summizer"&gt;Summizer&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://favstar.fm"&gt;&lt;img src="http://cl.ly/8b7U/favstar.png" alt="Favstar" class="noclip" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://favstar.fm"&gt;Favstar&lt;/a&gt; was created by &lt;a href="http://twitter.com/timhaines"&gt;Tim Haines&lt;/a&gt; as a way to track who
retweets and stars your tweets on Twitter. I use it as a quick benchmark of how
quickly a post is taking off. It&amp;#39;s helpful to track who exactly is checking
your post out; sometimes you&amp;#39;ll catch some larger players, sometimes you&amp;#39;ll be
able to click through and read some discussion on your article. Sometimes it&amp;#39;s
just fun to have an ego boost.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://fanzter.com/productions/summizer"&gt;&lt;img src="http://cl.ly/8avx/summizer.png" alt="Summizer" class="noclip" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://fanzter.com/products/summizer"&gt;Summizer&lt;/a&gt; is an iPhone app by &lt;a href="http://fanzter.com"&gt;Fantzer&lt;/a&gt; that is effectively
an interface for saved Twitter searches. While there are plenty of Twitter
search apps out there, Summizer does a great job of keep track of read state
(which, surprisingly enough to me, I end up using frequently), and the
interface itself is very quick. I initially assumed that I wouldn&amp;#39;t use
Summizer more than once or twice, but find myself using it often: second only
to my main Twitter client on my phone.&lt;/p&gt;

&lt;h2&gt;Twitter saved search bonus round&lt;/h2&gt;

&lt;p&gt;Another hint for Summizer and Twitter saved searches in general: you can do
some fairly &lt;a href="http://search.twitter.com/advanced"&gt;powerful stuff in your search&lt;/a&gt;. I track the term &amp;quot;zachholman.com&amp;quot;,
which returns tweets that link to this site (which even works through link
shorteners).&lt;/p&gt;

&lt;p&gt;You can also use it as a form of filter. If we just searched Twitter for
&amp;quot;github&amp;quot;, we&amp;#39;d pull in a lot of extra noise: post receive Twitter hooks, blog
posts on pages.github.com domains, etc.  We want to see the &lt;em&gt;discussion&lt;/em&gt;, not
the &lt;em&gt;noise&lt;/em&gt;. A lot of us at GitHub have a search saved similar to &lt;code&gt;github
-merge -commit&lt;/code&gt;, which will strip tweets with &amp;quot;merge&amp;quot; and &amp;quot;commit&amp;quot; in the URL
(which are usually just notification tweets).&lt;/p&gt;

&lt;h2&gt;Footer hacks&lt;/h2&gt;

&lt;p&gt;Right now I have a few things in my footer after my posts. One of which is the
&lt;a href="https://twitter.com/about/resources/tweetbutton"&gt;tweet button&lt;/a&gt;, a brain-dead easy way to let visitors tweet your URL.&lt;/p&gt;

&lt;p&gt;Secondly, I have &lt;a href="http://zachholman.com/2010/02/boastful-a-new-tweetback-library-for-your-blog/"&gt;Boastful&lt;/a&gt;, a tiny jQuery plugin I wrote that
displays the smiling faces of everyone who tweets a link to your post. Humans
are ego-centric. They like seeing their faces in public places. I don&amp;#39;t do
comments on my blog posts, but I do like offering this small bit of community.&lt;/p&gt;

&lt;p&gt;Thirdly, on more substantial posts I&amp;#39;ll add a link to the &lt;a href="http://news.ycombinator.com"&gt;Hacker News&lt;/a&gt;
story submission (either submitted by me or whoever else gets to it first).
This serves as a way to facilitate the discussion that I don&amp;#39;t allow on the
post itself, and it provides a easier connection for Hacker News visitors to my
site to upvote the actual Hacker News submission. I really like this setup:
Hacker News tends to give you some honest, respectful feedback, and exposes you
to movers and shakers in the industry.&lt;/p&gt;

&lt;p&gt;You don&amp;#39;t need to go crazy with these sort of &amp;quot;footer pieces of flair&amp;quot;, but
having a few smart integration points goes a long way.&lt;/p&gt;

&lt;h2&gt;Analytics&lt;/h2&gt;

&lt;p&gt;I hate Google Analytics. I really care about 1) trends, 2) referrals. Anything
more than that is interesting, but a distraction from those first two
expectations. Google Analytics is a pain to use.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://gaug.es"&gt;Gauges&lt;/a&gt; is not.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://gaug.es"&gt;&lt;img src="http://cl.ly/8abL/gauges.png" alt="Gauges" class="noclip" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gauges is a newcomer this year to the stats game, but it&amp;#39;s beautifully-designed
and gets me the information I need quickly (and in real-time, with maps!). The
reason I love Apple is the reason I love Gauges. If you&amp;#39;re feeling that Google
Analytics is too heavy for you, check out Gauges. Seriously.&lt;/p&gt;

&lt;h2&gt;Always Be Closing&lt;/h2&gt;

&lt;p&gt;Look. I loathe that there are jobs in &amp;quot;Marketing&amp;quot;. I hate that very word. But
you can be smart about a few things and get the word spread about your project
or post faster.&lt;/p&gt;

&lt;p&gt;More importantly: everything I&amp;#39;ve said in this post is completely bullshit if
your content is bullshit. I play the social card heavily on the assumption that
people will want to share my content. If I write a crappy post, people won&amp;#39;t
share it and I leave it at that. Get that house in order first, and then from
there you just take steps to make sure more people have the opportunity to talk
about your work.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/Uv56MR682m8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/posts/blog-marketing</feedburner:origLink></entry>
 
 <entry>
   <title>Improving Yourself is Easy</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/S3Ld_GfC-64/improving-yourself-is-easy" />
   <updated>2011-07-20T00:00:00-07:00</updated>
   <id>http://zachholman.com/posts/improving-yourself-is-easy</id>
   <content type="html">&lt;p&gt;For the last four years I&amp;#39;ve set informal goals to become a better Ruby
developer. They looked something like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2008: Contribute to an open source project&lt;/li&gt;
&lt;li&gt;2009: Make it to a Ruby conference&lt;/li&gt;
&lt;li&gt;2010: Maintain some sort of popular open source project&lt;/li&gt;
&lt;li&gt;2011: Speak at a conference&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of these seemed daunting at first. And then I did them. Now I wonder why I
didn&amp;#39;t do all of them earlier. I want you to experience that same progression,
regardless of what goal you might have. It&amp;#39;s easy to improve yourself.&lt;/p&gt;

&lt;h2&gt;2008&lt;/h2&gt;

&lt;p&gt;2008 was before GitHub really started picking up momentum, and as someone
feeling somewhat new to Ruby and to open source in general, figuring out which
project to contribute to and how to do it was fairly challenging. Eventually I
made a few different contributions (one of which was for
&lt;code&gt;restful_authentication&lt;/code&gt; to my future coworker, &lt;a href="https://github.com/technoweenie"&gt;Rick
Olson&lt;/a&gt;, who unceremoniously shot down my patch and made
me whimper in a corner for a few weeks). But I got my other contributions in.&lt;/p&gt;

&lt;h2&gt;2009&lt;/h2&gt;

&lt;p&gt;Being young, dealing with scheduling, and the lack of a company sponsoring my
travels meant heading to a technical conference felt a little out of reach. But
I made it to RailsConf 2009.&lt;/p&gt;

&lt;h2&gt;2010&lt;/h2&gt;

&lt;p&gt;In 2010 I found myself with a couple different open source projects taking off:
both in developer activity (forks of my &lt;a href="https://github.com/holman/dotfiles"&gt;dotfiles&lt;/a&gt;) and in end-user
activity (usage of &lt;a href="https://github.com/holman/boom"&gt;boom&lt;/a&gt;). I learned more about what versioning a
project meant. And releases. And encouraging contributions. It was initially
intimidating, but now it feels so second-nature.&lt;/p&gt;

&lt;h2&gt;2011&lt;/h2&gt;

&lt;p&gt;In 2011, I sent a talk submission to RailsConf. I felt silly: I hadn&amp;#39;t given a
talk before, and choosing the largest Ruby conference seemed an intimidating
first step.  It was accepted, and I gave my talk in May. Now I have four other
talks scheduled for the rest of 2011 so far, including some international
conferences.&lt;/p&gt;

&lt;h2&gt;Being better&lt;/h2&gt;

&lt;p&gt;I felt a little embarrassed putting my timeline at the top of this post.
Everything on that list seems so trivial now that I&amp;#39;ve done it. Of course it&amp;#39;s
easy to contribute to a project. To attend a conference. To prepare a talk.&lt;/p&gt;

&lt;p&gt;But they all felt daunting before I did them.&lt;/p&gt;

&lt;p&gt;A big part of my job involves talking to a lot of software developers, from
Ruby to Cocoa to young to old to stern to playful. And I usually find myself
encouraging people to give a talk. To write blog posts. To publish more open
source.&lt;/p&gt;

&lt;p&gt;I&amp;#39;ll look at them and see the same feeling I felt. It&amp;#39;s not a feeling of
incompetence. It&amp;#39;s a feeling of a lack of belonging. That they&amp;#39;re not ready to
be indoctrinated into the special Club of People Who Are Ready.&lt;/p&gt;

&lt;p&gt;Being Ready is only accomplished after you&amp;#39;ve done something. Before you&amp;#39;ve
done something, it&amp;#39;s daunting. After you&amp;#39;ve done something, it&amp;#39;s easy.&lt;/p&gt;

&lt;p&gt;So do something.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/S3Ld_GfC-64" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/posts/improving-yourself-is-easy</feedburner:origLink></entry>
 
 <entry>
   <title>Double-Shipping Software for Profit</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/_6zM_cyDdZ4/double-shipping-software-for-profit" />
   <updated>2011-07-19T00:00:00-07:00</updated>
   <id>http://zachholman.com/talk/double-shipping-software-for-profit</id>
   <content type="html">&lt;p&gt;Selling a product once is fun, but selling that product twice is wildly
excellent. GitHub does that with &lt;a href="http://fi.github.com"&gt;Firewall
Install&lt;/a&gt;, our installable enterprise GitHub. This talk aims to discuss how
you can repackage your existing product too, by covering code strategies for
parallel codebases, supporting remote server infrastructures, and talking
about the impressively stupid decisions we&amp;#39;ve made.&lt;/p&gt;

&lt;h3&gt;Slides&lt;/h3&gt;

&lt;script src="http://speakerdeck.com/embed/4dd2a3545753085572000001.js?size=preview"&gt;&lt;/script&gt;

&lt;h3&gt;References&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://fi.github.com"&gt;GitHub Firewall Install&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://zachholman.com/2010/07/enslaving-branches-how-github-does-enterprise/"&gt;My post on Enslaving Branches for GitHub FI&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://rubini.us/2011/03/17/running-ruby-with-no-ruby/"&gt;Compiling on Rubinius&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Strategy_pattern"&gt;Strategy Pattern&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://code.flickr.com/blog/2009/12/02/flipping-out/"&gt;Flickr's "Feature Flipping"&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/_6zM_cyDdZ4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/talk/double-shipping-software-for-profit</feedburner:origLink></entry>
 
 <entry>
   <title>Parallaxing Parallax on iOS</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/UoH496eRtSM/parallaxing-parallax-on-ios" />
   <updated>2011-07-01T00:00:00-07:00</updated>
   <id>http://zachholman.com/posts/parallaxing-parallax-on-ios</id>
   <content type="html">&lt;script type="text/javascript" src="/js/plugins/plax.js"&gt;&lt;/script&gt;

&lt;p&gt;GitHub has a bit of a friendly competition complex. When &lt;a href="http://twitter.com/probablycorey"&gt;Corey
Johnson&lt;/a&gt; released &lt;a href="http://probablyinteractive.com/url-hunter"&gt;URL
Hunter&lt;/a&gt;, there was a lot of talk
about how that minigame could be topped. &lt;a href="http://twitter.com/cameronmcefee"&gt;Cameron
McEfee&lt;/a&gt;, the famed designer behind all of the
parallax effects on GitHub&amp;#39;s site (the &lt;a href="https://github.com/404"&gt;404&lt;/a&gt; page, the
&lt;a href="https://github.com/500"&gt;500&lt;/a&gt; page, the &lt;a href="https://github.com/about"&gt;about page&lt;/a&gt;,
and so on) took Corey&amp;#39;s URL bar game and &lt;a href="http://cameronmcefee.com/parallax-url/"&gt;parallaxed
it&lt;/a&gt;. In doing all of this parallax
work, Cameron open sourced his parallax plugin for jQuery itself:
&lt;a href="https://github.com/cameronmcefee/plax"&gt;plax&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Parallax is a perspective-based animation technique: move your mouse and you
simulate moving your frame of reference around. Cameron&amp;#39;s plax only worked
based on mouse movement, though:&lt;/p&gt;

&lt;div style="position: relative; height: 100px; z-index: 1"&gt;
  &lt;a href="http://twitter.com/holman"&gt;&lt;img src="http://gravatar.com/avatar/6f63cde8b16b035280ca615f621a6c8c?s=142" width="35" style="position: absolute; top: 05px; left: 250px; display: inline" id="plax1" /&gt;&lt;/a&gt;
  &lt;a href="http://twitter.com/holman"&gt;&lt;img src="http://gravatar.com/avatar/6f63cde8b16b035280ca615f621a6c8c?s=142" width="55" style="position: absolute; top: 10px; left: 300px; display: inline" id="plax2" /&gt;&lt;/a&gt;
  &lt;a href="http://twitter.com/holman"&gt;&lt;img src="http://gravatar.com/avatar/6f63cde8b16b035280ca615f621a6c8c?s=142" width="75" style="position: absolute; top: 15px; left: 190px; display: inline" id="plax3" /&gt;&lt;/a&gt;
  &lt;a href="http://twitter.com/holman"&gt;&lt;img src="http://gravatar.com/avatar/6f63cde8b16b035280ca615f621a6c8c?s=142" width="90" style="position: absolute; top: 0px; left: 330px; display: inline" id="plax4" /&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;...which means all of these gorgeous animations of this handsome fellow didn&amp;#39;t
work on your favorite iOS device. What a bummer. So I parallaxed his parallax
and &lt;a href="https://github.com/cameronmcefee/plax/pull/6"&gt;added support&lt;/a&gt; for the
accelerometer and gyroscope present in iPhones and iPads, which Apple
generously gave us access to in the iOS 4.3 release last year.&lt;/p&gt;

&lt;p&gt;So now we can do cool things to &lt;a href="http://cloud.github.com"&gt;GitHub&amp;#39;s Cloud&lt;/a&gt;:&lt;/p&gt;

&lt;iframe src="http://player.vimeo.com/video/25872573" width="650" height="366" frameborder="0"&gt;&lt;/iframe&gt;

&lt;h2&gt;Safari&amp;#39;s Accelerometer Support&lt;/h2&gt;

&lt;p&gt;It&amp;#39;s really pretty easy to add this to your own apps and libraries. Apple
exposes the accelerometer to us through &lt;code&gt;DeviceMotionEvent&lt;/code&gt;, a &lt;a href="http://developer.apple.com/library/safari/#documentation/SafariDOMAdditions/Reference/DeviceMotionEventClassRef/DeviceMotionEvent/DeviceMotionEvent.html"&gt;class that
handles &amp;quot;signification change in
motion&amp;quot;&lt;/a&gt;.
(You might also want to take a look at
&lt;a href="http://developer.apple.com/library/safari/documentation/SafariDOMAdditions/Reference/DeviceOrientationEventClassRef/DeviceOrientationEvent/DeviceOrientationEvent.html"&gt;DeviceOrientationEvent&lt;/a&gt;,
too.) The change to plax is pretty straightforward, but it&amp;#39;s really just a
matter of handling the &lt;code&gt;ondevicemotion&lt;/code&gt; event and grabbing the values from that
motion:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ondevicemotion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rotationRate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;beta&lt;/span&gt;
  &lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rotationRate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;alpha&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In this case, &lt;code&gt;rotationRate&lt;/code&gt; is the rate of rotation, which is a bit more
relevant for parallax. You can also grab &lt;code&gt;rotationRate.gamma&lt;/code&gt;, which is the
rotation positive out of the screen on the z axis. Unfortunately &lt;code&gt;rotationRate&lt;/code&gt;
is for those devices with gyroscopes: in other words, iPhone 4 and above. Once
we have the rotation rate pulled from the phone we can pipe that information
into plax and plax handles the coordination of layers based on that.&lt;/p&gt;

&lt;p&gt;Depending on your use case, you also might want to take a look at
&lt;code&gt;accelerationIncludingGravity&lt;/code&gt;, which gives you a measurement of the
acceleration of the movement happening on the device.&lt;/p&gt;

&lt;h2&gt;Todo&lt;/h2&gt;

&lt;p&gt;This at least gives us some real-world parallax support on iOS, which is great.
There&amp;#39;s some improvements that could be made to retaining rotation position in
parallax (which would give it more of a realistic feel), and there&amp;#39;s oodles of
accelerometers in Android phones and in laptops, too. If you&amp;#39;re looking for a
fun hack day, you might want to build in support for those devices (or create a
library abstraction for movement in JavaScript!) and &lt;a
href="https://github.com/cameronmcefee/plax"&gt;send us a pull request&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/UoH496eRtSM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/posts/parallaxing-parallax-on-ios</feedburner:origLink></entry>
 
 <entry>
   <title>VAGRANCEPTION</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/V3GCeO00BsA/vagranception" />
   <updated>2011-06-08T00:00:00-07:00</updated>
   <id>http://zachholman.com/screencast/vagranception</id>
   <content type="html">&lt;p&gt;After the staggering mediocrity of &lt;a href="http://zachholman.com/2011/01/automating-inefficiencies/"&gt;my last screencast&lt;/a&gt;, I immediately made
elaborate plans to create my next screencast. And here it is, five months of
110-hour weeks later. Well, maybe I mostly spent those five months putting it
off. But you can imagine what it&amp;#39;d look like if I spent 110-hour weeks on it!
It would have been magical!&lt;/p&gt;

&lt;p&gt;Instead, I bring you this one.&lt;/p&gt;

&lt;h2&gt;V A G R A N C E P T I O N&lt;/h2&gt;

&lt;p&gt;This stems from my love for &lt;a href="http://vagrantup.com"&gt;Vagrant&lt;/a&gt;, a command-line interface to
&lt;a href="http://www.virtualbox.org"&gt;VirtualBox&lt;/a&gt;, which is Oracle&amp;#39;s open source virtualization software. If you
ever need to build up and tear down virtual machines, do check it out.&lt;/p&gt;

&lt;iframe src="http://player.vimeo.com/video/24707869" width="650" height="366" frameborder="0"&gt;&lt;/iframe&gt;

&lt;h2&gt;The Process&lt;/h2&gt;

&lt;p&gt;So it gets a little complicated at the end. Watch the screencast first — I
don&amp;#39;t want to SPOILER ALERT you all over the place! — but then you can check
out the project &lt;a href="https://github.com/holman/vagranception#readme"&gt;README&lt;/a&gt; to see how all the individual parts are put
together.&lt;/p&gt;

&lt;p&gt;This also gave me a chance to shoot on my new Nikon D5100, for you camera nerds
out there. You guys are so nerdy.&lt;/p&gt;

&lt;h2&gt;Resources&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.virtualbox.org"&gt;Vagrant&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/holman/vagranception"&gt;Project source code on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vagrantup.com"&gt;VirtualBox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.macruby.org"&gt;MacRuby&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.twilio.com"&gt;Twilio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.heroku.com"&gt;Heroku&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.sinatrarb.com"&gt;Sinatra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://gembundler.com"&gt;Bundler&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/V3GCeO00BsA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/screencast/vagranception</feedburner:origLink></entry>
 
 <entry>
   <title>The Most Important Code Isn't Code</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/uSXXppMnopw/documentation" />
   <updated>2011-06-07T00:00:00-07:00</updated>
   <id>http://zachholman.com/posts/documentation</id>
   <content type="html">&lt;p&gt;&lt;img src="http://www.cl.ly/7JWh/documentation.png" class="noclip" alt="Documentation" width="650" height="200" /&gt;&lt;/p&gt;

&lt;p&gt;Documentation is the single most important change I&amp;#39;ve made to my coding style
in the last year.&lt;/p&gt;

&lt;h2&gt;Documentation is Personal&lt;/h2&gt;

&lt;p&gt;I&amp;#39;m not talking about injecting a few comments in front of confusing lines here
and there. I&amp;#39;m talking about taking a firm, consistent view at how you document
your methods, your classes, and your projects, and then sticking to that
mentality. Documentation is mostly described as a way to communicate your
thoughts to other developers, but honestly, other developers can eat it.
&lt;strong&gt;Documentation is the best way to communicate your thoughts to &lt;em&gt;yourself&lt;/em&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;Documentation is Clarity&lt;/h2&gt;

&lt;p&gt;If you don&amp;#39;t have an absolute clarity in the code you&amp;#39;re pushing, it rears its
head by way of bugs, confused coworkers, and slow code. Straightforward
documentation has given me that clarity.&lt;/p&gt;

&lt;p&gt;I typically hate process. From TDD to BDD to Agile to everything else, it
usually feels too cumbersome for me to stick with it. But two mentalities have
really impacted me: &lt;a href="http://tom.preston-werner.com/2010/05/11/tomdoc-reasonable-ruby-documentation.html"&gt;TomDoc&lt;/a&gt; and &lt;a href="http://tom.preston-werner.com/2010/08/23/readme-driven-development.html"&gt;Readme Driven Development&lt;/a&gt;. Both
were designed by &lt;a href="http://twitter.com/mojombo"&gt;Tom Preston-Werner&lt;/a&gt;. Both have documentation at their
core. Though they&amp;#39;re both obviously helpful for other developers who look at
your code, I&amp;#39;ve found them to be extremely helpful to &lt;em&gt;me&lt;/em&gt; as I code.&lt;/p&gt;

&lt;p&gt;Writing the README first means you think about the end-product first. That
seems somewhat silly — I mean, I&amp;#39;m writing this library, don&amp;#39;t I already know
what&amp;#39;s coming next? But that&amp;#39;s usually not the case. More often than not I
would jump straight into the challenging part of the project since I thought
that&amp;#39;s where the substantive part is. It&amp;#39;s not. &lt;strong&gt;The end result is always the
substantive part of your project&lt;/strong&gt;. Forcing myself first to consider the API,
the interface, and the end result led to a clarity that inspired less code and
a more impactful project. &lt;/p&gt;

&lt;p&gt;I feel similarly about TomDoc. TomDoc is a mentality that places emphasis on
clear, straightforward, explicit documentation. Here&amp;#39;s a simple example taken
from the TomDoc spec:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="c1"&gt;# Duplicate some text an abitrary number of times.&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# text  - The String to be duplicated.&lt;/span&gt;
&lt;span class="c1"&gt;# count - The Integer number of times to duplicate the text.&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Examples&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;#   multiplex(&amp;#39;Tom&amp;#39;, 4)&lt;/span&gt;
&lt;span class="c1"&gt;#   # =&amp;gt; &amp;#39;TomTomTomTom&amp;#39;&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Returns the duplicated String.&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;multiplex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You describe your method arguments, and you detail your response. Every time.
It can sometimes feel repetitive, but that repetitive feeling is one of those I
strongly welcome. It improves the clarity of my code. I get more done in less
lines. The documentation style itself is clear, too. I write this blog in John
Gruber&amp;#39;s &lt;a href="http://daringfireball.net/projects/markdown/"&gt;Markdown&lt;/a&gt; because &lt;strong&gt;Markdown looks and feels like plaintext&lt;/strong&gt;. I
use Tom Preston-Werner&amp;#39;s TomDoc because &lt;strong&gt;TomDoc looks and feels like
plaintext&lt;/strong&gt;.  There&amp;#39;s very little interface to learn between writing it down
and rendering it in your head.&lt;/p&gt;

&lt;h2&gt;Documentation is Testable&lt;/h2&gt;

&lt;p&gt;Documenting code in TomDoc has lead me to two big testing personal
&amp;quot;breakthroughs&amp;quot;, if you will. Since you&amp;#39;re required to detail every method
argument, you&amp;#39;re forced from the beginning to consider how those inputs end up
impacting that method. You think about the edge cases explicitly. Conveniently
enough, those edge cases almost always translate into real test cases. I don&amp;#39;t
consistently TomDoc first or write my test first, but they almost always happen
simultaneously, since they effectively work in tandem. One helps you write the
other.&lt;/p&gt;

&lt;p&gt;My second &amp;quot;breakthrough&amp;quot; is realizing that if some method is hard to document,
it&amp;#39;s too big. Ruby in particular has been harping for years that you want
short, focused methods. I know that. Everyone&amp;#39;s known that since their third
week using Ruby. But even if you&amp;#39;ve been writing Ruby for years, you can pretty
quickly fall into the classic &amp;quot;oh I&amp;#39;ll just handle this here too&amp;quot; mentality.
Once I do that, I end up trying to document more method arguments, more
possible method outputs, and it&amp;#39;s just more work. Once that happens, it&amp;#39;s an
obvious reminder that I messed up this method and should break it into two or
three other methods. That means smaller, more resilient and easier-to-test
methods, which directly translate into less brittle code. &lt;/p&gt;

&lt;h2&gt;Documentation is Diffable&lt;/h2&gt;

&lt;p&gt;Over the last year or so, we&amp;#39;ve been adding more and more TomDoc to code that
we push here at GitHub. It&amp;#39;s not high priority or anything, but if you refactor
or touch old code, it&amp;#39;s nice to add documentation for it.&lt;/p&gt;

&lt;p&gt;We&amp;#39;re now at 30-plus employees, and there&amp;#39;s a lot of code flying around. When
someone pushes to a GitHub repository, &lt;a href="http://zachholman.com/posts/why-github-hacks-on-side-projects/"&gt;Hubot&lt;/a&gt;, our trusty
Campfire bot, jumps in and posts a Compare View of the changes:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.cl.ly/7JfY/hubot.png" class="noclip" alt="Campfire Hook" /&gt;&lt;/p&gt;

&lt;p&gt;This hook is important. It&amp;#39;s how everyone at GitHub can see how GitHub is
changing incrementally. The commit messages in Git are helpful to see what&amp;#39;s
happening, but sometimes the commit message and (particularly!) the code
doesn&amp;#39;t really give you a good idea of &lt;em&gt;what&lt;/em&gt; or &lt;em&gt;why&lt;/em&gt; something is changing.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cl.ly/7KUf/compare.png" class="noclip" alt="Compare View" /&gt;&lt;/p&gt;

&lt;p&gt;Seeing the changes in a huge block of documentation in the Compare View on
GitHub ends up being much easier to parse. You can see which arguments got
removed, which new edge case is defended against, what changes are made in the
public API. It&amp;#39;s another tool in your belt to help communicate code changes to
everyone else.&lt;/p&gt;

&lt;h2&gt;Documentation is Marketing&lt;/h2&gt;

&lt;p&gt;I love the idea of documentation as marketing. A good README gets people to
jump into your project much, much quicker. Heavily-documented code means others
can read your project much, much quicker. Heavily-documented code means others
will tend to break your tests less.&lt;/p&gt;

&lt;p&gt;This extends to project websites and documentation as well. In fact, I love
this documentation-as-marketing concept so much that &lt;a href="http://zachholman.com/posts/open-source-marketing/"&gt;I wrote about
it&lt;/a&gt;. Even though I get a lot out of my documentation, that
doesn&amp;#39;t mean that it can&amp;#39;t serve as a promotional vehicle for my project,
either.&lt;/p&gt;

&lt;h2&gt;Documentation helps you in the bedroom&lt;/h2&gt;

&lt;p&gt;Well, I&amp;#39;m still trying to test the validity of that. But documenting your code
is cool as hell. More importantly, it makes me feel more confident about my own
code. You don&amp;#39;t need to go full-bore Readme Driven Development, you don&amp;#39;t need
to use TomDoc, you don&amp;#39;t need to follow any particular process. But improving
your documentation skills &lt;em&gt;will&lt;/em&gt; make you a better developer.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/uSXXppMnopw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/posts/documentation</feedburner:origLink></entry>
 
 <entry>
   <title>Fame</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/EEMb2i2J-Ew/fame" />
   <updated>2011-05-13T00:00:00-07:00</updated>
   <id>http://zachholman.com/posts/fame</id>
   <content type="html">&lt;p&gt;A patrician in ancient Rome might be able to make a name for himself around his
neighborhood over the course of his lifetime.&lt;/p&gt;

&lt;p&gt;By the time the printing press gained widespread usage, an educated citizen
might be able to write to her newspaper and reach thousands over a few days.&lt;/p&gt;

&lt;p&gt;Today, a tenth grader who perhaps may not be our finest societal achievement
judging from a cursory glance at her neck tattoo that proudly proclaims &amp;quot;To hot
4 you&amp;quot;, drunkenly sits on her keyboard and mistakenly sends out a tweet that
six hundred thousand people read within the hour.&lt;/p&gt;

&lt;p&gt;Does this blow your mind? Does it? Because &lt;strong&gt;it should fucking blow your
mind&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;Power&lt;/h2&gt;

&lt;p&gt;A thousand years ago, kings and emperors would kill to have this power. At no
other time in human history have even the richest, most famous humans been able
to wield the power your average teenager has access to on their iPhone today.&lt;/p&gt;

&lt;p&gt;We&amp;#39;ve never been so closely networked before. Your tweet on Twitter isn&amp;#39;t just
for your direct followers anymore... each of your followers is a click away
from broadcasting it to &lt;em&gt;their&lt;/em&gt; followers. It&amp;#39;s a simple concept, but let
that sink in. Every time someone retweets my blog post or my tweet or
something I&amp;#39;ve done, I&amp;#39;m being exposed to &lt;em&gt;their&lt;/em&gt; followers, who in turn can
perpetuate the cycle.&lt;/p&gt;

&lt;p&gt;Classic network effect. But that doesn&amp;#39;t make it any less amazing.&lt;/p&gt;

&lt;h2&gt;Fast Starts&lt;/h2&gt;

&lt;p&gt;It&amp;#39;s remarkable how quickly this can happen. When &lt;a href="http://zachholman.com/2010/10/facelette-on-techcrunch-in-three-hours-and-zero-dollars/"&gt;I wrote
Facelette&lt;/a&gt;, I had a good idea that it was going to go viral as soon
as I released it. I didn&amp;#39;t even get that far, actually; my coworkers tweeted it
as soon as I pasted in the URL to our company chat, and within a couple minutes
it was clear I couldn&amp;#39;t put it back in the bag. There were more than 2,500
tweets in the first 24 hours, and that all stemmed from those initial few
tweets.&lt;/p&gt;

&lt;p&gt;I saw the same phenomena happen for my coworker &lt;a href="http://twitter.com/probablycorey"&gt;Corey Johnson&lt;/a&gt; when he
released &lt;a href="http://probablyinteractive.com/url-hunter"&gt;URL Hunter&lt;/a&gt;, a simple game in your browser&amp;#39;s URL bar.
Because of how easy word-of-mouth is today, he was getting thousands of tweets
about this little hack, which led to interviews in tech magazines and
lol-worthy acquisition inquiries. All from a simple idea and a human compulsion
to share cool shit.&lt;/p&gt;

&lt;p&gt;Think about this stuff the next time you launch your product. Or tweet. Or post
a photo. It&amp;#39;s good for you to stop being so goddamn jaded and realize that
we&amp;#39;ve built a fucking awesome society.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/EEMb2i2J-Ew" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/posts/fame</feedburner:origLink></entry>
 
 <entry>
   <title>Open Source Doesn't Just Market Itself</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/l-vAFh-_B4g/open-source-marketing" />
   <updated>2011-04-18T00:00:00-07:00</updated>
   <id>http://zachholman.com/posts/open-source-marketing</id>
   <content type="html">&lt;p&gt;&lt;img src="http://cl.ly/664F/meaning-of-life.png" alt="Open Source" title="Just imagine the Pull Requests this repository would attract." class="noclip" width="650" height="150" /&gt;&lt;/p&gt;

&lt;p&gt;Hip trendy startup software folk hate &amp;quot;Marketing Guys&amp;quot;. Usually for good
reason, since they tend to swoop in and steal the best donuts at the conference
breakfasts by distracting you with buzzwords like &amp;quot;SEO&amp;quot; or &amp;quot;global
goal-oriented output funnels&amp;quot; or &amp;quot;Rebecca Black&amp;quot;. &lt;/p&gt;

&lt;p&gt;This mentality drifts over to open source software, too. We like to think that
open source is pure, that it&amp;#39;s unadulterated. That marketing an open source
project is silly.&lt;/p&gt;

&lt;p&gt;That&amp;#39;s just silly.&lt;/p&gt;

&lt;h2&gt;GitHub&lt;/h2&gt;

&lt;p&gt;Prior to GitHub, word about open source projects travelled primarily through
word-of-mouth and messenger bicyclists. The largest open source project had
three users and two developers. I think it involved a lot of twine and glitter.&lt;/p&gt;

&lt;p&gt;Anyway, I digress. When GitHub launched, you could log into your dashboard and
see the News Feed front and center, giving you a glimpse into what developers
you&amp;#39;re following are working on, what they&amp;#39;re watching, and so on.&lt;/p&gt;

&lt;p&gt;This was insidiously subtle, but ended up being one of the strongest advantages
of moving your projects to GitHub. Your followers watch your projects, which in
turn gives you more exposure to &lt;em&gt;their&lt;/em&gt; followers and so on.&lt;/p&gt;

&lt;p&gt;I think the problem is that a lot of developers stop there. They see a modicum
of support from their GitHub followers and call it a day.&lt;/p&gt;

&lt;p&gt;You should do more!&lt;/p&gt;

&lt;h2&gt;Why?&lt;/h2&gt;

&lt;p&gt;Marketing your projects is important. Open source is fantastic, and noble, and
awesome, yes. But if you believe your project has value — which you probably
do, since you spent time on it — you should try to get it in the hands of as
many people as possible.&lt;/p&gt;

&lt;p&gt;Get your project&amp;#39;s name out there. I can&amp;#39;t tell you the number of times I
stumble on this tiny, underfollowed project and it completely blows me away.
This isn&amp;#39;t an ego thing; &lt;em&gt;I want you&lt;/em&gt; to whore yourself out. Did you spend two
days hacking out a way to convert my data between two services I use? I would
absolutely &lt;strong&gt;love&lt;/strong&gt; to discover that. &lt;em&gt;If it&amp;#39;s worthwhile to you, it&amp;#39;s probably
worthwhile to someone else.&lt;/em&gt; They won&amp;#39;t use it unless they learn about it.&lt;/p&gt;

&lt;p&gt;The easiest thing to do is to tweet about your project. Retweets can be
extremely beneficial to a new project, and people honestly love to tweet 1)
links, and 2) cool things. It makes them look hip. That&amp;#39;s great; help them look
hip by tweeting your new projects and code snippets.&lt;/p&gt;

&lt;h2&gt;Documentation as marketing&lt;/h2&gt;

&lt;p&gt;My favorite marketing of all time is documentation. We all loathe sleazy
marketing, and by definition I like to think documentation can&amp;#39;t be sleazy
because it solves a real purpose: teaching everyone about the project.&lt;/p&gt;

&lt;p&gt;The best part, though, is that documentation is linkable. It&amp;#39;s indexable.
It&amp;#39;s tweetable. Particularly if you have a nice, coherent one-page overview of
your project that lets people jump in and immediately &amp;quot;get&amp;quot; it. Check out
&lt;a href="http://gembundler.com"&gt;Bundler&amp;#39;s&lt;/a&gt; docs. Or the &lt;a href="http://guides.rubyonrails.org"&gt;Rails
Guides&lt;/a&gt;. Or the interactive &lt;a href="http://try.redis-db.com"&gt;Try
Redis&lt;/a&gt; app. They&amp;#39;re very inviting, very welcoming
glimpses into the project. As much as I absolutely adore a nice README on
GitHub, they still can&amp;#39;t be as impactful as a thoughtfully-designed page.&lt;/p&gt;

&lt;h2&gt;Your success is our success&lt;/h2&gt;

&lt;p&gt;This matters to me because the more everyone markets their projects, the better
off we all are. It&amp;#39;s not a zero-sum game. Better documentation, better
relevance in search engine results, more project activity, more contributions,
happier users. I like it.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/l-vAFh-_B4g" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/posts/open-source-marketing</feedburner:origLink></entry>
 
 <entry>
   <title>Why GitHub Hacks on Side Projects</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/Y8YSmK7pKtI/why-github-hacks-on-side-projects" />
   <updated>2011-04-04T00:00:00-07:00</updated>
   <id>http://zachholman.com/posts/why-github-hacks-on-side-projects</id>
   <content type="html">&lt;p&gt;&lt;img src="http://cl.ly/5eos/hubot.png" alt="Hubot" title="Hubot is kind of a freak of code nature at this point." class="noclip" width="650" height="231" /&gt;&lt;/p&gt;

&lt;p&gt;GitHub employees have gotten very good at writing irrelevant code.&lt;/p&gt;

&lt;p&gt;In my &lt;a href="http://zachholman.com/2011/01/automating-inefficiencies/"&gt;Automating
Inefficiencies&lt;/a&gt;
screencast, I showed some goofy ways we use animated gifs, inside jokes, and
hacks to make our Campfire chat room more fun. Some days we&amp;#39;ll spend a decent
chunk of work time on these projects. They don&amp;#39;t directly contribute to our
bottom line, most of these projects won&amp;#39;t be released publicly, and the code
quality itself is questionable.&lt;/p&gt;

&lt;p&gt;I couldn&amp;#39;t be happier about that.&lt;/p&gt;

&lt;p&gt;To take one example: Hubot, our valiant Campfire bot, has continued to grow in
complexity. A tiny list of his (current) capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;unlock the door to our office&lt;/li&gt;
&lt;li&gt;print out a list of the people currently in the office based on their wifi presence&lt;/li&gt;
&lt;li&gt;find an apartment in the area to rent&lt;/li&gt;
&lt;li&gt;deploy GitHub&lt;/li&gt;
&lt;li&gt;&lt;code&gt;say&lt;/code&gt; an arbitrary string over the office speakers&lt;/li&gt;
&lt;li&gt;play an audio sample of &lt;a href="http://www.last.fm/music/Deadmau5"&gt;deadmau5&lt;/a&gt; to everyone through hacked Propane HTML5 &lt;code&gt;&amp;lt;audio&amp;gt;&lt;/code&gt; tags&lt;/li&gt;
&lt;li&gt;give you a quote from any movie or TV show&lt;/li&gt;
&lt;li&gt;tell you the build status of any git branch&lt;/li&gt;
&lt;li&gt;track and map packages&lt;/li&gt;
&lt;li&gt;SMS any GitHubber from Campfire&lt;/li&gt;
&lt;li&gt;embed a seven day weather forecast&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We&amp;#39;re building more and more into Hubot every day. (Before you ask, no, he&amp;#39;s
not open source yet, and yes, a few people are working on that.) &lt;em&gt;Update,
October 25, 2011: &lt;a href="https://github.com/blog/968-say-hello-to-hubot"&gt;Hubot is open
source&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;Embrace your newbies&lt;/h2&gt;

&lt;p&gt;The importance, in my mind, is not that Hubot can do all of these really cool
things. That&amp;#39;s fun. But what&amp;#39;s really important is Hubot is a &lt;strong&gt;shared side
project&lt;/strong&gt; within GitHub. He&amp;#39;s a &lt;a href="http://nodejs.org"&gt;node.js&lt;/a&gt; bot, so most
developers with a working knowledge of JavaScript can easily contribute to him.
I get a kick out of seeing our latest hire add something funny or interesting
to Hubot in their first week of employment; doing so offers a real sense of
ownership and belonging when everything else is new around you.&lt;/p&gt;

&lt;p&gt;Joining any sizeable organization is daunting. Having an open, shared space to
explore together is important.&lt;/p&gt;

&lt;h2&gt;Make your mouth do that smile thing&lt;/h2&gt;

&lt;p&gt;It&amp;#39;s also a pleasant distraction. I love what I work on and most days are a
blast, but even fun jobs can be a grind from time to time. It&amp;#39;s nice to take a
break mentally and get jacked up on something &lt;strong&gt;exciting&lt;/strong&gt;. More than once I&amp;#39;ve
found myself hitting a wall, switching gears to Hubot or a few other GitHub
projects, working heads-down for an hour or three, and then discovering I&amp;#39;m
ready to slaughter the original problem I had.&lt;/p&gt;

&lt;p&gt;Programmer productivity is not impacted by number of hours; it&amp;#39;s impacted by
the &lt;strong&gt;quality&lt;/strong&gt; of those hours.&lt;/p&gt;

&lt;h2&gt;Culture&lt;/h2&gt;

&lt;p&gt;You should build out a side project culture. A Campfire bot is natural for us,
since we spend so much time in Campfire, but there&amp;#39;s plenty of other areas.
Hack on your continuous integration server. An app that picks where you&amp;#39;re
having lunch that day. A miniapp that collects and stores employee-created
animated gifs. A continuous integration animated lunch machine. It doesn&amp;#39;t
matter what it is; if it improves the lives of your coworkers or makes them
laugh, it helps build a stronger company culture. And that&amp;#39;s cool.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/Y8YSmK7pKtI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/posts/why-github-hacks-on-side-projects</feedburner:origLink></entry>
 
 <entry>
   <title>Your Talk Looks Like Crap</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/r67Fwh9ejQQ/your-talk-looks-like-crap" />
   <updated>2011-03-21T00:00:00-07:00</updated>
   <id>http://zachholman.com/2011/03/your-talk-looks-like-crap</id>
   <content type="html">&lt;p&gt;Chances are, your slides look like crap.&lt;/p&gt;

&lt;p&gt;It shouldn&amp;#39;t be that way. The presentation you give is undermined by your
decision to use that cutesy 10-point serif. Luckily, you don&amp;#39;t need a lot of
design chops to improve the way you present yourself.&lt;/p&gt;

&lt;h2&gt;Slides&lt;/h2&gt;

&lt;p&gt;From the conferences I&amp;#39;ve gone to, certainly a number of people &amp;quot;get&amp;quot; it. Great
slides, very readable, pleasant to stare at for 50 minutes. But those
presenters are in the distinct minority.&lt;/p&gt;

&lt;p&gt;We want to live in an idealized world where the content of your talk is what
people pay attention to. But that&amp;#39;s far from reality. &lt;strong&gt;People base their
opinion of your talk, in part, on your slides&lt;/strong&gt;. Maybe it&amp;#39;s unpleasant to think
about, but pleasantries don&amp;#39;t dictate realities.&lt;/p&gt;

&lt;p&gt;It&amp;#39;s hard for me to remember a terrible presentation with a great set of
slides. It&amp;#39;s hard for me to remember a great presentation with a terrible set
of slides. Good speakers pay attention to everything: how their slides look,
how they speak, how their content comes across.&lt;/p&gt;

&lt;p&gt;It may sound like you need a fabulous slide deck to make an impact. You don&amp;#39;t.
I&amp;#39;ve been in plenty of presentations where I suspected the speaker was
uncomfortable with their design talents, so they instead opted for simple, huge
text on white or black backgrounds for every slide. &lt;em&gt;That&amp;#39;s great&lt;/em&gt;. Those very
basic concepts — huge, readable, minimal text — will immediately push you ahead
of 90% of everyone else. No joke.&lt;/p&gt;

&lt;p&gt;On-screen code is incredibly important, too. There&amp;#39;s something about putting
code samples on-screen that leads decent presenters to just say &lt;em&gt;Oh fuck it!
That&amp;#39;s fine!&lt;/em&gt; Code samples are a fragile move in the first place, since they
require a more intensive cognitive process on the audience&amp;#39;s part to understand
what&amp;#39;s going on. On top of that, syntax highlighting makes it hard to read. A
speaker at the last conference I went to had 20 lines of code on one slide,
with black-on-grey text (except for the line he was talking about, which was
white-on-grey). It&amp;#39;s insane.&lt;/p&gt;

&lt;p&gt;Put yourself in your audience&amp;#39;s shoes. Think about how the design of your
slides augments your talk, rather than detracts from it.&lt;/p&gt;

&lt;h2&gt;Developer Design&lt;/h2&gt;

&lt;p&gt;Developers aren&amp;#39;t &amp;quot;supposed&amp;quot; to design, I know. And it&amp;#39;s a very personal thing:
some people are more artistically inclined than others, and I&amp;#39;m not expecting
every developer to be able to pass some university art school program. What I
am saying is that design is important, and you should care about how you
present yourself. Designers can get by with fancy, intricate designs, but you&amp;#39;d
be surprised at how easy and powerful a simple, no-frills approach can be.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/r67Fwh9ejQQ" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2011/03/your-talk-looks-like-crap</feedburner:origLink></entry>
 
 <entry>
   <title>OS X Isn't for Developers</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/0_8OyPio8QA/osx-isnt-for-developers" />
   <updated>2011-03-10T00:00:00-08:00</updated>
   <id>http://zachholman.com/2011/03/osx-isnt-for-developers</id>
   <content type="html">&lt;p&gt;Apple had about 2.06 percent of the US desktop market in 2003. By 2010, OS X
had about 10.9% of the market.&lt;sup&gt;&lt;a href="http://en.wikipedia.org/wiki/Macintosh#Market_share_and_user_demographics"&gt;1&lt;/a&gt;&lt;/sup&gt; There&amp;#39;s a slew of
reasons for this growth, but I think a large part of it is the migration of
software developers from Windows to OS X starting in the early 2000&amp;#39;s.
Attracted by the reasonable UNIX toolchain and the straightforward usability
approach, more and more geeks adopted OS X as their primary machines, saw it
also doubled as a decent computer for non-techies, and its popularity grew from
their recommendations.&lt;/p&gt;

&lt;p&gt;This wasn&amp;#39;t just about Objective-C developers. Java, Ruby, Python, Perl, and
PHP communities all found a home for themselves in OS X. That Apple provided
first-class, installed-by-default support for all of those languages
dramatically lowered the barriers for the technically-inclined to dabble.&lt;/p&gt;

&lt;h2&gt;gcc&lt;/h2&gt;

&lt;p&gt;A blight on this installed-by-default support is the lack of compilers on OS X.
The recommended course of action is to pull out your OS X installation CD,
install Xcode, and you&amp;#39;ll get the specialized gcc builds from Apple customized
for Darwin. This, again, is not about Objective-C developers, since they will
need to install Xcode regardless. This is about the rest of the language
ecosystem that grew on OS X. For example, Ruby&amp;#39;s predominant package manager,
RubyGems, can allow developers to drop down to languages like C for
additional speed or functionality.&lt;/p&gt;

&lt;p&gt;For years this blight was a pain, but bearable. If you wanted to install a gem
that needed to build C extensions, you just needed to remember to find your
install DVD, install Xcode, and go for it. With the growth of the internet,
pretty quickly the process switched to downloading the installer from apple.com
instead. That was somewhat bearable when Xcode 2.1 was less than 800MB.&lt;/p&gt;

&lt;h2&gt;Xcode 4&lt;/h2&gt;

&lt;p&gt;This week, Apple released Xcode 4. It clocks in at a 4.5GB download, and is $4.99
in the AppStore. This is the first time Apple&amp;#39;s charged for Xcode. It&amp;#39;s
possible that this will change before OS X Lion ships, but it&amp;#39;s still a
troubling prospect today.&lt;/p&gt;

&lt;p&gt;If I want to release a great new Ruby gem that uses a C extension or library, I
need to ask prospective users of that gem to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spend $4.99 in the App Store&lt;/li&gt;
&lt;li&gt;Download a large 4.5GB file&lt;/li&gt;
&lt;li&gt;Spend a decent amount of time installing XCode&lt;/li&gt;
&lt;li&gt;Sacrifice 15GB of disk space to an app they likely won&amp;#39;t use&lt;/li&gt;
&lt;li&gt;Install my gem&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;It&amp;#39;s not about the money&lt;/h3&gt;

&lt;p&gt;Though I don&amp;#39;t think Apple should charge for Xcode, $5.00 isn&amp;#39;t a lot of money
to Cocoa developers... I suspect most would pay a lot more. It is a lot of
money to someone who just wants to try a gem, to someone who has to justify a
business expense, to someone who isn&amp;#39;t old enough for a credit card. It&amp;#39;s the
act of throwing up such a huge barrier to a casual, interested user that is
offensive.&lt;/p&gt;

&lt;h3&gt;It&amp;#39;s not about the language&lt;/h3&gt;

&lt;p&gt;I bring up Ruby because I&amp;#39;m a Rubyist, but it doesn&amp;#39;t just affect Ruby
developers. It affects &lt;em&gt;all&lt;/em&gt; developers. One only needs look at &lt;a href="https://github.com/mxcl/homebrew/tree/master/Library/Formula"&gt;Homebrew&amp;#39;s
Formula directory&lt;/a&gt; to see all of the software this impacts.&lt;/p&gt;

&lt;p&gt;The thing that kills me about this is language transfer. I like building
general-purpose libraries. &lt;a href="https://github.com/holman/boom"&gt;boom&lt;/a&gt; and &lt;a href="https://github.com/holman/stars"&gt;stars&lt;/a&gt;, for example, can be
used without any knowledge of Ruby. If someone goes outside of their comfort
zone into a language they&amp;#39;re unfamiliar with, it&amp;#39;s important to make that
process as smooth as possible. On OS X, it&amp;#39;s getting worse and worse.&lt;/p&gt;

&lt;h3&gt;It&amp;#39;s not about the platform&lt;/h3&gt;

&lt;p&gt;Okay, it is. It&amp;#39;s Apple&amp;#39;s fault for not including gcc by default in OS X. But
what I mean by this is that &lt;strong&gt;this issue impacts all other platforms&lt;/strong&gt;. As an
industry, we want &lt;em&gt;more&lt;/em&gt; people building libraries of &lt;em&gt;all sorts&lt;/em&gt; in &lt;em&gt;all
languages&lt;/em&gt;. It doesn&amp;#39;t matter if you&amp;#39;re sitting comfortably in your
self-compiled BSD world using your favorite free build chains... we want every
facet of our industry to be pushing the envelope. Projects in the language you
don&amp;#39;t use may inspire you down the road to build something you would use.&lt;/p&gt;

&lt;p&gt;By making it more difficult to ship compilable code, we miss out on faster
interpreted-language libraries. We miss out on easy abstractions to rock-solid,
battle-tested C libraries. We make it harder for people to dabble.&lt;/p&gt;

&lt;h2&gt;Fixes&lt;/h2&gt;

&lt;p&gt;There&amp;#39;s three scenarios here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apple releases their gcc package&lt;/strong&gt;, installs it in Lion by default, or
otherwise makes it available. This would be excellent. The holy grail would
be if Homebrew could use this and we could just run &lt;code&gt;brew install gcc&lt;/code&gt;. It
would be a huge, huge impact to our community.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Someone else releases gcc for a Mac&lt;/strong&gt;. Again, this would lead to a &lt;code&gt;brew
install gcc&lt;/code&gt;. This would be great, and possibly more likely than waiting on
Apple to do the right thing. I&amp;#39;m just an interpreted language asshole though,
so I really don&amp;#39;t have much of a clue as to how in-depth a challenge it would
be to compile gcc for Apple&amp;#39;s system frameworks. My guess is it&amp;#39;s daunting,
otherwise we&amp;#39;d have it three years ago.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nothing happens and things get shittier&lt;/strong&gt;. This is probably the most
likely. It&amp;#39;s also the most depressing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It&amp;#39;s a frustrating position to be in. We are, of course, subject to Apple&amp;#39;s
whims on this. Free software advocates will point out that they&amp;#39;ve been saying
the same thing for years, and that&amp;#39;s true- we all give up some flexibility by
being on OS X. It&amp;#39;s a tradeoff. What is dismaying is that, all things
considered, OS X has been a wonderful boon to software development in general
in the last decade. They&amp;#39;ve done a lot of things right. You still won&amp;#39;t see PHP
installed on Windows any time soon.&lt;/p&gt;

&lt;p&gt;I just hope Apple has an interest in making this decade as fruitful for
software developers as the last decade. Seeing OS X dwindle as a developer
platform would be such a waste.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/0_8OyPio8QA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2011/03/osx-isnt-for-developers</feedburner:origLink></entry>
 
 <entry>
   <title>I Liked It When Quick Bars Got Me Drunk</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/CmZ-k0mwOqk/drunk-quick-bar-lols" />
   <updated>2011-03-04T00:00:00-08:00</updated>
   <id>http://zachholman.com/2011/03/drunk-quick-bar-lols</id>
   <content type="html">&lt;p&gt;Twitter pushed an update for Twitter for iPhone yesterday that mostly centered
around the new &amp;quot;Quick Bar&amp;quot;. The Quick Bar is a new technological innovation
that brings the power of a business plan to Twitter, Inc.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cl.ly/51io/lolquickbar.png" title="srsly, Twitter's Quick Bar sucks" alt="Twitter Quick Bar" /&gt;&lt;/p&gt;

&lt;p&gt;With this new update, I can finally forfeit that additional one-tenth of my
screen real estate I&amp;#39;ve been meaning to shed. A beautiful five-tweet
vertically-stacked display can miraculously, at just the click of an AppStore
update button, turn into four tweets. Or three! I can also gain an ever-present
UI element constantly informing me about mysterious subjects like &amp;quot;Friday&amp;quot; or
&amp;quot;blackpeoplemovies&amp;quot; or &amp;quot;Donald Trump&amp;quot;. Sometimes, if I&amp;#39;m really lucky, it will
inform me about a really neat product from a company that is &lt;em&gt;so&lt;/em&gt; neat that the
company needs to pay Twitter money to help promote it.&lt;/p&gt;

&lt;p&gt;How does Twitter gain such technological insights into this market? Is it the
one developer they hire to work on the Mac, iPhone, and iPad apps? Is it
because that one developer only tweets every twenty days? Is it because, even
though that one developer is strapped for time, he usually makes good UI
decisions and this is very clearly a top-down example where Twitter executives
wanted to insert their Monetary Acquisition Strategy into their popular product
regardless of how horrendously misguided the implementation was? I&amp;#39;ll let you
decide! They&amp;#39;re all just so exciting!&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/CmZ-k0mwOqk" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2011/03/drunk-quick-bar-lols</feedburner:origLink></entry>
 
 <entry>
   <title>Winning San Francisco's Startup Scene</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/OnIx4aFKxqU/san-francisco" />
   <updated>2011-02-28T00:00:00-08:00</updated>
   <id>http://zachholman.com/2011/02/san-francisco</id>
   <content type="html">&lt;p&gt;I moved to the Bay Area right after I finished school a few years ago. Luckily,
as a recent college graduate, I knew everything there was to know about life.
Easy as pie! Give me my VC check, dammit, I&amp;#39;m ready!&lt;/p&gt;

&lt;p&gt;I&amp;#39;ve since come to understand that maybe there was a lot I&amp;#39;ve learned about San
Francisco since then.&lt;/p&gt;

&lt;h2&gt;You&lt;/h2&gt;

&lt;p&gt;This post is me trying to lay some knowledge on naïve Zach Holman circa 2008.
It&amp;#39;s a collection of things I&amp;#39;ve fretted about and heard others stress about.
If you&amp;#39;re about to move to San Francisco, if you&amp;#39;re in school and thinking
about moving out here, or if you&amp;#39;re already here and want to make the most of
it, this may be relevant to your interests.&lt;/p&gt;

&lt;p&gt;Usual disclaimer applies: this is my outlook on startup life in San Francisco,
and you may disagree. That&amp;#39;s cool, I don&amp;#39;t mind. Let me buy you a beer.&lt;/p&gt;

&lt;h2&gt;San Francisco vs. the Bay Area&lt;/h2&gt;

&lt;p&gt;There&amp;#39;s a lot of debate on where to live: in The City (which always means San
Francisco), or somewhere more suburban like Palo Alto or Mountain View. I&amp;#39;ve
lived in Palo Alto before moving to San Francisco, and it really depends on
what you&amp;#39;re looking for. If you want to be out barhopping more often, you&amp;#39;ll
want to head to the City. If a less stressful, more laid-back atmosphere is
more important, try to pick somewhere on the Peninsula.&lt;/p&gt;

&lt;p&gt;If you do choose San Francisco, the next thing you&amp;#39;ll ask is where to live. San
Francisco is the most neighborhood-y city I&amp;#39;ve ever heard of: within a three
block walk you could hit four neighborhoods, all with a &lt;em&gt;completely&lt;/em&gt; different
feel and population. Some of them have more drugs than residents. Your best bet
is to just spend a few weeks here with a friend or in a hotel, scope out which
neighborhood initially interests you, and pull the trigger. You&amp;#39;ll probably end
up moving in a year anyway once you figure out what you really want.&lt;/p&gt;

&lt;h2&gt;Get drunk a lot&lt;/h2&gt;

&lt;p&gt;If you don&amp;#39;t drink much yet, you should. Part of what makes San Francisco great
is the technical meetups in the area: lots of conferences, lots of
presentations, lots of small tutorials. Those are all well and fun, of course —
it&amp;#39;s great to be exposed to the new hotness — but I&amp;#39;ve found them to be pretty
lame to meet new people. Every time you meet someone you get the feeling that
you&amp;#39;re walking through the professional steps: 1) name, 2) company, 3)
technologies used 4) uh, okay, have a good one. These are the single-serving
friends that Fight Club warned you about. It&amp;#39;s fine if you want to pass the
time, but if you want to have meaningful conversations, debates, general
fisticuffs about scalability of languages, you&amp;#39;ll need to go drink some
alcohol. Preferably: lots.&lt;/p&gt;

&lt;p&gt;San Francisco is a great bar town. It&amp;#39;s tiny geographically, so there&amp;#39;s a good
chance you can get a drunk cab home for $15 bucks or less from anywhere in the
city. Perhaps it&amp;#39;s because of that, perhaps it&amp;#39;s because everyone&amp;#39;s stressed
out, but startup workers love to get their drink on. And it&amp;#39;s great.  You can
be talking about some software project and a random stranger will overhear you
and jump into it (because they, inevitably, are also in the tech industry).
These are the meaningful relationships you&amp;#39;ll build as you live and work here.
Make sure you follow them on Twitter while you&amp;#39;re at it, too- it&amp;#39;s surprising
how much of a bond you can make over tweets after you&amp;#39;ve initially had a few
beers.&lt;/p&gt;

&lt;p&gt;It&amp;#39;s important to cultivate these deeper relationships, because:&lt;/p&gt;

&lt;h2&gt;San Francisco is fuckin&amp;#39; small&lt;/h2&gt;

&lt;p&gt;I mentioned it&amp;#39;s small geographically, but the actual tech community is really
startlingly small. You&amp;#39;ll be surprised at how many of your groups of friends
know each other. And &lt;strong&gt;everyone is hiring&lt;/strong&gt;. San Francisco must not give five
fucks about the national economy, because it&amp;#39;s some bizarro world where no one
can ever find anyone to hire. If you&amp;#39;re looking for a job, virtually everyone
is either hiring at their own company or can immediately name five friends at
other companies that are hiring. The importance of knowing people is, well,
important.&lt;/p&gt;

&lt;p&gt;It&amp;#39;s not just for hiring, either: it&amp;#39;s marketing, it&amp;#39;s funding, it&amp;#39;s technology
resources. These are the people that will tweet and blog about you when you
launch. They&amp;#39;ll forward your name on to their VC friends. They&amp;#39;ll help you out
and suggest projects and technologies to look at. For as much cutthroat
competition there is in the Valley, it&amp;#39;s an incredibly networked and
positive-thinking community. Everyone tends to lend a helping hand.&lt;/p&gt;

&lt;h2&gt;San Francisco rockstars&lt;/h2&gt;

&lt;p&gt;One last thing I&amp;#39;ve noticed: the &amp;quot;rockstar&amp;quot; programmer. There&amp;#39;s a lot of hero
worship in the Bay Area, for good reason: the meetup you&amp;#39;ll go to will probably
have the authors of your favorite language, framework, or company there.&lt;/p&gt;

&lt;p&gt;It&amp;#39;s amazing, when you think about it. Imagine you&amp;#39;re an actor: you&amp;#39;re not
going to be able to pound tequila shots with Will Smith or Natalie Portman very
easily. Imagine you&amp;#39;re a dentist: you&amp;#39;re not going to be able to do a keg stand
with the inventor of that new bicuspid treatment, because no one knows who the
fuck did that.&lt;/p&gt;

&lt;p&gt;That said, I love a good stereotype, and the stereotype for nerds is that
they&amp;#39;re typically pretty nice people. I&amp;#39;ve found that to be completely accurate
for these &amp;quot;rockstar&amp;quot; developers. Ask them questions, buy them a beer, get them 
to buy &lt;em&gt;you&lt;/em&gt; a beer. It&amp;#39;s cliché, but they&amp;#39;re not any different than you or me.
Most of them are shy anyway. I just always cringe when I see someone completely
flipping out after seeing this person across the room that they know only 
through their online reputation. And it does happen frequently. Don&amp;#39;t be that 
jive turkey.&lt;/p&gt;

&lt;h2&gt;Startup cultures&lt;/h2&gt;

&lt;p&gt;I&amp;#39;m not saying that there aren&amp;#39;t legitimately great startup cultures rising up
around the globe; there are. And there are great companies and great products
being built everywhere. But I am saying that the Bay Area is the major league
and will be for quite some time. You should drop by.&lt;/p&gt;

&lt;p&gt;It&amp;#39;s a good place to be. Hopefully this&amp;#39;ll help out if you ever find yourself
in San Francisco, and if it doesn&amp;#39;t, let&amp;#39;s throw down into fisticuffs at the
bar while we talk about that new bicuspid treatment. I hear it&amp;#39;s pretty rad.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/OnIx4aFKxqU" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2011/02/san-francisco</feedburner:origLink></entry>
 
 <entry>
   <title>New Apple Patent Shows iPhone 6 Dispensing Ice Cream</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/kqRL4Ria09w/new-apple-patent-shows-iphone-6-dispenses-ice-cream" />
   <updated>2011-02-21T00:00:00-08:00</updated>
   <id>http://zachholman.com/2011/02/new-apple-patent-shows-iphone-6-dispenses-ice-cream</id>
   <content type="html">&lt;p&gt;No, fuck that. This has got to stop.&lt;/p&gt;

&lt;p&gt;Over the weekend there was another story about an Apple patent: &lt;a href="http://www.macrumors.com/2011/02/19/apple-safe-deposit-box-patent-revealed-ahead-of-mac-os-x-lion"&gt;Apple &amp;#39;Safe
Deposit Box&amp;#39; Patent Revealed Ahead of Mac OS X
Lion&lt;/a&gt;.
It&amp;#39;s some patent about distributed file access encryption mumbo jumbo. A story
about a new Apple patent comes out every day or two. Rumor sites love writing
about it because it&amp;#39;s concrete information coming from Apple, and they usually
detail some far-flung product idea that everyone wants.&lt;/p&gt;

&lt;p&gt;Who cares.&lt;/p&gt;

&lt;p&gt;Companies patent stuff. In fact, companies patent a lot of stuff. Some patents
are half-baked, some patents are very real product ideas. But this religious
devotion to Apple&amp;#39;s patents has got to stop. Everything gets written about.
There&amp;#39;s entire sites devoted just to Apple patents. Endless discussion.&lt;/p&gt;

&lt;p&gt;For a company whose devotees so proudly proclaim that Apple always ships real
product rather than peddle vaporware, the amount of significance placed on
patents is baffling. These are possible ideas, possible approaches. Nothing is
concrete, and even if the general idea is interesting, Apple will certainly
change the UI, physical design, or ultimate approach to the solution.&lt;/p&gt;

&lt;p&gt;A lot of what Apple does isn&amp;#39;t rocket science. Apple is past the point of
bringing something truly novel to market: they&amp;#39;re not adding data streams piped
directly into your nervous system, for example. They&amp;#39;re at a scale where they
can&amp;#39;t really bet the company on super-futuristic technology. Even iPhone and
iPad were relative straightfoward extensions of OS X and the Mac lines.&lt;/p&gt;

&lt;p&gt;What makes Apple novel is their approach to the mundane: how their UI is
simplified, how their engineering processes are refined, how their operations
and business deals are arranged. And that makes patents fairly valueless.
Everyone knows they&amp;#39;ll have a cloud-based streaming solution at some point;
come up with the most boring, straightforward approach and you&amp;#39;re probably
pretty close to what they&amp;#39;ll ultimately ship in the future. What will
distinguish Apple will not come from anything detailed in a patent; it will
come from the approach they take to those ideas.&lt;/p&gt;

&lt;p&gt;In 2004 or so, there was a patent for Apple to embed hundreds of iSight camera
lenses in-between pixels in a Cinema Display, so you could look directly at the
screen and your face would be better oriented for conversation. That shit ain&amp;#39;t
here. The &amp;quot;Safe Deposit Box&amp;quot; patent from the weekend was appearing in patents
at least from 2005 and possibly earlier; that shit ain&amp;#39;t here. For the last
decade Apple has apparently been on the precipice of delivering a flat-screen
internet TV. That shit ain&amp;#39;t here.&lt;/p&gt;

&lt;p&gt;All of these things may be coming, but at some point we need to realize that
applying straightforward logic to Apple may derive better predictions than
speculating on patents.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/kqRL4Ria09w" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2011/02/new-apple-patent-shows-iphone-6-dispenses-ice-cream</feedburner:origLink></entry>
 
 <entry>
   <title>Graduated with a Major in Startups</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/1Amum-puCVs/graduated-with-a-major-in-startups" />
   <updated>2011-02-07T00:00:00-08:00</updated>
   <id>http://zachholman.com/2011/02/graduated-with-a-major-in-startups</id>
   <content type="html">&lt;p&gt;A few years ago, I graduated from Carnegie Mellon. Boasting some of the top
technology programs in the world, CMU graduates are specifically recruited by
Google, Apple, Amazon, Microsoft... the who&amp;#39;s who of the tech industry.&lt;/p&gt;

&lt;p&gt;I work for GitHub. Around half of the company either dropped out of college or
just didn&amp;#39;t go.&lt;/p&gt;

&lt;p&gt;Virtually none of the technical skills I studied at CMU are used in my job.
Everyone at GitHub is self-taught. I&amp;#39;m pretty sure no one at GitHub even
realized I went to CMU until a few months after I was hired.&lt;/p&gt;

&lt;p&gt;Why is there such a disparity in the startup world? Is this something we can
change? Can we better prepare university students for life as a startup worker?
Can we &lt;strong&gt;teach&lt;/strong&gt; startup culture?&lt;/p&gt;

&lt;h2&gt;The Startup Life for Me&lt;/h2&gt;

&lt;p&gt;This deserves some context. I absolutely adore Carnegie Mellon, had a great
time there, and it was certainly a formative four years for my character, work
ethic, and broader academic enrichment. This is not about &amp;quot;should I go to
school&amp;quot;, either; that discussion depends entirely on the person and situation.
This is about one specific question: &lt;strong&gt;how do we, as a culture and industry,
produce first-class startup workers from our university system?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the few short years since I&amp;#39;ve graduated, I&amp;#39;ve been completely convinced
that I require a startup culture. I&amp;#39;d crumble in a big business corporate
hierarchy. There are thousands just like me; I&amp;#39;m nothing special. There&amp;#39;s a
substantial community of entrepreneurs that love building things, that loathe
bureaucracy, that crave the risks and seek the rewards.&lt;/p&gt;

&lt;p&gt;It&amp;#39;s not for everybody. It&amp;#39;s not even for the majority. Most of our industry
will be more than happy — and &lt;em&gt;thrive&lt;/em&gt; — by taking their courses during school,
joining a stable and profitable company, picking up their paycheck and rising
through the ranks. That&amp;#39;s great, and all things considered I think the
university system is starting to figure out how to evolve their curriculum to
accommodate those professions. &lt;/p&gt;

&lt;p&gt;If you&amp;#39;re interested in working at a startup, I think you&amp;#39;re much more
ill-prepared.&lt;/p&gt;

&lt;h2&gt;Learn Me Some Tech&lt;/h2&gt;

&lt;p&gt;The problem with technology that we&amp;#39;ve battled for decades is how to teach it.
It&amp;#39;s just too damn fast. You can&amp;#39;t teach the same Java course you taught in
2001; APIs have changed, frameworks have evolved, entire methodologies have
died, risen, and then been replaced again. But you can teach Java itself more
broadly. And that&amp;#39;s been the saving grace for many programs: if you teach the
foundations of a language, the student can then build upon them, learn the
incremental changes, and take those language-specific foundations and apply
them to a different language.&lt;/p&gt;

&lt;p&gt;The startup world takes this to the extreme. The concept of a startup is, at
its very core, &lt;strong&gt;creating entirely new solutions to new and existing
problems&lt;/strong&gt;. (If you&amp;#39;re not, you&amp;#39;re probably doing it wrong.) This typically
means completely reinventing existing technology. Or reinventing new approaches
to busted-ass processes. Or combining a multitude of different moving parts in
a package that&amp;#39;s never been done before. It takes a little bit of crazy that
is, quite frankly, difficult to learn in a classroom.&lt;/p&gt;

&lt;p&gt;So, don&amp;#39;t learn it in a classroom.&lt;/p&gt;

&lt;h2&gt;Just Build Shit&lt;/h2&gt;

&lt;p&gt;It&amp;#39;s not all dreary in my school experiences. By far, my favorite class in my
major that I took wasn&amp;#39;t a class at all: it was an independent study with &lt;a href="http://twitter.com/jeffbax"&gt;Jeff
Baxendale&lt;/a&gt;, one of my friends and classmates in the
program. We paired up with one of our favorite professors who acted as our
advisor for the semester. No classes, no tests. Our instruction consisted
mostly of &amp;quot;go build something cool&amp;quot;, and we met every week or two and talked
about the process, what worked, what didn&amp;#39;t, potential business implications,
that sort of thing. What we built — a killer distributed comment tracker, and a
self-referential inline annotation app — was never shipped to the general
public (your loss). But we gained a new perspective on managing a tiny team,
working fantastically diverse hours and workloads, and building something &lt;em&gt;we&lt;/em&gt;
cared about. That, in many ways, was worth the weight of all my other classes
put together.&lt;/p&gt;

&lt;p&gt;I wish there were more emphasis on this. There was certainly more of this in my
program at CMU than others (we had two semester-long projects in groups of 5-6
for real-world nonprofits, for example), but I think there&amp;#39;s more to be done. 
The reason I pick on CMU is not because there&amp;#39;s a problem with CMU; it&amp;#39;s 
because, as a &amp;quot;top tier&amp;quot; school, if it&amp;#39;s not leading the way, how can we expect
the rest of the university system to fare much better?&lt;/p&gt;

&lt;p&gt;At the expense of being a complete shill for GitHub, I think what would be
great is a GitHub class. A semester-long, no-rules class designed specifically
to contribute to open source on GitHub (or any other site). See who can get the
project with the most watchers or forks. Or who had the project with the
biggest impact. Whose code is now in use at the largest organization. Or don&amp;#39;t
even make it a competition; let everyone work the whole semester and take
breaks to just &lt;em&gt;talk&lt;/em&gt; about everyone else&amp;#39;s experiences. I&amp;#39;d have a blast
sitting down and hearing what sort of impact my peers were making in their free
time. Or have endless discussions about different NoSQL solutions (at the very
least, that will prepare them for posting to Hacker News). With no real
expectations, everyone picks projects they&amp;#39;re interested in and can gain a
deeper experience through that.&lt;/p&gt;

&lt;p&gt;You can also stretch the envelope in different fashions, too. Take an uptime
class, where everyone gets a VPS at the beginning of the semester and has to
keep their box up. Grade based on uptime. Have the professor DDOS them.
Simulate a power outage at 3am. Simulate a huge traffic influx. Offline
specific components. The point is things start to feel less like a class and
more like an actual project, with real consequences.&lt;/p&gt;

&lt;p&gt;This is, of course, why internships and co-ops are so great. Once you graduate
and join your first job, no matter how prepared you are you&amp;#39;re going to have
that &lt;em&gt;oh shit&lt;/em&gt; moment your first day when you realize you&amp;#39;re finally deep into
it. Those work programs help mitigate the &lt;em&gt;oh shit&lt;/em&gt; moments. But I think we can
mitigate that in academia, too.&lt;/p&gt;

&lt;h2&gt;Better Industries&lt;/h2&gt;

&lt;p&gt;Don&amp;#39;t get me wrong; I&amp;#39;m not advocating doing away with abstract studies.
Teaching fundamentals and the theory of programming is what college is for;  it
creates the foundation for learning future languages and patterns. And I&amp;#39;m not
advocating replacing entire CS curriculums with startup-oriented classes,
either... again, the majority of students might not be as interested in such a
curriculum.&lt;/p&gt;

&lt;p&gt;That said, I think there &lt;em&gt;are&lt;/em&gt; students that would eat it up. And fostering
that is good for &lt;em&gt;all&lt;/em&gt; of us. Better students create better startups create
better industries.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/1Amum-puCVs" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2011/02/graduated-with-a-major-in-startups</feedburner:origLink></entry>
 
 <entry>
   <title>OAuth Will Murder Your Children</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/gOjgBUvQHKw/oauth_will_murder_your_children" />
   <updated>2011-01-25T00:00:00-08:00</updated>
   <id>http://zachholman.com/2011/01/oauth_will_murder_your_children</id>
   <content type="html">&lt;p&gt;Say there&amp;#39;s a hot new startup that &lt;strong&gt;just launched today&lt;/strong&gt; that you&amp;#39;ve &lt;strong&gt;just
gotta&lt;/strong&gt; sign up for and use &lt;strong&gt;immediately&lt;/strong&gt;. It&amp;#39;s &lt;strong&gt;that hot&lt;/strong&gt;. I bet they even
have a whiz-bang HTML5 website. Paul Graham is rumored to be in talks about
funding it. John Gruber has already made a snide-but-poignant remark while
linking to it. All things considered, it&amp;#39;s probably a neato service that runs
word frequency algorithms on all of your tweets and tells you whether,
statistically, you are Kanye West.&lt;/p&gt;

&lt;p&gt;Luckily you already have a Twitter account. And KanyeAnalysis™ uses OAuth,
which lets you use your Twitter credentials to sign in! Yipee! As you start to
create an account, you flip open another tab to Amazon.com and add a new 808 to
your cart in preparation. Switching back to KanyeAnalysis™, you see Twitter&amp;#39;s
OAuth screen:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cl.ly/4BYU/kanye-murder.png" alt="Kanye West is probably a murderer" /&gt;&lt;/p&gt;

&lt;p&gt;In your dark fantasy of determining whether you&amp;#39;re truly Kanye West (which,
let&amp;#39;s admit, would be a hell of a life), you turn into a monster and slam down
the mouse button on &lt;code&gt;ALLOW&lt;/code&gt;, dooming all of the children to death, leading the
cops to question you in their murders and laying the blame game on you until
you&amp;#39;re forced to runaway to some non-extradition country but not before you get
your 808 in the mail from Amazon Prime.&lt;/p&gt;

&lt;h2&gt;Taking an inch, taking a mile&lt;/h2&gt;

&lt;p&gt;OAuth has matured under Twitter, Flickr, Facebook, and a multitude of other
sites, but almost every third-party app that plugs into OAuth abuses it.&lt;/p&gt;

&lt;p&gt;Right now &lt;strong&gt;41 of the 43 apps connected to my Twitter account request &amp;quot;read and
write access&amp;quot;&lt;/strong&gt;. There&amp;#39;s probably seven of them that legitimately need write
access (mobile and desktop Twitter clients, for example), but, from my
perspective, all of the others only need read-only access. I hate spamming my
followers, so none of the rest of those apps will &lt;em&gt;ever&lt;/em&gt; need write access. So
why do they have it?&lt;/p&gt;

&lt;p&gt;They have it because Twitter has created a culture where the developer can
request whatever they want. The user typically will just click &lt;code&gt;ALLOW&lt;/code&gt; because,
let&amp;#39;s face it, they want to use the app, and convenience tends to trump
privacy.&lt;/p&gt;

&lt;p&gt;But what would happen if the screen were different?&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cl.ly/4BfP/kanye-stopped.png" alt="Kanye West is probably not a murderer anymore" /&gt;&lt;/p&gt;

&lt;p&gt;Professionally and personally, I try to avoid checkboxes and user preferences
as much as possible. Opt for simplicity. But in terms of privacy, I think you
need to allow some flexibility. This isn&amp;#39;t some inane color theme preference;
this is your user&amp;#39;s personal information we&amp;#39;re dealing with. Giving them the
option to hand it out or keep it private is fundamentally important.&lt;/p&gt;

&lt;h2&gt;How can I possibly code for that?&lt;/h2&gt;

&lt;p&gt;When I brought this up briefly over a
&lt;a href="http://twitter.com/#!/holman/status/26735606222561280"&gt;few&lt;/a&gt;
&lt;a href="http://twitter.com/#!/holman/status/26736415983280128"&gt;tweets&lt;/a&gt; a week ago, I
got mostly reasonable agreement in response, mixed in with a few &amp;quot;but then it
will be harder to develop applications&amp;quot;.&lt;/p&gt;

&lt;p&gt;Tough shit. That&amp;#39;s why we have &lt;code&gt;if&lt;/code&gt; statements.&lt;/p&gt;

&lt;p&gt;This stuff is a big deal. If a user doesn&amp;#39;t want some superficial Kanye West
app to read and download all of her private direct messages, she should be able
to expressly restrict that. The same goes for apps tweeting from her account.
It&amp;#39;s not just Twitter, either; I&amp;#39;ve seen the same thing with Facebook and
others. While Facebook thankfully has more privacy levels than Twitter&amp;#39;s
two-level approach, you still can&amp;#39;t pick-and-choose what you like; it&amp;#39;s either
accept the app&amp;#39;s request or you&amp;#39;re out of luck.&lt;/p&gt;

&lt;p&gt;Some apps may legitimately need a particular level of permission, of course,
and I&amp;#39;m fine with that. Native Twitter clients, for example, usually require
the ability to tweet for you. But with more and more apps using Twitter and
others strictly as a form of &lt;em&gt;identification&lt;/em&gt; (&amp;quot;sign in with Twitter!&amp;quot; and the
like), you open yourself up for attack more and more often.&lt;/p&gt;

&lt;p&gt;If you&amp;#39;re creating an app, you should only request the absolute bare minimum of
what&amp;#39;s necessary. If Twitter wised up and started adding access selection, you
should code around the prospect that your app may not receive everything under
the sun. It may not be as convenient for you, but it&amp;#39;s just another programming
problem to deal with.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/gOjgBUvQHKw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2011/01/oauth_will_murder_your_children</feedburner:origLink></entry>
 
 <entry>
   <title>Automating Inefficiencies</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/GksQmxpKoXo/automating-inefficiencies" />
   <updated>2011-01-03T00:00:00-08:00</updated>
   <id>http://zachholman.com/2011/01/automating-inefficiencies</id>
   <content type="html">&lt;p&gt;My friend Steve Chanin just launched &lt;a href="http://how-i-work.com"&gt;How I Work&lt;/a&gt;, a
pretty nifty new site that collects a bunch of screencasts about developer
tools, workflows, that sort of thing. He suggested I do a quick little
screencast, so I did, and everyone ran for their lives.&lt;/p&gt;

&lt;p&gt;I decided to do one on some of the tools I use most in my day-to-day
interactions with the rest of GitHub: &lt;a href="http://campfirenow.com"&gt;Campfire&lt;/a&gt;, my
&lt;a href="https://github.com/holman/dotfiles"&gt;dotfiles&lt;/a&gt;, and
&lt;a href="https://github.com/holman/boom"&gt;boom&lt;/a&gt;. By combining all of these together, we
can successfully make your company&amp;#39;s chat room super inefficient. Apply some
programming and boom, you&amp;#39;re suddenly &lt;strong&gt;automating inefficiencies&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://how-i-work.com/workbenches/29-automating-inefficiencies"&gt;Check it out&lt;/a&gt;
on How I Work (along with the bunch of other screencasts going up there!), or
check out the conveniently-embedded video here:&lt;/p&gt;

&lt;iframe src="http://player.vimeo.com/video/18378673" width="650" height="366"
frameborder="0"&gt;&lt;/iframe&gt;

&lt;p&gt;A couple specific links to things mentioned in the screencast:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/holman/dotfiles/blob/master/bin/cloudapp"&gt;&lt;code&gt;cloudapp&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/holman/gifme"&gt;&lt;code&gt;gifme&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/holman/boom"&gt;boom&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://zachholman.com/2010/08/dotfiles-are-meant-to-be-forked/"&gt;My post on the importance of dotfiles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://zachholman.com/2010/11/text-snippets-boom"&gt;My post on boom&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/GksQmxpKoXo" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2011/01/automating-inefficiencies</feedburner:origLink></entry>
 
 <entry>
   <title>Reputation: kind of a big deal</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/b4R4MFhHBec/reputation" />
   <updated>2010-12-14T00:00:00-08:00</updated>
   <id>http://zachholman.com/2010/12/reputation</id>
   <content type="html">&lt;p&gt;Reputation is an undervalued commodity.&lt;/p&gt;

&lt;h2&gt;It&amp;#39;s not a numbers game.&lt;/h2&gt;

&lt;p&gt;It really isn&amp;#39;t. &lt;em&gt;Social Media Experts&lt;/em&gt; continually harp on numbers: how many
hits, how many followers, how many retweets. Numbers transform to metrics
because they are easily measured. But numbers are only important insomuch as
they are a stepping stone to the true &lt;em&gt;reach&lt;/em&gt; of your actions.&lt;/p&gt;

&lt;p&gt;Reach is important. If you take an action — write a blog post, publish a photo,
launch a website — you want your action to spread to as many people as
possible. It&amp;#39;s human nature. It&amp;#39;s a slightly different concept than simple
&lt;em&gt;exposure&lt;/em&gt;; if reach is giving a presentation on stage, exposure is yelling in
a noisy auditorium without a microphone. There&amp;#39;s a difference in engagement.&lt;/p&gt;

&lt;p&gt;You want to be on that stage with everyone yearning to hear what you&amp;#39;re going
to say next.&lt;/p&gt;

&lt;h2&gt;People respect reputation.&lt;/h2&gt;

&lt;p&gt;Public figures captivate the public. Powerful, smart, funny, crafty, evil,
menacing, malicious. It doesn&amp;#39;t matter where on the spectrum they lie; the
point is that they&amp;#39;re on the stage and everyone has some sort of conceptual
idea of &lt;em&gt;who they are&lt;/em&gt;. Their reputation dictates their legitimacy and how
people continue the dialogue.&lt;/p&gt;

&lt;p&gt;Our industry is filled with these individuals. The stronger your reputation,
the stronger the reaction you&amp;#39;ll get from your community. In the Ruby
community, we elevate &lt;a href="http://en.wikipedia.org/wiki/Why_the_lucky_stiff"&gt;why the lucky stiff&lt;/a&gt;
to such pseudo-religious heights because we strongly identify with his playful,
positive mentality. Apple has a tremendously high-quality, product-driven 
culture, and it&amp;#39;s no wonder Steve Jobs is heralded there.&lt;/p&gt;

&lt;p&gt;Reputation isn&amp;#39;t always such a Puritan concept, either. Zed Shaw is an abrasive
jerkstore, but his contributions, writings, and output is a frequent boon to
our entire industry. Nothing stirs the pot more than Zed&amp;#39;s blog posts.  The
same thing happens when NoSQL nukes a startup, or a tech rag&amp;#39;s database gets
compromised to pieces. Antagonist bloggers will craft attack pieces,
sympathizers defend, and each player carves their reputation into the community
a bit deeper.&lt;/p&gt;

&lt;p&gt;It&amp;#39;s too simplistic to believe in some fairytale where the most impact belongs
to the nicest guy on stage. Sometimes the greatest impact goes to the one with
the most insightful commentary, no matter how it gets delivered. Generally,
people can disagree and still respect you as long as you&amp;#39;re consistently
genuine.&lt;/p&gt;

&lt;h2&gt;Numbers still don&amp;#39;t matter.&lt;/h2&gt;

&lt;p&gt;The internet spreads fastest by individuals working on a micro-level, pushing
and linking their favorite content to their own networks. You want that to be
&lt;em&gt;your&lt;/em&gt; content. Give them a reason to push it. Form a narrative around yourself,
around your company. There&amp;#39;s a reason why Paul Graham&amp;#39;s essays shoot to the top
of Hacker News within minutes of being published, and it&amp;#39;s not because he&amp;#39;s
gaming his own site. It&amp;#39;s because he&amp;#39;s created a culture of dedicated
individuals who are deeply interested in what he has to say.&lt;/p&gt;

&lt;p&gt;At GitHub, we call these people &lt;strong&gt;superfans&lt;/strong&gt;. We owe much of our early, current,
and future success to them. It&amp;#39;s not a case of simple fanboyism, either; quite
honestly our most vocal supporters are often also our most vocal detractors.
They feel passionate enough about GitHub to talk about us, to stimulate
dialogue with others, and to call us out when we fuck up. We wouldn&amp;#39;t be here
without them. &lt;/p&gt;

&lt;p&gt;This is prime time. The internet happens fast. You can type 140 characters, and
within a few minutes have the entire world reading your words through retweets,
remakes, and reblogs. The entire process is only going to speed up, too. Start
building superfans.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/b4R4MFhHBec" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2010/12/reputation</feedburner:origLink></entry>
 
 <entry>
   <title>Text Snippets. Boom.</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/vF7a3v9n_VI/text-snippets-boom" />
   <updated>2010-11-25T00:00:00-08:00</updated>
   <id>http://zachholman.com/2010/11/text-snippets-boom</id>
   <content type="html">&lt;p&gt;Yesterday I released &lt;a href="https://github.com/holman/boom"&gt;boom&lt;/a&gt;, an open source
library that manages text snippets on your command line.&lt;/p&gt;

&lt;p&gt;&amp;quot;WHAT DOES THAT MEAN?!?!?!‽‽‽‽&amp;quot; you say, your caps lock bleeding into my soul.&lt;/p&gt;

&lt;p&gt;It means you now have a quick way to stash and retreive pieces of text. Like
URLs. Or email snippets. Or a list of insults ready at a moment&amp;#39;s notice for
internet flamewars. I spend so much time with a billion shell sessions open
that having this accessible on the command line was a no-brainer for me.&lt;/p&gt;

&lt;p&gt;Check &lt;a href="https://github.com/holman/boom#readme"&gt;boom&amp;#39;s README&lt;/a&gt; for the complete
usage low-down, but basically it goes down like this:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;    &lt;span class="nv"&gt;$ &lt;/span&gt;boom gifs kyle-wink &lt;span class="s2"&gt;&amp;quot;http://cl.ly/326M/content#.gif&amp;quot;&lt;/span&gt;
    Boom! &lt;span class="s2"&gt;&amp;quot;kyle-wink&amp;quot;&lt;/span&gt; in &lt;span class="s2"&gt;&amp;quot;gifs&amp;quot;&lt;/span&gt; is &lt;span class="s2"&gt;&amp;quot;http://cl.ly/326M/content#.gif&amp;quot;&lt;/span&gt;. Got it.

    &lt;span class="nv"&gt;$ &lt;/span&gt;boom all
      gifs
        kyle-wink: http://cl.ly/326M/content#.gif
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And then maybe Kyle says something snarky in Campfire tomorrow and I think to
myself, hey! I have a hilarious animated gif of him winking at me. Where did I
put that again?&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;    &lt;span class="nv"&gt;$ &lt;/span&gt;boom kyle-wink
    Boom! Just copied http://cl.ly/326M/content#.gif to your clipboard.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And then it&amp;#39;s ready to be pasted, earning me lots of stars in our Campfire
transcript as everyone has a jolly laugh.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cl.ly/326M/animated.gif" /&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/holman/boom"&gt;code&amp;#39;s on GitHub&lt;/a&gt;, of course, and I&amp;#39;d love
to hear how you&amp;#39;re using boom, if you&amp;#39;re doing something particularly cool with
it, or if you&amp;#39;ve got a bugfix or pull request for me to add.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/vF7a3v9n_VI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2010/11/text-snippets-boom</feedburner:origLink></entry>
 
 <entry>
   <title>Steal the Code</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/rG5p-dAlYRA/steal-the-code" />
   <updated>2010-10-28T00:00:00-07:00</updated>
   <id>http://zachholman.com/2010/10/steal-the-code</id>
   <content type="html">&lt;p&gt;Learning anything is easy. Internalizing it is difficult.&lt;/p&gt;

&lt;p&gt;Something I&amp;#39;ve found myself doing in my last few projects is to steal ideas
from other projects. Not actually &amp;quot;stealing&amp;quot;, of course, but browsing your
favorite projects and developers and stealing &lt;em&gt;concepts&lt;/em&gt; from them. Design
patterns.  Refactoring methodologies. How does Chris deal with command-line
arguments in &lt;a href="http://github.com/defunkt/hub"&gt;hub&lt;/a&gt;? How does Wayne transition
between shell scripting and Ruby in &lt;a href="http://github.com/wayneeseguin/rvm"&gt;rvm&lt;/a&gt;?
Anything that conceptually requires you to come out of auto-pilot programming
mode and think, &amp;quot;hey, how do I actually do this?&amp;quot; is a great place to start.&lt;/p&gt;

&lt;p&gt;Once you reach that point, sure, you could google a blog post to get the
answer. But by &amp;quot;stealing&amp;quot; it from someone else, you achieve two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You form a mental connection between your concept and that specific project.&lt;/li&gt;
&lt;li&gt;You acquire &amp;quot;ownership&amp;quot; in that concept.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&amp;quot;Acquiring ownership&amp;quot; in something you &amp;quot;steal&amp;quot; is counter-intuitive, but think
about it: you spend the necessary time to understand the concept, and then you
apply it to your own problem domain. The mental act of doing that can be an
intensely satisfying process. Once that bell clicks, you&amp;#39;ll start understanding
&lt;em&gt;why&lt;/em&gt; the author may have refactored that method, or &lt;em&gt;why&lt;/em&gt; they needed a
separate helper class.&lt;/p&gt;

&lt;p&gt;Don&amp;#39;t get me wrong; hammering things out on your own is great. That&amp;#39;s almost an
entirely different class of learning, and it works well in the majority of
cases. But sometimes learning others&amp;#39; best practices is the quickest way to
enlightenment- not in terms of fixing your problem at hand, but of
substantially &lt;em&gt;understanding&lt;/em&gt; the forces involved.&lt;/p&gt;

&lt;p&gt;By seeing how others have tackled your problem, reaching the point of your own
personal understanding, and then reshaping it to fit within your viewpoint, the
concept then becomes &amp;quot;your&amp;quot; concept and you then have it in your pocket for
your next project. It may be just another word for &amp;quot;learning&amp;quot;, but as soon as I
thought of it in this concrete, compartmentalized fashion — &lt;em&gt;Oh, this is just
like that inheritance strategy I stole from Homebrew in my other project a few
months back&lt;/em&gt; — my ability to retain knowledge has gone way up.&lt;/p&gt;

&lt;p&gt;Once you&amp;#39;ve reached that level of internalization, that difficult concept
becomes just another concept you can auto-pilot.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/rG5p-dAlYRA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2010/10/steal-the-code</feedburner:origLink></entry>
 
 <entry>
   <title>Facelette: On TechCrunch in Three Hours and $0</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/H4HpGSyH4gM/facelette-on-techcrunch-in-three-hours-and-zero-dollars" />
   <updated>2010-10-21T00:00:00-07:00</updated>
   <id>http://zachholman.com/2010/10/facelette-on-techcrunch-in-three-hours-and-zero-dollars</id>
   <content type="html">&lt;p&gt;Yesterday, Apple announced &lt;a href="http://www.apple.com/mac/facetime/"&gt;FaceTime for
Mac&lt;/a&gt;. A couple hours later, I launched
&lt;a href="http://facelette.com"&gt;Facelette&lt;/a&gt;, which is basically like Chat Roulette for
FaceTime. Post your FaceTime ID, we&amp;#39;ll hook you up with a stranger, and you
eagerly FaceTime with them.&lt;/p&gt;

&lt;p&gt;Response has been great. I&amp;#39;m writing this about half a day after launch, and my
original tweet has been retweeted 125 times, I &lt;a href="http://techcrunch.com/2010/10/20/facetime-chatroulette-facelette/"&gt;made
TechCrunch&lt;/a&gt;
in three hours post-launch, and there&amp;#39;s been about a tweet a minute about
Facelette this morning. All of this for about an hour of work, and $0 invested.&lt;/p&gt;

&lt;p&gt;Basically, I lucked out. This is the dumbest experiment I&amp;#39;ve done, and I
happened to come upon a novel idea that I figured people would really want to
talk about as soon as they heard it. It&amp;#39;s probably not easily repeatable, but
I&amp;#39;d thought I&amp;#39;d share some of my thoughts on the journey itself.&lt;/p&gt;

&lt;h2&gt;Technical&lt;/h2&gt;

&lt;p&gt;I&amp;#39;m not sure things could get more basic on a technical level. There&amp;#39;s a time
and a place to experiment with new technology and new platforms... this was not
one of them. I just wanted to get something out the door as fast as possible.
(In my mind, literally &lt;strong&gt;hundreds&lt;/strong&gt; of developers were all working on the same
idea! What if I weren&amp;#39;t first? It would ruin everything!)&lt;/p&gt;

&lt;p&gt;The app itself is 34 lines of application logic in Rails 3.0. Add a stylesheet,
add some HTML, about an hour of time, and you have Facelette.&lt;/p&gt;

&lt;p&gt;I&amp;#39;m currently spending zero dollars on the project. It&amp;#39;s all hosted on a free
&lt;a href="http://heroku.com"&gt;Heroku&lt;/a&gt; instance. I host the code through
&lt;a href="http://github.com"&gt;GitHub&lt;/a&gt;. The domain itself, facelette.com, was somewhere
around $20, but my domain registrar refunded the money. I use
&lt;a href="http://iwantmyname.com"&gt;iWantMyName&lt;/a&gt;, which is the cleanest, craftiest
registrar I&amp;#39;ve seen- they have one-click installs for things like Heroku,
GitHub Pages, and Google Apps. Totally awesome, and it&amp;#39;s a credit to them that
they&amp;#39;re supporting customers who recently dip into some good buzz.&lt;/p&gt;

&lt;h2&gt;Usage&lt;/h2&gt;

&lt;p&gt;The best part of this all was that the damn thing worked. I mean, that&amp;#39;s to be
expected since there&amp;#39;s not much there in the first place, but this project was
special to me just because &lt;em&gt;I could talk to my users in real-time&lt;/em&gt;. That was
the entire point of the site. It was a total blast. Within a few hours, I had
talked with Oklahoma, Florida, Brazil, Russia, Spain, and even my arch-nemesis
from BitBucket, &lt;a href="http://twitter.com/jespern"&gt;Jesper&lt;/a&gt;, in Greece. The entire
thing is such a trip, I love it.&lt;/p&gt;

&lt;p&gt;Last night, concurrent FaceTime users were hovering around 3-6; this morning
has been more towards 10-12.&lt;/p&gt;

&lt;h2&gt;Monetization&lt;/h2&gt;

&lt;p&gt;I&amp;#39;ve seen the post-mortems on Hacker News. I know what I&amp;#39;m supposed to do. I&amp;#39;m
supposed to show you graphs of traffic received from Hacker News vs. TechCrunch
vs. Twitter vs. Whatever else. I&amp;#39;ve had people ask to run ads on Facelette,
I&amp;#39;ve had recruiters tell me I&amp;#39;m a great fit for their Stealth Startup that&amp;#39;s
written in PHP and other languages I no longer remember, and everyone is
convinced their service would make Facelette a real smash hit.&lt;/p&gt;

&lt;p&gt;The Startup World is great because of this. So many people with so much
ambition, trying to squeeze out The Next Big Thing at every turn. Someone puts
together a weekend project and Hacker News descends on them, suggesting
Facebook integration! And real-time chat! And SEO! And node.js! And tips on
their first hire!&lt;/p&gt;

&lt;p&gt;I&amp;#39;ve also come to loathe this mentality, at times. It&amp;#39;s the same mentality
where someone whips up a two-page website and asks people to &amp;quot;review their
&lt;em&gt;startup&lt;/em&gt;!&amp;quot; I think &lt;em&gt;startup&lt;/em&gt; is a phrase that&amp;#39;s been abused. You&amp;#39;ve made a
project, or a mashup, or a hack, not a &lt;em&gt;startup&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;And that&amp;#39;s cool! Embrace that. More people need to do stupid shit. I mean that
from the bottom of my heart. Don&amp;#39;t do it to make money. Don&amp;#39;t even do it to
learn &lt;em&gt;hip new technology X&lt;/em&gt;. Do it for the sake of doing something stupid.
We&amp;#39;re in the most ridiculous industry on earth. You can whip something up in a
few hours and before you know it, people around the world will be using it.
That is &lt;strong&gt;insane&lt;/strong&gt;. An architect or a fireman or a lawyer or anyone else can&amp;#39;t
say that for their profession or their hobby.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;when you don&amp;#39;t create things, you become defined by your tastes rather than
ability. your tastes only narrow &amp;amp; exclude people. so create. &lt;/p&gt;

&lt;p&gt;&lt;cite&gt;&lt;a href="http://favstar.fm/users/_why/status/881768089"&gt;_why the lucky
stiff&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Don&amp;#39;t be afraid to build things for the sake of building them. Since Facelette
launched, you know what&amp;#39;s put the biggest smile on my face? It definitely
wasn&amp;#39;t being TechCrunch&amp;#39;d; it was two tweets and a comment that said Facelette
put a smile on &lt;em&gt;their&lt;/em&gt; faces.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/H4HpGSyH4gM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2010/10/facelette-on-techcrunch-in-three-hours-and-zero-dollars</feedburner:origLink></entry>
 
 <entry>
   <title>My Favorites From Rails Rumble 2010</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/g5iVkGBjzl4/my-favorites-from-rails-rumble-2010" />
   <updated>2010-10-17T00:00:00-07:00</updated>
   <id>http://zachholman.com/2010/10/my-favorites-from-rails-rumble-2010</id>
   <content type="html">&lt;p&gt;This year&amp;#39;s &lt;a href="http://railsrumble.com"&gt;Rails Rumble&lt;/a&gt; just finished. It&amp;#39;s a 48-hour
sprint for small teams to whip up a Ruby on Rails app. As expected, the apps
this year were even more gorgeous, more polished, and more amazing-er than last
year. I didn&amp;#39;t get to participate this year, but you better believe I can
armchair quarterback my favorites to you.&lt;/p&gt;

&lt;p&gt;There&amp;#39;s about five million apps this year that I was impressed with, but here&amp;#39;s
a couple that I was &lt;em&gt;really&lt;/em&gt; impressed with, in no particular order. I
definitely encourage you to &lt;a href="http://railsrumble.com/teams"&gt;browse the whole
list&lt;/a&gt; of teams; there&amp;#39;s a lot of interesting apps
tackling some unique problems in there.&lt;/p&gt;

&lt;p&gt;Remember... all of these were done in 48 hours or less, which is kind of
insane.&lt;/p&gt;

&lt;h2&gt;&lt;a href="http://board.r10.railsrumble.com"&gt;Boarrd&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://board.r10.railsrumble.com"&gt;&lt;img src="http://cl.ly/2roZ/boarrd.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Boarrd is an app that I&amp;#39;ve wanted to do for some time; it&amp;#39;s basically a status
board that lets you set up self-contained widgets on a page. Great design, and
they have 18 widgets to start out with (ranging from Flickr streams, to Twitter
searches, to GitHub project snapshots). Super easy to use, and something that
doesn&amp;#39;t seem all too hard for them to ferociously build out new widgets into
the future.&lt;/p&gt;

&lt;h2&gt;&lt;a href="http://splendidbacon.com"&gt;Splendid Bacon&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://splendidbacon.com"&gt;&lt;img src="http://cl.ly/2re4/splendid-bacon.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Splendid Bacon&amp;#39;s pretty splendid. Simple project tracker somewhat akin to 
&lt;a href="http://culturedcode.com/status"&gt;Cultured Code&amp;#39;s status board&lt;/a&gt;. It works with
GitHub post-receive hooks, too, which makes it probably the hottest thing since
sliced butter.&lt;/p&gt;

&lt;h2&gt;&lt;a href="http://omecash.r10.railsrumble.com"&gt;Owe Me Cash&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://omecash.r10.railsrumble.com"&gt;&lt;img src="http://cl.ly/2rvs/owe-me-cash.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Keep track of who owes you what. Simple. Basically I fancy myself a mobster
sometimes, and sometimes you need to break a few kneecaps.&lt;/p&gt;

&lt;h2&gt;&lt;a href="http://playbill.r10.railsrumble.com"&gt;Playbill&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://playbill.r10.railsrumble.com"&gt;&lt;img src="http://cl.ly/2rr7/playbill.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Playbill&amp;#39;s a quick way to find out what&amp;#39;s going down in your city of residence
tonight. Cool design, one text field, embedded maps, what&amp;#39;s not to like?
Nothing, that&amp;#39;s what. Nothing&amp;#39;s not to like.&lt;/p&gt;

&lt;h2&gt;And a bunch more.&lt;/h2&gt;

&lt;p&gt;The Rails Rumble (and other blitzkrieg app events like it- nearly every language
and framework has one now) is just fun to watch. It&amp;#39;s fun to be &lt;em&gt;excited&lt;/em&gt; about
web development sometimes. These cats built some cool apps in &lt;strong&gt;two days&lt;/strong&gt;,
some of which will go on to become full-fledged apps or businesses. That&amp;#39;s
&lt;em&gt;awesome&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Sure, a button may not work, or the design may not be up to snuff, or there may
not be the feature you want in a particular app. None of that matters in
competitions like these. It&amp;#39;s the journey we should applaud.&lt;/p&gt;

&lt;p&gt;And if you&amp;#39;re still some sort of bitter internet commenter after all this,
well, shut the fuck up, lace up your boots, and step in the ring next year. :)&lt;/p&gt;

&lt;p&gt;Cheers! And don&amp;#39;t forget support your favorites on &lt;a href="http://railsrumble.com"&gt;October
21&lt;/a&gt;, when the round of public voting starts.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/g5iVkGBjzl4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2010/10/my-favorites-from-rails-rumble-2010</feedburner:origLink></entry>
 
 <entry>
   <title>Hey Twitter: Give us our Tweets</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/WswBV-_it9c/hey-twitter-give-us-our-tweets" />
   <updated>2010-09-24T00:00:00-07:00</updated>
   <id>http://zachholman.com/2010/09/hey-twitter-give-us-our-tweets</id>
   <content type="html">&lt;p&gt;&amp;lt;!-- http://twitter.com/seaofclouds/status/22623020685 --&amp;gt; &lt;style type='text/css'&gt;.bbpBox22623020685 {background:url(http://a3.twimg.com/profile&lt;em&gt;background&lt;/em&gt;images/3131689/flowers.png) #FFE884;padding:20px;} p.bbpTweet{background:#fff;padding:10px 12px 10px 12px;margin:0 !important;min-height:48px;color:#000;font-size:18px !important;line-height:22px !important; -moz-border-radius:5px;-webkit-border-radius:5px} p.bbpTweet span.metadata{display:block;width:100%;clear:both;margin-top:8px;padding-top:12px;height:40px;border-top:1px solid #fff;border-top:1px solid #e6e6e6} p.bbpTweet span.metadata span.author{line-height:19px; font-size: .9em} p.bbpTweet span.author a{padding: 0 !important} p.bbpTweet span.metadata span.author img{float:left;margin:0 7px 0 0px !important;width:38px;height:38px;-webkit-box-shadow: none !important;} p.bbpTweet a:hover{text-decoration:underline}p.bbpTweet span.timestamp{font-size:12px;display:block}&lt;/style&gt; &lt;div class='bbpBox22623020685'&gt;&lt;p class='bbpTweet'&gt;Welcoming baby Maren, who was born  this Tuesday morning in the front seat of our car.&lt;span class='timestamp'&gt;&lt;a title='Tue Aug 31 14:55:26 +0000 2010' href='http://twitter.com/seaofclouds/status/22623020685'&gt;August 31, 2010&lt;/a&gt; via &lt;a href="http://twitter.com/" rel="nofollow"&gt;Twitter for iPhone&lt;/a&gt;&lt;/span&gt;&lt;span class='metadata'&gt;&lt;span class='author'&gt;&lt;a href='http://twitter.com/seaofclouds'&gt;&lt;img src='http://a0.twimg.com/profile_images/20609372/birdie-icon_normal.png' /&gt;&lt;/a&gt;&lt;strong&gt;&lt;a href='http://twitter.com/seaofclouds'&gt;seaofclouds&lt;/a&gt;&lt;/strong&gt;&lt;br/&gt;seaofclouds&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt; &amp;lt;!-- end of tweet --&amp;gt;&lt;/p&gt;

&lt;p&gt;Todd&amp;#39;s family just increased by one a few weeks ago. I found it to be quite a
surprising tweet to read that morning, to say the least. I imagine the family
may have some stronger feelings about that tweet than I do, too. To them, it&amp;#39;s
something that years from now will still signify such an important moment of
their lives. Unfortunately, Twitter&amp;#39;s not making it easy to retain that
nostalgia.&lt;/p&gt;

&lt;h2&gt;Now and then&lt;/h2&gt;

&lt;p&gt;Twitter is about &lt;em&gt;now now now&lt;/em&gt;. What&amp;#39;s happening &lt;em&gt;now&lt;/em&gt;, what just happened
&lt;em&gt;now&lt;/em&gt;, what will happen in approximately &lt;em&gt;now&lt;/em&gt;. What you have to say about
&amp;quot;now&amp;quot; is interesting to people. What you &lt;em&gt;said&lt;/em&gt; about &amp;quot;now&amp;quot; is mostly
interesting only to you.&lt;/p&gt;

&lt;p&gt;Twitter&amp;#39;s a snapshot into your life. How you feel a given day dictates your
tone of your tweets. Writing a detailed personal journal is one way to capture
your thoughts, but Twitter is another type of journal. The tweets you made
after being hired at that company, or while at that great conference last year,
or after breaking up with a loved one, or simply being drunk on the beach in a
beautiful place with friends... all of those experiences are &lt;em&gt;your&lt;/em&gt;
experiences. They&amp;#39;re important.&lt;/p&gt;

&lt;h2&gt;Twitter retains&lt;/h2&gt;

&lt;p&gt;As it stands, Twitter doesn&amp;#39;t make it easy to relive these experiences.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://dev.twitter.com/pages/every_developer"&gt;You&amp;#39;re API-limited&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Clients may access a theoretical maximum of 3,200 statuses via the page and
count parameters for the user_timeline REST API methods. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You&amp;#39;re also web-limited. I can hit page 159 on my user timeline, but anything
after that is a blank page. 160 pages sounds like a lot of tweets, but that
only covers me to early 2009; a far cry from my first tweets made in 2007.&lt;/p&gt;

&lt;p&gt;What&amp;#39;s worse is that this affects your Direct Messages, too. I can only pull
back my DMs from four months prior to now; all of the ones before that period
are inaccessible to me. DMs are even more intimate than regular tweets, and to
lose all of that personal, one-to-one correspondence is a bummer.&lt;/p&gt;

&lt;h2&gt;Tweet mining&lt;/h2&gt;

&lt;p&gt;So Twitter&amp;#39;s restricting access to our tweets. That&amp;#39;s a bummer. But even if
they flipped the switch tomorrow on full browse access, that&amp;#39;s still not quite
very useful. &lt;em&gt;Tweet mining&lt;/em&gt; is the real goldmine. Just imagine the treasure
trove of things you could re-learn and re-experience about yourself if you had
the tools to do so:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;What were my first tweets?&lt;/strong&gt; Did I even &amp;quot;get&amp;quot; Twitter? How do those early
tweets differ from my tweets today?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What have all my conversations been with &lt;code&gt;@insert-user-here&lt;/code&gt;?&lt;/strong&gt; Were they
all serious? Were they all hilarious? Were they somber? Maybe you&amp;#39;ve fallen
out of touch. Maybe they&amp;#39;ve passed away. These quick back-and-forth
conversations may grow to become impossibly important to you, further down
the line.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How can we explore my tweets graphically?&lt;/strong&gt; Can you chart my tweets out by
month? By year? Maybe there&amp;#39;s a novel way to graphically point out &amp;quot;Hey, this
cluster of tweets around May 2008 must be &lt;em&gt;really important&lt;/em&gt; to you since you
tweeted nonstop over three days&amp;quot;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Can you show me when others thought my tweets were important?&lt;/strong&gt; If they
favorite my tweets, can you show me which segments of my Twitter life might
be the most important to me, judged from the perspective of my followers?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Can you break out my geolocated tweets on a map, over time?&lt;/strong&gt; Maybe an
animated heatmap that I can interact with. I would absolutely love to revisit
old trips and vacations through the lens of tweets, twitpics, and maps.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Meaning&lt;/h2&gt;

&lt;p&gt;There&amp;#39;s so many possibilities that are exciting to think about. That are
comical. That are dumber than hell. That are deeply meaningful.&lt;/p&gt;

&lt;p&gt;Twitter is a terse communication medium, and yes, most tweets have very little
value because of that. But it&amp;#39;s clear that some tweets are the &lt;em&gt;exact
opposite&lt;/em&gt;.  It&amp;#39;s a low-barrier of entry to exploring your past self. Twitter
has matured to where we can&amp;#39;t ignore the significance it can bring to people,
to relationships, and to society. The Library of Congress shouldn&amp;#39;t be the only
one who &lt;a href="http://blogs.loc.gov/loc/2010/04/how-tweet-it-is-library-acquires-entire-twitter-archive/"&gt;gets to explore the archives of
Twitter&lt;/a&gt;;
it&amp;#39;s something to which everyone should have a right.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/WswBV-_it9c" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2010/09/hey-twitter-give-us-our-tweets</feedburner:origLink></entry>
 
 <entry>
   <title>A Nike+ Importer for Garmin</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/2QmerACRXR4/fatigue-import-nike-into-garmin-connect" />
   <updated>2010-09-13T00:00:00-07:00</updated>
   <id>http://zachholman.com/2010/09/fatigue-import-nike-into-garmin-connect</id>
   <content type="html">&lt;p&gt;My little weekend project this weekend was
&lt;a href="http://github.com/holman/fatigue"&gt;Fatigue&lt;/a&gt;, a tiny bit of rubygem that imports
your Nike+ run history into Garmin Connect.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cl.ly/2Ma2/Nike_Garmin.png" /&gt;&lt;/p&gt;

&lt;p&gt;Like many others, I presume, I had a few lovely years on Nike+ but recently
switched over to a Garmin Forerunner 405CX. It&amp;#39;s like leveling up your running:
the GPS mapping with Garmin Connect is a really compelling way to visualize
your runs. I didn&amp;#39;t want to leave my hundreds of logged miles behind, though.&lt;/p&gt;

&lt;p&gt;Run &lt;code&gt;fatigue&lt;/code&gt; and it&amp;#39;ll import your old runs from Nike+. More installation and
usage information &lt;a href="http://github.com/holman/fatigue"&gt;can be found on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;On a technical sidenote: I had a fun time using &lt;a href="http://tom.preston-werner.com/2010/08/23/readme-driven-development.html"&gt;Readme Driven
Development&lt;/a&gt;
and &lt;a href="http://tomdoc.org"&gt;TomDoc&lt;/a&gt; on it. I&amp;#39;ve found I really dig using both of
those development mentalities; give &amp;#39;em a shot and see if they work for you,
too.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/2QmerACRXR4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2010/09/fatigue-import-nike-into-garmin-connect</feedburner:origLink></entry>
 
 <entry>
   <title>How to Discover Your Music</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/L4AwdnfMLRk/how-to-discover-your-music" />
   <updated>2010-09-07T00:00:00-07:00</updated>
   <id>http://zachholman.com/2010/09/how-to-discover-your-music</id>
   <content type="html">&lt;p&gt;We finally figured out how to sell music online. Everyone knew that DRM was
insane, everyone sort of figured that the general public would buy music more
often than steal it, and iTunes came by and demonstrated both. Now people are
buying a lot of music online. Cool. Problem solved.&lt;/p&gt;

&lt;p&gt;There is a war going on for your music discovery. For years we&amp;#39;ve had the iTunes
model: first, figure out what the hell you&amp;#39;re interested in, and then you can go
to the iTunes Store, click on an album, and then hear a thirty second sample.
Maybe click around for another thirty second sample, and then click! You buy
those songs. Or maybe the whole album. And then you own those digital bits.
Cool. Problem solved. I mean, it&amp;#39;s solved for a few days until we all figured
out that the process sucks. But we had to live with it.&lt;/p&gt;

&lt;p&gt;Music discovery is the last thing to conquer. How can we show you, the user,
which songs you&amp;#39;d love to listen to? How can we involve your friends in those
recommendations? How about the general public? How can we get independent
artists in the mix?&lt;/p&gt;

&lt;p&gt;There have been a lot of companies — big and small — attacking this process over
the last decade. Amazon, Last.fm, Spotify, Rdio, Like.fm, Lala, Rhapsody,
Grooveshark, Pandora, iLike, eMusic, The Hype Machine, Slacker... it&amp;#39;s really a
stupendous amount. Some crashed and burned, some enjoyed tepid mainstream
success, some retained a small but passionate userbase.&lt;/p&gt;

&lt;p&gt;And then Apple decides to launch Ping.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://cl.ly/2GBL"&gt;&lt;img src="http://cl.ly/2GBL/ping.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Ping&lt;/h2&gt;

&lt;p&gt;Apple&amp;#39;s Ping has gotten people talking. It&amp;#39;s a pretty large effort: in the realm
of tiny, gradual growth music startups, Apple had to scale up their service to
support &lt;a href="http://www.apple.com/pr/library/2010/09/03ping.html"&gt;one million full-fledged user
accounts&lt;/a&gt; in two days, with
the potential of Ping to be eventually used by the 160 million overall iTunes
users. It&amp;#39;s a technical feat, to be sure.&lt;/p&gt;

&lt;p&gt;That said, the
&lt;a href="http://news.cnet.com/8301-13526_3-20015453-27.html?tag=contentMain;contentBody"&gt;buzz&lt;/a&gt;
on the street &lt;a href="http://twitter.com/beep/status/23065624092"&gt;appears&lt;/a&gt; to be
&lt;a href="http://twitter.com/al3x/status/23082434122"&gt;lukewarm&lt;/a&gt;. It may just be the nerdy
crew I follow on Twitter and Hacker News are too jaded in life that they scoff
at Ping out of mainstream spite. But I think it&amp;#39;s safe to say that the initial
reaction was less than stellar.&lt;/p&gt;

&lt;h2&gt;Making a Better Ping&lt;/h2&gt;

&lt;p&gt;It gets you thinking: how should Ping have been launched? Why do people dislike
it? More importantly, what cool shit did Apple ignore that should have been in
there from the start?&lt;/p&gt;

&lt;p&gt;I used to be a steadfast believer in Jobs&amp;#39; usual comment: people may want to rent
movies, but people want to &lt;em&gt;own&lt;/em&gt; their music. I still think that&amp;#39;s true, except in
the case of music discovery. When I&amp;#39;m trying out new music, when I want to
browse what my friends have been listening to, when I just want to listen to
someone&amp;#39;s random playlist... in all of those scenarios I&amp;#39;m fine with paying a
monthly fee in order to get full access to streaming every song I want, on
demand.&lt;/p&gt;

&lt;p&gt;I&amp;#39;ve come to think Ping should have been more like &lt;a href="http://rdio.com"&gt;Rdio&lt;/a&gt; and
less like iTunes. In fact, that&amp;#39;s what I&amp;#39;ve decided my music setup will be for
the foreseeable future: all of my &amp;quot;main&amp;quot; music is in iTunes, all of my music
discovery is handled by Rdio.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://cl.ly/2GUo"&gt;&lt;img src="http://cl.ly/2GUo/rdio.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Rdio does a few things really well: on login I get a snapshot of what my friends
have been listening to (above). I can also browse their playlists and make my
own. More importantly, I pay a small monthly fee and I can stream everything on
the site, without incessant 30-second limitations, without locked-in walled
gardens. I&amp;#39;ve already found a number of new artists in the last few months that
I would never have otherwise heard of. I have a somewhat less favorable outlook
on Ping&amp;#39;s ability to deliver that.&lt;/p&gt;

&lt;h2&gt;Apples and Labels&lt;/h2&gt;

&lt;p&gt;So why isn&amp;#39;t Ping more like Rdio, or Spotify, or the multitude of other social
music networks with good ideas? Two reasons: Apple, and Labels.&lt;/p&gt;

&lt;h3&gt;Apple&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://zachholman.com/2010/08/apple-online/"&gt;Apple doesn&amp;#39;t understand the
Internet&lt;/a&gt;. This could be made no
clearer than when Ping launched on iTunes and on iPhone (and presumably soon
enough, on iPad) only. If you&amp;#39;re trying to make a social network for music, you&amp;#39;re
cutting the legs out from under you if you take away the one sharing option people
understand: URLs. Taking it out of the browser means it&amp;#39;s a walled garden. Yes,
there are ways to link to individual Ping pages through really gnarly-looking
URLs, but most people won&amp;#39;t understand how to do that in the first place (not to
mention scores of bookmarklets, browser plugins, and other sharing niceties aren&amp;#39;t
present in iTunes). Apple has a funny idea of what a social network is.&lt;/p&gt;

&lt;h3&gt;Labels&lt;/h3&gt;

&lt;p&gt;I think the other elephant in the room is music labels. Apple&amp;#39;s at a
disadvantage: they&amp;#39;re big enough to freak out the old guys in boardrooms across
Hollywood. Startups get more lenient terms because of smaller marketshare and
less potential for disaster. This is why Apple&amp;#39;s struggling to even get &lt;a href="http://www.networkworld.com/community/node/65684"&gt;one
minute previews&lt;/a&gt; of songs on
iTunes. Any big changes Apple wants to make to the industry is going to be
fought viciously from these guys. Startups though? Do what you want. It puts
Apple in a rather stagnant position.&lt;/p&gt;

&lt;h2&gt;Discovery&lt;/h2&gt;

&lt;p&gt;Ping doesn&amp;#39;t cut it in its current form. Inviting people to share their musical
tastes and building a social platform on 30 second sound bites is just an
extension of the iTunes Store, not a novel way to explore your own potential
musical tastes. And it&amp;#39;s a bit of a bummer... a network with as much pull and
draw as iTunes could have been really killer.&lt;/p&gt;

&lt;p&gt;I think we&amp;#39;ll get there eventually. Until then, explore some of the other
smaller players... they&amp;#39;re the ones that will bring you the goods until Apple
and the labels wrap their heads around the internet.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/L4AwdnfMLRk" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2010/09/how-to-discover-your-music</feedburner:origLink></entry>
 
 <entry>
   <title>Dotfiles Are Meant to Be Forked</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/mB8qkR8XoYQ/dotfiles-are-meant-to-be-forked" />
   <updated>2010-08-20T00:00:00-07:00</updated>
   <id>http://zachholman.com/2010/08/dotfiles-are-meant-to-be-forked</id>
   <content type="html">&lt;p&gt;I&amp;#39;m a big fan of customizing your dotfiles. &amp;quot;Dotfiles&amp;quot; are the funky little files in your *nix-based home directory that allow you to customize your nerdery: change how your prompt looks, set up your $PATH, adjust settings for Ruby&amp;#39;s IRB, completely change everything about Vim, and about a billion and a half other things. They&amp;#39;re fun.&lt;/p&gt;

&lt;p&gt;In many ways, this loose framework is one of the most important tools you&amp;#39;ll use as a developer. It dictates how you use every other tool in your software arsenal. And everyone has different tastes, which I find fascinating: sit down at a crafty programmer&amp;#39;s shell for a minute and you&amp;#39;ll find that out pretty quick.&lt;/p&gt;

&lt;h2&gt;So many lines&lt;/h2&gt;

&lt;p&gt;But I think it&amp;#39;s a tool that few use, and amongst those, even fewer use &lt;em&gt;well&lt;/em&gt;. Beginner-level developers tend not to dive into a lot of shell customization aside from a few aliases for Git, perhaps. And of those who do take the time to sit down and really personalize their shell, it&amp;#39;s kind of a mixed bag. Look at &lt;a href="http://dotfiles.org"&gt;dotfiles.org&lt;/a&gt;, a nifty little site that&amp;#39;s designed to help share your own dotfiles:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Face it: you&amp;#39;re proud of that 204-line .bashrc, and you should be! You&amp;#39;ve fine-tuned your prompt, carefully planned your aliases, and written some pretty time-saving functions over the years.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I&amp;#39;ve seen this a lot, and it drives me crazy. The same people who have very core ideas about how code should be refactored, minimized, and organized end up having these outlandish &lt;code&gt;.bashrc&lt;/code&gt; files. They&amp;#39;ve probably started out with a tiny file a few years ago and just kept adding... and adding... and adding to it.&lt;/p&gt;

&lt;p&gt;Obviously, messy dotfiles make mental organization difficult for yourself, but you end up missing out on some of the absolute best part of dotfiles: sharing the shit out of them.&lt;/p&gt;

&lt;h2&gt;Sharing the shit out of them&lt;/h2&gt;

&lt;p&gt;Think about it: these are the files, aliases, and executables that programmers make &lt;em&gt;for themselves&lt;/em&gt; to make their lives &lt;em&gt;more productive&lt;/em&gt;. If you have a way to easily share your dotfiles amongst other developers, you&amp;#39;re only going to make it easier &lt;em&gt;for yourself&lt;/em&gt; to pull in someone else&amp;#39;s &lt;code&gt;super-awesome-executable&lt;/code&gt; that will make your own workflow amazing.&lt;/p&gt;

&lt;p&gt;A 200-line jumbled &lt;code&gt;.bashrc&lt;/code&gt; becomes a lot harder to share with people. Putting that on GitHub lets others pick and choose from it, but a flat file with the kitchen sink makes it harder to merge in other work from other dotfiles in your network, particularly as both you and your forks grow and personalize your dotfiles. You want to make it easier for people to share code, not harder.&lt;/p&gt;

&lt;h2&gt;So, organize it&lt;/h2&gt;

&lt;p&gt;So, organize it. Do what programmers have been doing for years: make a smart system, follow it, and let others use it too.&lt;/p&gt;

&lt;p&gt;There&amp;#39;s a lot of great projects doing this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ryan Bates (&lt;a href="http://twitter.com/rbates"&gt;@rbates&lt;/a&gt;) fame has &lt;a href="http://github.com/ryanb/dotfiles"&gt;his own network&lt;/a&gt; of 175 forks. His project centers around bash and zsh, TextMate, Vim, and Rails.&lt;/li&gt;
&lt;li&gt;Robby Russell (&lt;a href="http://twitter.com/robbyrussell"&gt;@robbyrussell&lt;/a&gt;) started up &lt;a href="http://github.com/robbyrussell/oh-my-zsh"&gt;oh-my-zsh&lt;/a&gt;, a community of some 250 forks surrounding zsh.&lt;/li&gt;
&lt;li&gt;Ryan Tomayko (&lt;a href="http://twitter.com/rtomayko"&gt;@rtomayko&lt;/a&gt;) open sourced &lt;a href="http://github.com/rtomayko/dotfiles"&gt;his dotfiles&lt;/a&gt; with a great set of documentation and some 150 developers watching the repository.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;My dotfiles&lt;/h2&gt;

&lt;p&gt;Personally, I forked Ryan&amp;#39;s Bates&amp;#39; dotfiles a few years back and loved it. It&amp;#39;s great to be a part of a larger community- you can sit in GitHub&amp;#39;s Fork Queue, browse what others have added, and within a click or two, add it to your own project.&lt;/p&gt;

&lt;p&gt;After awhile, though, I started wanting a clean slate with a much better handle on organization. So, I started from my fork and pushed a new project.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://github.com/holman/dotfiles"&gt;&lt;img src="http://cl.ly/24fM/holman-dotfiles.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What sets mine apart that I&amp;#39;m kind of in love with is that everything is broken into very specific and distinct areas:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;  bin/
  cas/
  ec2/
  git/
  jruby/
  ruby/
  system/
  vim/
  zsh/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This makes sense, at least to me: too many times I&amp;#39;d be in the Git mindset, trying to add a new alias but never remembering where to find it in the long &lt;code&gt;aliases.zsh&lt;/code&gt; file I had. Now if I&amp;#39;m adding a new alias for Git I can go straight into &lt;code&gt;git/&lt;/code&gt;, edit &lt;code&gt;aliases.zsh&lt;/code&gt; and know that all the aliases I&amp;#39;d need for Git is contained within that file. Any new directories created get automatically added to your shell, too. It&amp;#39;s really helpful, and lets you scale your dotfiles a lot easier. More importantly, if I&amp;#39;m browsing a fork&amp;#39;s directories — which are likely to be very different than mine — I can immediately determine the areas of their code I might be interested in.&lt;/p&gt;

&lt;p&gt;So, &lt;a href="http://github.com/holman/dotfiles"&gt;fork it&lt;/a&gt;. Or, if not mine, then fork some of the awesome other projects I mentioned. Or come up with your own way of organizing your stuff and share it. Everyone&amp;#39;s got their own way of streamlining their system, and sharing dotfiles helps everyone.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/mB8qkR8XoYQ" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2010/08/dotfiles-are-meant-to-be-forked</feedburner:origLink></entry>
 
 <entry>
   <title>Apple OnLine 4.0</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/ePY058obobU/apple-online" />
   <updated>2010-08-10T00:00:00-07:00</updated>
   <id>http://zachholman.com/2010/08/apple-online</id>
   <content type="html">&lt;p&gt;Apple doesn&amp;#39;t understand the internet.&lt;/p&gt;

&lt;p&gt;This is something that every Apple fanboy knows and tries not to think about. It&amp;#39;s embarrassing, really. Apple&amp;#39;s industrial design is unmatched, their software UI is copied, emulated, and copied again, and their business focus is the envy of the town. But their internet properties are hosted on Tripod wrapped in a &lt;code&gt;&amp;lt;marquee&amp;gt;&lt;/code&gt; built in FrontPage &amp;#39;97.&lt;/p&gt;

&lt;p&gt;Just look at what they&amp;#39;re been doing within MobileMe: iDisk doesn&amp;#39;t come close to matching up with Dropbox, the online Mail.app is a far cry from Gmail, and their Photos app is so wildly far off from being a competitor to Facebook or Flickr that it&amp;#39;s a stretch to even make that comparison.&lt;/p&gt;

&lt;p&gt;It&amp;#39;s not a matter of talent. Apple has the money and draw to attract anyone they want to hire. I suspect it&amp;#39;s a management problem. It&amp;#39;s that senior management &lt;em&gt;really&lt;/em&gt; understands software, that senior management &lt;em&gt;really&lt;/em&gt; understands hardware, and that senior management &lt;em&gt;really&lt;/em&gt; doesn&amp;#39;t understand the web. Even the little bit that grew out of MobileMe feels like some weird oddity: they&amp;#39;re the only Apple division that has their own &lt;a href="http://www.apple.com/mobileme/news/"&gt;development blog&lt;/a&gt; of sorts. Nowhere else in Apple are they really allowed to just continually roll out features and announce them in that fashion. In cases like that, it feels like they&amp;#39;re trying to act like a &amp;quot;normal&amp;quot; web startup, but the climate of Apple prevents them from really running free like one and building product people want.&lt;/p&gt;

&lt;p&gt;Apple is particularly bad at social software. Flickr made it big because they made exploring photos super easy. Facebook Photos made it big because they made photo discovery super easy. Apple&amp;#39;s &amp;quot;Gallery&amp;quot; product offers zero exploration and zero discovery possibilities. What&amp;#39;s the point of a large-scale product like that?&lt;/p&gt;

&lt;p&gt;I&amp;#39;m being a little disingenuous, though. It&amp;#39;s rare for &lt;em&gt;any&lt;/em&gt; large company to have the imagination to build out new ideas. There are very few &amp;quot;established&amp;quot; companies that have interesting consumer web properties. You could argue Facebook and Google, but they&amp;#39;re both startups in terms of age. They were built by people that knew their respective craft inside and out, and that culture grew with their company. That&amp;#39;s why Apple&amp;#39;s so good at hardware and software- it&amp;#39;s grown within that sector for decades.&lt;/p&gt;

&lt;p&gt;But we like to hold Apple to higher standards. We like to think that greatness can transcend fields. We&amp;#39;d like to hope that Apple can get a handle on social media, on the internet. But is that even a feasible desire? Can you switch core competencies that easily?&lt;/p&gt;

&lt;p&gt;It makes me wonder if the obvious route is the only route for Apple: buy up the dreamers who can dream those new worlds, and then spackle some of it on your existing product lineup. Case in point: &lt;a href="http://en.wikipedia.org/wiki/Lala_(website)"&gt;Lala&lt;/a&gt;. And maybe it&amp;#39;s a good thing. It perpetuates the Silicon Valley myth of huge liquidation events, it provides some innovation to companies who couldn&amp;#39;t otherwise dredge out of their own culture, all the while broadening the amount of consumers who gain access to that innovation.&lt;/p&gt;

&lt;p&gt;On the same hand, though, you still wish that the company you start next Tuesday will be able to confidently handle new markets when they open up in 2021. The pace of technology is unforgiving.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/ePY058obobU" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2010/08/apple-online</feedburner:origLink></entry>
 
 <entry>
   <title>Enslaving Branches: How GitHub Does Enterprise</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/NlG-HDxapWI/enslaving-branches-how-github-does-enterprise" />
   <updated>2010-07-28T00:00:00-07:00</updated>
   <id>http://zachholman.com/2010/07/enslaving-branches-how-github-does-enterprise</id>
   <content type="html">&lt;p&gt;I work on &lt;a href="http://fi.github.com/"&gt;GitHub Firewall Install&lt;/a&gt;, GitHub&amp;#39;s enterprise-level product. FI is aimed at larger companies that want to host their own version of GitHub on their own hardware. We ship them a full, self-contained stack, and once installed they have their own private github.com on their network. Pretty cool.&lt;/p&gt;

&lt;p&gt;It&amp;#39;s an interesting product to work on, and it also comes with its fair share of challenges. One of these challenges is figuring out what type of development workflow works best for us. It&amp;#39;s a type of challenge you might find yourself facing sometime, too.&lt;/p&gt;

&lt;h2&gt;Merges&lt;/h2&gt;

&lt;p&gt;The big question for FI is merges. Most new development is done on &lt;code&gt;master&lt;/code&gt;, and we&amp;#39;d like to pull that into our separate branch for FI. The &lt;code&gt;fi&lt;/code&gt; branch in particular is somewhat different from a normal branch in that it&amp;#39;s &lt;strong&gt;long-running&lt;/strong&gt;. It needs one-way merges in from &lt;code&gt;master&lt;/code&gt;, but it also has its own active codebase to maintain as we simplify FI deployment, add enterprise-y features like LDAP and CAS support, and remove some github.com features that aren&amp;#39;t relevant in the enterprise.&lt;/p&gt;

&lt;p&gt;Needless to say, a good test suite is a godsend. Merging itself may be difficult, but the ability to have your tests immediately point out to you what may be a trouble area is fantastic and, in my view, a prerequisite for this type of work.&lt;/p&gt;

&lt;p&gt;If I had to submit a technical schematic of how our merging process looks like from a developer standpoint, I&amp;#39;d probably whiteboard something like this:&lt;/p&gt;

&lt;p style="text-align: center"&gt;
  &lt;img src="http://cl.ly/1o8n/cctv-fire-funny-photoshop-by-chinese-netizens-15.jpeg" /&gt;
&lt;/p&gt;

&lt;p&gt;This is primarily because the merge ends up looking like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;By default, I probably want everything in &lt;code&gt;master&lt;/code&gt;. That&amp;#39;s where the new stuff is, and that&amp;#39;s what we&amp;#39;re looking to pull down.&lt;/li&gt;
&lt;li&gt;Except if the change in question is in conflict with an FI-specific change we&amp;#39;ve made, in which case we want to keep the FI change around.&lt;/li&gt;
&lt;li&gt;Except if THAT change in question is a new version of something we&amp;#39;ve since changed on FI, which means we need to take what&amp;#39;s in &lt;code&gt;master&lt;/code&gt;, overwrite what we&amp;#39;ve done on &lt;code&gt;fi&lt;/code&gt;, and then rewrite everything on &lt;code&gt;fi&lt;/code&gt; using the new &lt;code&gt;master&lt;/code&gt; changes so it&amp;#39;s tailored for FI.&lt;/li&gt;
&lt;li&gt;And all the while keep a look out for entirely new stuff in &lt;code&gt;master&lt;/code&gt; that&amp;#39;s going to blow up &lt;code&gt;fi&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That&amp;#39;s a little specific to our domain, but there&amp;#39;s plenty of other areas where a similar workflow happens: concurrently developing version 2.0 with your deployed 1.0 version, splitting your product into multiple products, or spinning off smaller parts from an existing product that subsequently share the same core library. It doesn&amp;#39;t become just a simple merge; you unfortunately have to be a little smart about it. But there are some crafty ways to tackle it.&lt;/p&gt;

&lt;h2&gt;Conditional Statements&lt;/h2&gt;

&lt;p&gt;Conditional statements are one way of doing it. It can be a simple as this:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fi?&lt;/span&gt;
    &lt;span class="n"&gt;destroy_planets_with_lasers&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="n"&gt;destroy_planets_with_love&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In other words, it&amp;#39;s somewhat similar to how &lt;a href="http://code.flickr.com/blog/2009/12/02/flipping-out"&gt;Flickr does feature flipping&lt;/a&gt;: explicitly branch which code you want to run. Deep in my core, I know I&amp;#39;m not super happy with this. It&amp;#39;s unclean, adds verbosity, and you can end up repeating yourself a lot. But remember: merging is what&amp;#39;s difficult, and adding verbosity ends up really improving your ability to merge. If instead in the above code we just changed &lt;code&gt;destroy_planets_with_love&lt;/code&gt; to &lt;code&gt;destroy_planets_with_lasers&lt;/code&gt; inline without the conditionals, you end up losing the context of why that change was made. By glancing at the conditional I can easily grok 1) the change, and 2) what we changed from. All of this can be found in version control, of course — I could &lt;code&gt;git log&lt;/code&gt; through and find the original context we branched from — but it&amp;#39;s a huge pain in the ass during merges to do that. In this case, verbosity is great.&lt;/p&gt;

&lt;p&gt;It&amp;#39;s not even just about the merges, either; the branch itself has a lot of specific FI code. Filesystems are simplified, enterprise features are maintained. It&amp;#39;s sometimes hard to mentally jump from one codebase to the other, and by explicitly delineating what happens in FI versus what happens on github.com, it offers us a way to easily understand code by showing us the differences. Once we remember how github.com does it, things usually fit into place mentally quite quickly.&lt;/p&gt;

&lt;h2&gt;Conditional Inherited Modules&lt;/h2&gt;

&lt;p&gt;One of the things &lt;a href="http://techno-weenie.net"&gt;Rick Olson&lt;/a&gt; did while refactoring some repo creation code on github.com was to set up what I&amp;#39;d call something like conditional inherited modules. This works great for repository creation: we do a lot of things on github.com when you create a repo, and we do a lot of things on FI when you create a repo. They both follow a similar workflow, but those workflows are different. So set up one module that you can conditionally inherit from:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;  &lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;GitHub&lt;/span&gt;
    &lt;span class="no"&gt;RepoCreator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fi?&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="ss"&gt;Fi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;:RepoCreator&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="ss"&gt;Web&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;:RepoCreator&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;GitHub&lt;/span&gt;
    &lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Web&lt;/span&gt;
      &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RepoCreator&lt;/span&gt;
        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_directories&lt;/span&gt;
          &lt;span class="c1"&gt;# write to a networked disk&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;

        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;set_permissions&lt;/span&gt;
          &lt;span class="c1"&gt;# set permissions&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;GitHub&lt;/span&gt;
    &lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Fi&lt;/span&gt;
      &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RepoCreator&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="ss"&gt;GitHub&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;:Web&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;RepoCreator&lt;/span&gt;
        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_directories&lt;/span&gt;
          &lt;span class="c1"&gt;# write to a simple file system&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;It&amp;#39;s straightforward Ruby inheritance, but for those who don&amp;#39;t use Ruby, the simple version is that on any branch we can just access &lt;code&gt;GitHub::RepoCreator&lt;/code&gt; and create a repo appropriately for that branch. In this simplified example, we write to disk differently so we override &lt;code&gt;create_directories&lt;/code&gt;, but FI still inherits &lt;code&gt;set_permissions&lt;/code&gt; because that part of the process is the same on both branches.&lt;/p&gt;

&lt;p&gt;This is also really flexible: after we did this there was a new option we wanted to add to FI that lets sysadmins create repos a little differently on their network. This makes it really easy to do that- we could just override &lt;code&gt;set_permissions&lt;/code&gt; and not have to worry about much else.&lt;/p&gt;

&lt;p&gt;The other benefit is that all of our FI-specific code is tucked neatly away in one file, and there&amp;#39;s only one main conditional to deal with. This type of inheritance works great for instances where you have similar workflows but divergent implementations. But there are times where everything&amp;#39;s just totally different, too.&lt;/p&gt;

&lt;h2&gt;Overriding Functionality&lt;/h2&gt;

&lt;p&gt;Sometimes FI itself is completely different. GitHub uses &lt;a href="http://github.com/blog/530-how-we-made-github-fast"&gt;Smoke and Chimney&lt;/a&gt; to route your request to a myriad of networked file stores. That&amp;#39;s great for github.com but a bit overkill for FI. For things like that we can swap that functionality out wholesale. If we have something like &lt;code&gt;CHIMNEY = Chimney.new&lt;/code&gt;, we can instead instantiate our own FI Chimney mock that responds to Chimney&amp;#39;s methods but doesn&amp;#39;t actually perform operations (or performs them in a simplified manner). You end up avoiding a lot of lower-level code changes all over your project and get to centralize your changes in one tidy place.&lt;/p&gt;

&lt;h2&gt;Now, Ship Amongst Yourselves&lt;/h2&gt;

&lt;p&gt;Some code will lend itself to needing only a few tweaks to keep things current with &lt;code&gt;master&lt;/code&gt;, some might be too divergent to the point where you can only fork it and split the two forever. Most will fall in-between the two. You&amp;#39;ll end up developing your own strategies to tackle your own idiosyncrasies. And who knows, maybe in the next few years there&amp;#39;ll be a &lt;code&gt;git merge-for-reals-like-figure-things-out-real-good&lt;/code&gt; that&amp;#39;ll take care of even more of this for us (at least git&amp;#39;s merging skills are quite good- I shudder to think of doing this workflow in Subversion).&lt;/p&gt;

&lt;p&gt;Anyway, merge on. And for the love of god, merge frequently.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/NlG-HDxapWI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2010/07/enslaving-branches-how-github-does-enterprise</feedburner:origLink></entry>
 
 <entry>
   <title>Is that the new iPhone with the antenna thing?</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/c4O-xKXgcYM/iphone-antenna-thing" />
   <updated>2010-07-18T00:00:00-07:00</updated>
   <id>http://zachholman.com/2010/07/iphone-antenna-thing</id>
   <content type="html">&lt;p&gt;I&amp;#39;m in Fargo, North Dakota this weekend for a buddy&amp;#39;s wedding. Fargo is, in my view, primarily known for three things: the movie, the cold, and that it&amp;#39;s the only market nearing a quarter of a million people that has absolutely zero AT&amp;amp;T coverage. Forget San Francisco reception woes- Fargo has no AT&amp;amp;T presence at all. It&amp;#39;s a struggle for me to even see a two-bar EDGE connection while I&amp;#39;m here.&lt;/p&gt;

&lt;p&gt;I&amp;#39;m no stranger to stoking my ego a little every now and then, and on this trip that means pulling out my shiny new iPhone 4 and showing it off to people that are interested. I&amp;#39;d wager I showed it to around ten people in the last 24 hours, and these two things &lt;em&gt;always&lt;/em&gt; happened:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&amp;quot;Is that the new iPhone? Can I see it?&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;But don&amp;#39;t you have problems with the antenna?&amp;quot;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It kind of blew my mind. Here&amp;#39;s a community where no one is technically permitted to own &lt;strong&gt;any&lt;/strong&gt; iPhone in the last four years, and they all seemed to immediately be able to decipher that this iPhone was the newest version. That in and of itself is testament to the incredible buzz Apple has been able to generate. Then they followed up with the antenna problem. That&amp;#39;s testament to how much people are captivated by a story.&lt;/p&gt;

&lt;p&gt;Say what you will about bumpers, about the Apple press conference, and let RIM and Motorola go on the counter-offensive about their own antennas. The only thing I&amp;#39;m concerned about is that it&amp;#39;s still the best hardware I&amp;#39;ve owned. It&amp;#39;s got the best build quality out of any object I&amp;#39;ve seen. FaceTime is a different, meaningful experience that I&amp;#39;m unexpectedly still using — and deeply enjoying — weeks past that first launch day. The camera is finally to the point where I don&amp;#39;t have to lug around my SLR, my point and shoot, or my mini HD camcorder to most places.&lt;/p&gt;

&lt;p&gt;I don&amp;#39;t experience antenna problems. I was able to reproduce it a couple of times earlier on out of curiosity if I tried hard enough, but the novelty of trying melted away once I started actually using it. My calls don&amp;#39;t get dropped. My texts all reach me fine. And the rest of the OS is great, as usual. It could be that maybe I&amp;#39;ve subconsciously repositioned my hand while using the phone, it could be that I&amp;#39;m usually in good enough coverage where it&amp;#39;s not a problem, but my workflow is never interrupted during my iPhone 4 usage. And that&amp;#39;s the most important part: if I had to consciously change my usage or how I operate that phone, that&amp;#39;d be a problem. But I&amp;#39;m not.&lt;/p&gt;

&lt;p&gt;This isn&amp;#39;t a terribly interesting post. I&amp;#39;m not calling anyone out, I&amp;#39;m not link baiting people for those precious precious page views, I&amp;#39;m not posting a sarcastic YouTube video. Society loves a scandal, but good design on a good product doesn&amp;#39;t illicit the same response. Human nature, I suppose. Luckily for Apple, it also appears to be human nature to buy a shitgaggle of Apple products. They&amp;#39;ll probably be okay.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/c4O-xKXgcYM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2010/07/iphone-antenna-thing</feedburner:origLink></entry>
 
 <entry>
   <title>Web Apps Aren't Apps</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/7RW1v1ZuQgE/web-apps-arent-apps" />
   <updated>2010-06-17T00:00:00-07:00</updated>
   <id>http://zachholman.com/2010/06/web-apps-arent-apps</id>
   <content type="html">&lt;p&gt;I really appreciate all the lengths Apple has gone to give web apps a true native feel. HTML5 hooks into geolocation, animation, local storage. Direct iOS hooks into the Springboard (&amp;quot;Add to Homescreen&amp;quot;), and the ability to remove browser window chrome. These are all great things. It lowers the bar and allows a far greater number of developers to run their own code on their iPhone. Really great stuff. But we&amp;#39;re missing out on a few core pieces.&lt;/p&gt;

&lt;p&gt;Even though you can send your web app to the home screen, move it around like an app, and make it look like an app, it&amp;#39;s still not a true app. That&amp;#39;s fine; native apps are always going to have a leg up. But by not being a &amp;quot;true&amp;quot; app, web apps face some unfortunate problems.&lt;/p&gt;

&lt;p&gt;Web apps miss out on &lt;strong&gt;multitasking&lt;/strong&gt;. I&amp;#39;ve been using iOS 4.0 for a week or so, and while multitasking works well for web apps, they&amp;#39;re relegated to second-class citizens: you have to switch to Safari to access your last page loaded. When I&amp;#39;m in Gmail&amp;#39;s mobile client, my context is &lt;em&gt;mail&lt;/em&gt;. It&amp;#39;s distinctly not &lt;em&gt;web browser that I read my mail in&lt;/em&gt;. I launch the app by tapping the Gmail icon, but I lose that context when I&amp;#39;m stuck looking for the Safari icon when switching apps.&lt;/p&gt;

&lt;p&gt;Web apps miss out on &lt;strong&gt;making that money&lt;/strong&gt;. I have to believe there&amp;#39;s a ton of developers out there that would like to sell their HTML5-based app, but don&amp;#39;t want to deal with the billing side of things. That&amp;#39;s one of the biggest selling points of AppStore: a lot of people will gladly give Apple a cut in exchange for such a braindead-simple method of distribution.&lt;/p&gt;

&lt;p&gt;Web apps miss out on &lt;strong&gt;backups&lt;/strong&gt;. I recently did a clean restore. As advertised, my apps got transferred over, my data got transferred over, but my homescreened web apps didn&amp;#39;t. I manually went back and re-added what apps I remembered to my homescreen, but it&amp;#39;s really a pain in the ass to do. It&amp;#39;s not a matter of the data inside of the apps (they usually sync to a central server anyway), it&amp;#39;s a simply matter of not being able to restore the Gmail logo to my home screen.&lt;/p&gt;

&lt;p&gt;Broadly, I view this as two problems: how do we make web apps behave more like native apps, and how do we leverage AppStore? Two problems, and I think they have one simple answer: make the damn things native. Toss each web app in a native Cocoa wrapper.&lt;/p&gt;

&lt;p&gt;This can happen transparently without any changes for web developers and, more importantly, without any changes for the end user. Still allow users to press &amp;quot;+&amp;quot; on a website to add it to the homescreen, but instead of just saving the URL, iOS can slip it into a special wrapper. It&amp;#39;ll show up in multitasking, it&amp;#39;ll sync to your Mac, it&amp;#39;ll just act more like a real app. It needn&amp;#39;t be tied to AppStore whatsoever, so you can still use HTML to bypass any of Apple&amp;#39;s rules you disagree with.&lt;/p&gt;

&lt;p&gt;But the really killer stuff is if you &lt;em&gt;do&lt;/em&gt; want to play by Apple&amp;#39;s rules and tap into AppStore. People are already doing this, I&amp;#39;m told; write a thin Cocoa wrapper around a WebKit view and do the rest over offline HTML or on your external server somewhere. And that&amp;#39;s great. But there&amp;#39;s a huge market of developers that find XCode a little daunting and don&amp;#39;t want to have to deal with that.&lt;/p&gt;

&lt;p&gt;Think of how game-changing it would be if you could sign up as a developer and upload a zip of your app&amp;#39;s code to Apple directly. In the background, Apple wraps that directory in a loving Cocoa embrace. Your compiled binary is then shipped to AppStore reviewers, where you play by the same rules as every other existing developer, and then you&amp;#39;re given your all-important &amp;quot;yay&amp;quot; or &amp;quot;nay&amp;quot;. There&amp;#39;s no complex changes for Apple to compensate for, and developers play in a realm that they&amp;#39;re comfortable with. Both make more money.&lt;/p&gt;

&lt;p&gt;You can already do this, so there shouldn&amp;#39;t be a &lt;a href="http://daringfireball.net/2010/04/iphone_agreement_bans_flash_compiler"&gt;Section 3.3.1&lt;/a&gt; problem here. You can make some &lt;a href="http://githubissues.heroku.com/"&gt;pretty immersive stuff&lt;/a&gt; in HTML nowadays, so quality shouldn&amp;#39;t be an issue. Besides, we&amp;#39;re still playing by AppStore rules, so if the app does suck, please just reject it and we&amp;#39;ll move on.&lt;/p&gt;

&lt;p&gt;The line has been blending between web apps and desktop apps for quite some time. Let&amp;#39;s just nuke the fucking line already.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/7RW1v1ZuQgE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2010/06/web-apps-arent-apps</feedburner:origLink></entry>
 
 <entry>
   <title>Androidvertising</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/udEu1ltexWA/androidvertising" />
   <updated>2010-05-26T00:00:00-07:00</updated>
   <id>http://zachholman.com/2010/05/androidvertising</id>
   <content type="html">&lt;p&gt;The last couple of days I&amp;#39;ve seen a number of different television ads for Android. I think most of them were Verizon-made, but a few others might have slipped in. The focus of these ads seemed to center around a few things: the openness of the platform, multitasking, and various spec-related aspects like processor speeds. It&amp;#39;s clear these ads are shots across iPhone&amp;#39;s bow, but the  attacks themselves are perplexing.&lt;/p&gt;

&lt;p&gt;The iPhone&amp;#39;s success stemmed from its ease of use. This is the modus operandi for most of Apple&amp;#39;s products: never compete on specs or arbitrary measurements because the vast majority of consumers really don&amp;#39;t care. And this is why these Android attacks are perplexing: Apple&amp;#39;s forced Android devices into positions that just aren&amp;#39;t as relevant.&lt;/p&gt;

&lt;p&gt;I don&amp;#39;t consider this a master stroke of Apple strategic brilliance. I don&amp;#39;t even consider this is a boneheaded move by the Android camp. I think it&amp;#39;s simply someone&amp;#39;s answer to equation: (&lt;em&gt;Android - iPhone = shit we should market&lt;/em&gt;). And that makes sense in a lot of realms: our flights have more legroom than they do, our detergent comes in larger bottles, our store is open on weekends. But doing that in the tech world ignores much about what made the iPhone (and similar competing products) so alluring in the first place: it&amp;#39;s fun to use, it&amp;#39;s simple to use, and it helps you get stuff done.&lt;/p&gt;

&lt;p&gt;Beyond that, their strategy is a much harder sell. Apple&amp;#39;s recent ads for iPhone and iPad have centered around usage: &lt;em&gt;oh, I just press that and I can get movie times&lt;/em&gt; or &lt;em&gt;oh, cool, I can use the internet on that&lt;/em&gt;. That&amp;#39;s easy to comprehend. It&amp;#39;s much harder to simultaneously describe the closed policies of the AppStore and the benefit of an open marketplace in a 30 second spot. Or that you can run an application in the background all the time and call it forward as you need it. It&amp;#39;s hard to expect the layperson to understand these concepts when all they really want to know is how to access ESPN.com or watch a movie.&lt;/p&gt;

&lt;p&gt;Don&amp;#39;t get me wrong: a chunk of consumers want to know this stuff. They understand how speed impacts the user experience and why a faster processor might interest them. They get why arbitrary app installation can rock. And maybe that&amp;#39;s really the type of audience they&amp;#39;re trying to target. But we&amp;#39;re no longer in an era where the general public gives a shit. We can argue all we want whether the general populace is full of morons, but it&amp;#39;s not going to sell more product.&lt;/p&gt;

&lt;p&gt;In the meantime, Apple continues to push ads that sell the experience, and the Android camp appears to be pushing ads that sell the device. I can&amp;#39;t help but feel that Android would be better off if they focused more on what makes their platform enjoyable rather than what simply makes them different.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/udEu1ltexWA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2010/05/androidvertising</feedburner:origLink></entry>
 
 <entry>
   <title>The Clean Slate</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/hn-Sv3JiXjs/the-clean-slate" />
   <updated>2010-05-23T00:00:00-07:00</updated>
   <id>http://zachholman.com/2010/05/the-clean-slate</id>
   <content type="html">&lt;p&gt;There&amp;#39;s a certain allure to iPad and iPhone development right now. It&amp;#39;s the idea of the clean slate: there&amp;#39;s no legacy support, no underlying codebase, no real concepts of former implementations. For every app that is tied to an existing website or business, there&amp;#39;s an app that is forging out on its own, with no ties to anything to come before it.&lt;/p&gt;

&lt;p&gt;This doesn&amp;#39;t happen too often. The iPhone was the first real platform change in decades. You could always do the Big Rewrite every time OS X bumps a version or Windows moves from 95 to 98, of course, but existing concepts and methodologies subtly squeezed innovation, to say nothing of the temptation of leveraging existing codebases and libraries in an effort to just &amp;quot;get that prototype out fast&amp;quot;. We&amp;#39;re in the middle of a time more free than we&amp;#39;ve seen in ages. It&amp;#39;s full of frustrations, creativity, opportunity, and failure. But it&amp;#39;s &lt;em&gt;exciting&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Shipping entirely new platforms is a lost art. It just doesn&amp;#39;t happen much anymore. Everything in the Windows, OS X, and Linux worlds have been incremental for the last decade or two. Sure, there&amp;#39;s always framework changes, new features born, old features thrown away, but it&amp;#39;s rare to sit back and say &amp;quot;Yeah, this is an entirely different way of thinking&amp;quot;. It doesn&amp;#39;t just take innovation; new platforms require &lt;em&gt;scale&lt;/em&gt;. Your new library that you pushed last weekend to your six collaborators, no matter how killer, doesn&amp;#39;t count. A platform needs scale to become significant.&lt;/p&gt;

&lt;p&gt;It just doesn&amp;#39;t happen often. But when it does, it&amp;#39;s &lt;em&gt;exciting&lt;/em&gt;. The iPhone platform is the latest and greatest example. Whether the ideology espoused by that platform will ultimately win out is irrelevant; that there&amp;#39;s suddenly such a big push for a different way of computing is what&amp;#39;s important. Like it or not, it&amp;#39;s one of the biggest changes since the 1980&amp;#39;s.&lt;/p&gt;

&lt;p&gt;But that&amp;#39;s not the only example. I remember my jaw dropping during the shift from Super Nintendo to Nintendo 64: the games enabled by the new platform itself were completely different. Far more immersive, far more potential. Sony eventually took the crown, but at that point everyone could see the game itself was changing. It was incremental from there, until the Wii broadened the industry&amp;#39;s horizons further.&lt;/p&gt;

&lt;p&gt;Similar things happened in the web front: frameworks were largely heavy-Java-Spring-ish or interesting-but-closed-source until Ruby on Rails came along and floored everyone. It wasn&amp;#39;t just its innovations that were important: Rails brought things &lt;em&gt;to scale&lt;/em&gt;, and &lt;em&gt;that&amp;#39;s&lt;/em&gt; what made it a game changer. One of the early complaints about Rails was that it was all marketing, insinuating it was just fluff, just a toy. But the marketing — whether you like it or not — &lt;em&gt;was&lt;/em&gt; a huge part of Rails. The buzz surrounding the project scaled the reach of Rails, spreading its ideas far and wide. Once this new platform — an ideology, really — came around, it changed the landscape and dozens of frameworks all over the language globe grew and blossomed, based in large part to the validation of certain ideas Rails adopted.&lt;/p&gt;

&lt;p&gt;I think we&amp;#39;re starting to see this now. The iPhone&amp;#39;s brought with it a lot of cool new ideas, new lines of thinking about how a phone should be made, how a computer should be made. Android&amp;#39;s picked up on this and forked themselves in a slightly different (but very analogous) direction. It&amp;#39;s hard to imagine living today with the phones planned by Motorola of 2003. The phone market just wasn&amp;#39;t evolving from their stubborn mindset back then. But today, everyone, regardless of carrier, has benefited.&lt;/p&gt;

&lt;p&gt;This stuff doesn&amp;#39;t happen often. Pretty exciting to be in the thick of it right now.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/hn-Sv3JiXjs" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2010/05/the-clean-slate</feedburner:origLink></entry>
 
 <entry>
   <title>Rebuild Facebook</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/vxkttoeFmr8/rebuild-facebook" />
   <updated>2010-05-08T00:00:00-07:00</updated>
   <id>http://zachholman.com/2010/05/rebuild-facebook</id>
   <content type="html">&lt;p&gt;It seems like every day this past week there&amp;#39;s been some new story about privacy issues and security holes at Facebook. People are starting to get really pissed at the company. I&amp;#39;m not; I find the whole thing fascinating. Here we have a massive company who has grown far beyond what anyone had anticipated, and it&amp;#39;s experiencing some growing pains as it transitions from the site people signed up for yesterday to the site people will use tomorrow.&lt;/p&gt;

&lt;p&gt;This is classic opportunity, guys.&lt;/p&gt;

&lt;p&gt;Hacker News is all aflutter about building peer-to-peer proxied distributed neutral neural private interconnected nodes having sex with each other to replace Facebook. I know, right? The whole point of Facebook was that I connect to &lt;em&gt;non-nerds&lt;/em&gt;. The moment anything gets even the slightest bit complicated, you start losing them. That can be surmounted in a lot of sites, but for social networking you need to retain as many users as possible in order to exploit the network effect.&lt;/p&gt;

&lt;p&gt;The easiest and quickest way to build a Facebook-level of replacement is to just blatantly copy Facebook. Not the Facebook of 2010, of course — today&amp;#39;s Facebook can hardly be called Facebook — but the Facebook of yesteryear. Tap into the primal urges that got people &lt;em&gt;really excited&lt;/em&gt; about the site in the first place. My university was in the first half-dozen of schools added to Facebook, and I remember this new site out of nowhere hitting roughly 90-95% student penetration within a couple of weeks. That&amp;#39;s absurd... but not completely unexpected.&lt;/p&gt;

&lt;p&gt;When Facebook first came out, people were excited about person-to-person communication. It was especially enticing for those graduating in my class of &amp;#39;08; we were in our first two weeks of our first year of college when Facebook debuted, and it was the perfect service to connect ourselves with both our newfound college friends and our old high school friends from back home. It had some features like class scheduling and planning, but it was most exciting as a simple, straightforward way to keep in touch with your new and old friends.&lt;/p&gt;

&lt;p&gt;Eventually Facebook broadened into what many of us would classify as &amp;quot;true&amp;quot; Facebook: friend connections, photos, status updates, possibly events. And it was good. And then they added their API, and it slowly sank into what it is today.&lt;/p&gt;

&lt;p&gt;The ironic part of this is that there&amp;#39;s a huge opportunity for a new player in the exact space that Facebook just vacated. Facebook used to be about connections: how are my friends doing? What are they doing? And what are they planning on doing? Today, Facebook&amp;#39;s more meta-personal. It broadcasts information that &lt;em&gt;I never wanted to see or know&lt;/em&gt;: here&amp;#39;s how I scored on a game. You should play this game. You should see this link.&lt;/p&gt;

&lt;p&gt;It all serves to dilute the information that really matters in life. Oh? You had a baby? I didn&amp;#39;t notice because it was sandwiched between fifty Farmville notices. You visited San Francisco last week? I read my newsfeed much less nowadays, so I missed it and missed your visit. Even stupid shit like you threw a monster kegger last weekend. Awesome! &lt;em&gt;I&lt;/em&gt; want to know about that, because you&amp;#39;re significant in my life, and &lt;em&gt;I&lt;/em&gt; want to stay in touch with you. This is how you&amp;#39;re &lt;em&gt;living your life&lt;/em&gt;, which is far more interesting than your 7th top score on Scrabble.&lt;/p&gt;

&lt;p&gt;Facebook&amp;#39;s proven there&amp;#39;s a huge, huge market for superficial interactions. I&amp;#39;m not knocking that; it&amp;#39;s gotten a lot of people into casual gaming, and millions of people enjoy mini-games and the social atmosphere surrounding the Facebook app ecosystem. It&amp;#39;s just not for me anymore, and judging from the backlash lately, lots of other people, too. The beauty of it is that I think these are two separate markets now. Facebook&amp;#39;s moved onto some weird amalgamation of games and APIs and graphs and crazy. A smaller, simpler experience can coexist with that.&lt;/p&gt;

&lt;p&gt;Make it simple; follow Twitter&amp;#39;s lead. Make it focused; follow 37signals&amp;#39; lead. Make it social; follow Facebook&amp;#39;s lead. Make it private; follow, well, that might be where you have to blaze a trail, but it shouldn&amp;#39;t be hard... just don&amp;#39;t be a dick with other people&amp;#39;s data. If you can resist the temptation to toss the kitchen sink in it, there&amp;#39;s a good chance you can develop a following. From that following, build it up into something meaningful. I&amp;#39;d love to see a killer new startup tackle these issues. &lt;/p&gt;

&lt;p&gt;There&amp;#39;s a lot of excitement in personal, direct relationships that no one&amp;#39;s tapping right now. Twitter&amp;#39;s too open, Facebook&amp;#39;s too broad. Let people rediscover through text and photos the real, physical connections that have been pushed aside in the last few years. A big, lumbering giant with privacy concerns is too big of an opportunity to pass up.&lt;/p&gt;

&lt;p&gt;Here: a poke for good luck.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/vxkttoeFmr8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2010/05/rebuild-facebook</feedburner:origLink></entry>
 
 <entry>
   <title>Apple is Petrified</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/XbX2k_ofuPc/apple-is-petrified" />
   <updated>2010-04-27T00:00:00-07:00</updated>
   <id>http://zachholman.com/2010/04/apple-is-petrified</id>
   <content type="html">&lt;p&gt;Apple is petrified.&lt;/p&gt;

&lt;p&gt;This thought occurred to me after watching a video of &lt;a href="http://www.youtube.com/watch?v=Gng29RIhIl8"&gt;Spotify&amp;#39;s&lt;/a&gt; new features: social sharing, tight mobile device integration, local library syncing, streaming, the likes. I don&amp;#39;t use Spotify, and I don&amp;#39;t know whether that&amp;#39;ll change in the future, but I became far more interested in just the concept of Apple trying to do any of these.&lt;/p&gt;

&lt;p&gt;Apple&amp;#39;s the company everyone pins as being &lt;strong&gt;BOLD&lt;/strong&gt; and &lt;strong&gt;BALLSY&lt;/strong&gt; and other colorful adjectives describing &amp;quot;fuck you&amp;quot; attitudes towards ingrained ideas. And now this is the point where it&amp;#39;s custom for me to mention dropping the floppy drive. And supporting USB instead of serial ports. And Wi-Fi. And the continued lack of Blu-ray (does anyone actually feel like they &lt;em&gt;need&lt;/em&gt; that anymore anyway?). And so on and so on. Apple&amp;#39;s certainly been in the midst of controversy for these types of decisions, and they&amp;#39;ve all turned out to be great decisions. Cool.&lt;/p&gt;

&lt;p&gt;But can they really do it for themselves?&lt;/p&gt;

&lt;p&gt;Apple has a problem: iTunes. I&amp;#39;ve &lt;a href="http://zachholman.com/2010/02/the-future-of-itunes"&gt;written about iTunes&lt;/a&gt; before, specifically with regard towards how Apple transitions it into the future. Cloud-based streaming, wireless syncing, cutting features, simplifying the bloated iPod syncing. They&amp;#39;re all relatively safe bets for the vague short-or-long-term future. But there&amp;#39;s a difference between Apple founded in 1976 versus a startup founded last year. Apple is heavily, heavily invested in iTunes as a platform. I don&amp;#39;t think they can just trash that.&lt;/p&gt;

&lt;p&gt;I&amp;#39;m sure they want to. They&amp;#39;re the company who, after years of iMovie development and versions released, allegedly threw it all out the window after one engineer decided to rewrite it as he saw fit. Apple saw the demo, threw resources behind it, and shipped a better app, in my opinion. I wouldn&amp;#39;t be surprised if there&amp;#39;s a hard drive full of iTunes replacement demos and sketches and prototypes and possibly even finished projects at this point- iTunes is so old that&amp;#39;s a near guarantee. But today we&amp;#39;re still stuck with a huge, all-encompassing app that handles everything.&lt;/p&gt;

&lt;p&gt;This isn&amp;#39;t a technical challenge. If Spotify can build these features as a smaller startup, Apple surely can several times over. And I&amp;#39;m sure they can continue to toss them into iTunes. But at some point, I think it&amp;#39;s going to be clear that they&amp;#39;re going to need a fresh start. There&amp;#39;s just way too much stuff in iTunes for comfort. And some of these new ideas — cloud-based streaming, for one — might be different enough to where it just doesn&amp;#39;t work to shoehorn it into the iTunes GUI anymore.&lt;/p&gt;

&lt;p&gt;What do they do? Rewrite everything like a startup would and make the perfect media manager and player? I&amp;#39;m sure they could and want to do that. But iTunes is comfort. iTunes is your interface to some of your most prized possessions on your computer: your media. iTunes is what hundreds of millions of people have gotten used to over the years. iTunes has a huge ecosystem on top of it: from software integration like Last.fm or Growl helpers, to homebrewed AppleScript, to people&amp;#39;s mental models of how music &amp;quot;should work&amp;quot;. The former technical issues Apple doesn&amp;#39;t shy away from: they&amp;#39;ll pull the rugs out from under developers without too much of a sweat. But the latter, how this software has grown deep roots on a human level, is something I don&amp;#39;t think Apple has had to face before.&lt;/p&gt;

&lt;p&gt;Microsoft has, of course. They&amp;#39;ve been battling all this for years. And the funny part is that much of their issues stem from what Apple cares less about: the technical side of things. They worry more about backward compatibility, about breaking third party software, about breaking device drivers. And they &lt;em&gt;still&lt;/em&gt; are fighting that battle. On top of all that, there&amp;#39;s still people on Windows XP who adamantly won&amp;#39;t upgrade not because of the technical worries but because &lt;em&gt;it&amp;#39;s different&lt;/em&gt;. It&amp;#39;s outside of their comfort level. It&amp;#39;s so utterly ingrained into them that moving scares the shit out of them. &lt;em&gt;Sure, maybe I&amp;#39;ll upgrade applications, but my OS? That&amp;#39;s my anchor point! How do I work without my anchor?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;iTunes is like that to many people. Not nearly as ingrained as their OS, but outside of the geek circles we inhabit there are an awful lot of people whose primary application is iTunes. They might use Word here and there, some web browsing, some emailing, but iTunes is likely open all the time and in use all the time. It&amp;#39;s how they sync their data. It&amp;#39;s how they watch movies. It&amp;#39;s how they buy music. It is a &lt;em&gt;big deal&lt;/em&gt; to these people.&lt;/p&gt;

&lt;p&gt;This isn&amp;#39;t a matter of &amp;quot;wtf morons, get your shit into gear and upgrade&amp;quot; if iTunes 14.0 is rewritten, simple, fast, and awesome. If there&amp;#39;s one little thing in there that Apple deems too unimportant to make the cut, someone will inevitably complain and all the sudden there will be eight hundred Facebook groups titled &amp;quot;ONE MILLION STRONG AGAINST ITUNES 14 WHERES OUR LIBRARY SKIP COUNT TRACKING&amp;quot;. Facebook is a stellar example of this whole &lt;em&gt;shit-bricks&lt;/em&gt; effect: every time Facebook changes their design or some other major component, everyone shits bricks. Not because the change itself is necessarily &lt;em&gt;bad&lt;/em&gt;, per se; it&amp;#39;s just different. People are scared of change, and that goes for triple in the nascent technical world.&lt;/p&gt;

&lt;p&gt;Don&amp;#39;t get me wrong: Apple&amp;#39;s going to change iTunes in the future. The rumors of their massive, massive data center nearing completion gives hope towards some cool cloud-based changes, potentially. But iTunes presents a problem that Apple very rarely experiences: a product so ingrained that changing it could pose serious adoption challenges at best, and serious product abandonment at worst.&lt;/p&gt;

&lt;p&gt;Personally, I hope they do it anyway. Squirrel away an elite team inside Apple, tell them to solve the iTunes problem, and whatever they come up with do everything but name it iTunes. This is how the iPod will die. Rather than continue to build on an aging system, they created the Touch from scratch, made it awesome, and no one notices it doesn&amp;#39;t have... well, I can&amp;#39;t think of what it doesn&amp;#39;t have, but that&amp;#39;s kind of the point.&lt;/p&gt;

&lt;p&gt;I don&amp;#39;t think they will. I suspect it will be more of the same for the foreseeable future: incremental updates, more feature additions, more bloat, cautious plays. And that&amp;#39;s what companies like Spotify are betting on. And that&amp;#39;s why all this stuff is so great to watch: if a lumbering giant moves too slowly, someone smaller and quicker will beat them on their own turf.&lt;/p&gt;

&lt;p&gt;Unless, of course, the lumbering giant is pretty nimble on its toes, too.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/XbX2k_ofuPc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2010/04/apple-is-petrified</feedburner:origLink></entry>
 
 <entry>
   <title>Gizmodo</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/XTOWB7wD3Y4/gizmodo" />
   <updated>2010-04-17T00:00:00-07:00</updated>
   <id>http://zachholman.com/2010/04/gizmodo</id>
   <content type="html">&lt;p&gt;&lt;img src="http://cl.ly/6av/douchebags.jpg" title="Jason Chen and Jesus Diaz are douchebags, obviously" width="600" height="150" alt="couplea douchebags" /&gt;&lt;/p&gt;

&lt;p&gt;I apologize. Starting out a blog post with the names and photos of some guys as a result of how those guys did their jobs is really dirtbag journalism. Slimy, awful, dirtbag journalism. But don&amp;#39;t worry, it&amp;#39;s on the internet. I guess. Besides, it wasn&amp;#39;t just Jason Chen and Jesus Diaz who were douchebags; there&amp;#39;s probably a few other douchebags involved at Gizmodo, too.&lt;/p&gt;

&lt;p&gt;Here&amp;#39;s the thing. As a media outlet, I get it: getting the scoop is fun. It&amp;#39;s also profitable. But there&amp;#39;s a certain line that, as journalists, you should be loathe to cross. I get it: reporting on new hardware is exciting. Getting the exclusive is great. Getting the actual device &lt;em&gt;in your possession&lt;/em&gt; is astounding. I&amp;#39;ll grant you all of that. I&amp;#39;ll even grant that you can buy that information off the street. I think that last particular point is wildly dubious — and I suspect Apple Legal might take note of that — but I&amp;#39;ll give it to you. What&amp;#39;s not news is posting the name, personal details, and photo of some guy who experienced a careless mistake and passing it off as news.&lt;/p&gt;

&lt;p&gt;Does reporting the story sans-identifiable information have any bearing on the story itself? At all? As a reader I would have been content with &amp;quot;a software developer working at Apple&amp;quot;. I would have been happy if Gizmodo posted that they knew the identity but were refraining from releasing it. All of that makes sense. They strengthen evidence of the story&amp;#39;s authenticity by posting all of that information. But posting the details of some low-level employee is tabloid journalism. I suspect even tabloids have standards that would prevent them from reporting on non-newsworthy private citizens.&lt;/p&gt;

&lt;p&gt;If it were Schiller or Ive or any other public figure at Apple, sure, it may have been appropriate to release the name. I just feel bad for this random Apple guy. He&amp;#39;s probably going to lose his job over what likely amounts to a careless mistake. We don&amp;#39;t know if he was drunk or anything close to it; we&amp;#39;ve all made mistakes even while sober. It will follow him past his term of employment at Apple: the front page of Google for his name already is splashed with articles, posts, and tweets about his actions.&lt;/p&gt;

&lt;p&gt;Gizmodo has never really cared about &lt;a href="http://www.901am.com/2008/gizmodo-very-proud-of-its-unethical-demeanor-at-ces.html"&gt;ethical&lt;/a&gt; &lt;a href="http://gizmodo.com/gadgets/cellphones/gizmodo-knows-iphone-will-be-announced-on-monday-221991.php"&gt;responsibility&lt;/a&gt; in the past, so it&amp;#39;s par the course, apparently. The New York Times, at least, is &lt;a href="http://www.nytimes.com/2010/04/20/technology/companies/20apple.html?hp"&gt;reporting&lt;/a&gt; on the story without the drivel... old media still leads the way in some facets of journalism.&lt;/p&gt;

&lt;p&gt;It&amp;#39;s a cool story that would have stood on its own fine, but then Gizmodo had to be dicks. &lt;a href="http://twitter.com/holman/status/12490814005"&gt;I&amp;#39;m pretty curious&lt;/a&gt; as to what Apple Legal&amp;#39;s next move will be.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/XTOWB7wD3Y4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2010/04/gizmodo</feedburner:origLink></entry>
 
 <entry>
   <title>Cloudy With a Chance of Clients</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/6PluUo5xHXg/cloudy-with-a-chance-of-clients" />
   <updated>2010-04-06T00:00:00-07:00</updated>
   <id>http://zachholman.com/2010/04/cloudy-with-a-chance-of-clients</id>
   <content type="html">&lt;p&gt;When I get a new email I potentially hear the &lt;em&gt;ding&lt;/em&gt; of Mail.app up to four times, depending on where I am in relation to my various devices.&lt;/p&gt;

&lt;p&gt;We&amp;#39;ve been through a number of different visualizations of the future: from everything &lt;em&gt;is&lt;/em&gt; mainframes, to everything &lt;em&gt;on&lt;/em&gt; mainframes connecting over thin clients, to commodity clients networked together, then back to thin clients, and now I think we&amp;#39;re moving towards a slight modification of the thin client idea.&lt;/p&gt;

&lt;p&gt;The iPad threw me for a loop. My iMac at home — center of my computing setup — appears to be falling off the cliff of relevancy. At least judging from these first few days post-launch, if I&amp;#39;m at home and not coding, there&amp;#39;s very little reason for me to get up and hop on the iMac if my iPad&amp;#39;s nearby. Not only is it just easier to deal with, but it&amp;#39;s the iPad&amp;#39;s &lt;a href="http://zachholman.com/2010/04/the-soloist/"&gt;singular focus&lt;/a&gt; that makes it simpler and more enjoyable to use. I use a MacBook Pro as my &amp;quot;work&amp;quot; machine, but the significance of a pure &amp;quot;work&amp;quot; machine is dwindling with the addition of new devices.&lt;/p&gt;

&lt;p&gt;The foundation for distributed computing has been built: all my code is &lt;a href="http://github.com"&gt;on the cloud&lt;/a&gt;, my documents/contacts/iCal are effectively &lt;a href="http://www.me.com"&gt;on the cloud&lt;/a&gt;, and my &lt;a href="http://www.newsgator.com/individuals/netnewswire/"&gt;most&lt;/a&gt;-&lt;a href="http://www.google.com/apps/intl/en/business/index.html"&gt;used&lt;/a&gt; &lt;a href="http://twitter.com"&gt;apps&lt;/a&gt; all tend to interface or be built around the web anyway. In short, I can get access to my data from most places as long as I have an internet connection. That&amp;#39;s really cool, and it&amp;#39;s a luxury we didn&amp;#39;t have a few short years ago.&lt;/p&gt;

&lt;p&gt;Syncing data itself isn&amp;#39;t necessarily the problem anymore. It&amp;#39;s the &lt;em&gt;where&lt;/em&gt; of syncing, the &lt;em&gt;when&lt;/em&gt; of syncing. If I&amp;#39;m on my iMac, it&amp;#39;d be great to get all my notifications pushed to me there. If I&amp;#39;m on my MacBook in a cafe, instant messages should get sent directly to my MacBook and not be duplicated if I happen to be signed-in at home. Same if I&amp;#39;m on my iPad. If all else fails, shoot it to my iPhone. The idea is that everything just seamlessly &lt;em&gt;works&lt;/em&gt;, that I don&amp;#39;t have to worry to sign out of my iMac before I head out the door, that I don&amp;#39;t need to scroll up on Tweetie in four separate devices just to catch up on my tweets, that I don&amp;#39;t get the same IM in three separate places at once.&lt;/p&gt;

&lt;p&gt;It&amp;#39;s not just notifications, either. My iPad was able to sync with my iMac or the AppStore to get my existing iPhone apps, but they were all a blank slate. I had to re-enter all my Google Reader auth details again. Local preferences I saved in one app didn&amp;#39;t transfer over to another device. Part of this can be solved by dumping more functionality onto the cloud, but it also means some deeper integration from Apple for developers to sync their data cross-platform, for Apple to know which device to send notifications to. There needs to be an idea of your physical &lt;em&gt;presence&lt;/em&gt; in relation to your computing.&lt;/p&gt;

&lt;p&gt;It&amp;#39;s weird it&amp;#39;s gotten to this point. It&amp;#39;s a completely strange concept, when you think about it; everything I mentioned can be solved &lt;em&gt;today&lt;/em&gt;, with existing technology and some smart developers. The data problem is already solved; it&amp;#39;s the data awareness that isn&amp;#39;t. But that we&amp;#39;ve made it this far is pretty astounding. I swap between multiple machines a day, with my email, documents, and communication following me as I do, with relative ease. All things considered, cloud computing has had relatively few widespread, cataclysmic data loss incidents. And the devices themselves are far more futuristic than what we could have imagined a decade or two ago. Sometimes the future&amp;#39;s fucking awesome to live in.&lt;/p&gt;

&lt;p&gt;But other than that, fix that other stuff.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/6PluUo5xHXg" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2010/04/cloudy-with-a-chance-of-clients</feedburner:origLink></entry>
 
 <entry>
   <title>The Soloist</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/s3GJK0IgGDU/the-soloist" />
   <updated>2010-04-03T00:00:00-07:00</updated>
   <id>http://zachholman.com/2010/04/the-soloist</id>
   <content type="html">&lt;p&gt;I could go on for awhile about first-party iPad apps (Maps and Photos are fantastic, and YouTube finally transforms YouTube into, well, not YouTube), and about third-party apps (ABC, Netflix, New York Times, and growing competition in Twitter app land are all keen launch-day examples), but I think that time is going to show that these apps aren&amp;#39;t isolated cases. These apps are a part of a platform that specializes in really great, best-on-the-planet type of quality.&lt;/p&gt;

&lt;p&gt;I think this is a consequence of a lot of things- strong design leadership from Apple, strong leadership from the &amp;quot;Delicious Generation&amp;quot; of Mac developers moving to the iPhone, and indeed, the AppStore itself for proving it&amp;#39;s economically viable. But I think the biggest motivator is &lt;em&gt;singular focus&lt;/em&gt;, that you&amp;#39;re not dealing with multiple apps at a time. No window chrome to deal with, no menu bar menus, no playing second fiddle to one or two or twelve other apps open at the same time. Even if (or when) Apple introduces 3rd party multitasking, I suspect it won&amp;#39;t impact the main one-app-at-a-time viewpoint we&amp;#39;ve had the last few years.&lt;/p&gt;

&lt;p&gt;You play differently when you&amp;#39;re on stage by yourself than when you&amp;#39;re in a 300-piece marching band. Each breath you take — and each you don&amp;#39;t take — will be scrutinized by an audience with its attention solely on &lt;em&gt;you&lt;/em&gt; and &lt;em&gt;you alone&lt;/em&gt;. You make sure your instrument&amp;#39;s in good shape, your fly isn&amp;#39;t down, your hair isn&amp;#39;t out of place. You want them concentrating on your music rather than some inane detail that doesn&amp;#39;t even impact your music in the first place.&lt;/p&gt;

&lt;p&gt;The app is a soloist. There&amp;#39;s too much competition to fuck it up. Whether or not you agree with the amount of mindshare the iPhone platform has garnered, it still is a massive player in the market today. And all of these reasons are why people are throwing their best at the platform, from &lt;a href="http://abc.go.com/site/abc-player-for-ipad?cid=ipad_abc_abcPencilRdblk_Launch"&gt;huge corporate giants&lt;/a&gt; to &lt;a href="https://squareup.com"&gt;small, cutting edge startups&lt;/a&gt;. Either way, there&amp;#39;s some really cool shit out there now, and we&amp;#39;re going to look back in six months and wonder how we got by without those cool apps that haven&amp;#39;t even yet been sketched.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/s3GJK0IgGDU" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2010/04/the-soloist</feedburner:origLink></entry>
 
 <entry>
   <title>Your Ad Blocker Probably Blocked This Post</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/A7MuSrqkcj0/your-ad-blocker-probably-blocked-this-post" />
   <updated>2010-03-06T00:00:00-08:00</updated>
   <id>http://zachholman.com/2010/03/your-ad-blocker-probably-blocked-this-post</id>
   <content type="html">&lt;p&gt;Ars Technica penned an &lt;a href="http://arstechnica.com/business/news/2010/03/why-ad-blocking-is-devastating-to-the-sites-you-love.ars?utm_source=rss&amp;amp;utm_medium=rss&amp;amp;utm_campaign=rss"&gt;interesting article&lt;/a&gt; this weekend on ad blocking and how it impacts an outfit like theirs. This &lt;a href="http://www.reddit.com/r/technology/comments/ba3b7/why_ad_blocking_is_devastating_to_the_sites_you/"&gt;spawned discussions&lt;/a&gt; of varying quality ranging from thoughtful discourse on the problems of client-side ad implementations, all the way to &amp;quot;WTF FUCK ADVERTISING&amp;quot;.&lt;/p&gt;

&lt;p&gt;I&amp;#39;ve been in the advertising game in some capacity for nearly a decade now, so I have a bit of a small- to medium-size publisher perspective in all this. Ad blocking has been around for the majority of that time, and that we&amp;#39;re still in a battle about it is interesting to me.&lt;/p&gt;

&lt;p&gt;It turns out monetizing entire new mediums is difficult.&lt;/p&gt;

&lt;h2&gt;Fuck Ads&lt;/h2&gt;

&lt;p&gt;Hey, let&amp;#39;s start with users. A large — and vocal — chunk of users block ads. There&amp;#39;s three reasons:&lt;/p&gt;

&lt;h3&gt;The ads, on a technical level, suck.&lt;/h3&gt;

&lt;p&gt;This covers a slew of ads ranging from poorly-designed ads (audio, graphically substandard, attention-grabbing, invasive) to resource-intensive ads (otherwise known as the &amp;quot;Flash is garbage&amp;quot; movement). In other words, people block ads because they fear ads may otherwise impact their productivity.&lt;/p&gt;

&lt;h3&gt;The ads, on a targeting level, suck.&lt;/h3&gt;

&lt;p&gt;This covers everything from low-brow ads (&amp;quot;LOSE WEIGHT FAST!&amp;quot;) to adult ads to ads that just don&amp;#39;t interest people on a broad level. Personally, I don&amp;#39;t even mind ads that aren&amp;#39;t targeted to me if the ad themselves are well-done; even though I might not be in the market for a BMW, it&amp;#39;s nice to see a well-designed, full-page ad for one of their cars.&lt;/p&gt;

&lt;h3&gt;Some are freeloaders.&lt;/h3&gt;

&lt;p&gt;A small group of ad blockers literally won&amp;#39;t care and will block regardless.&lt;/p&gt;

&lt;h2&gt;Fix Ads&lt;/h2&gt;

&lt;p&gt;As advertising-funded site owners, I&amp;#39;m going to argue the first and last are irrelevant for us. The freeloaders you can&amp;#39;t deal with regardless (see: file sharing), and those that block from a technical standpoint are going to be extremely difficult to please, for the simple reason that we&amp;#39;ve hammered it into their subconscious for years that advertising consists of invasive content. Even if Ars, for example, promises no popups, no Flash, no audio, and no interstitials, users just don&amp;#39;t think that way. Ads change over time. This page view may be different than the next. It&amp;#39;s easy to block, so might as well block than risk having something jump out at you down the line.&lt;/p&gt;

&lt;p&gt;Instead, targeting is a far better option. This includes typical content relevancy (a la AdSense), but it also includes better, high-brow ads. It&amp;#39;s the same reason people watch the Super Bowl commercials instead of flipping away: ads are just &lt;em&gt;better&lt;/em&gt; then. Far easier to watch. The problem, of course, is that these two areas are extremely hard to make work.&lt;/p&gt;

&lt;h2&gt;Flux Ads&lt;/h2&gt;

&lt;p&gt;If you&amp;#39;re a small- to medium-sized publisher (even, say, up to Ars-sized), finding advertising is both difficult to do and a pain in the ass to do so. Handling billing, making schedules, monetizing every page view, setting up default chains... just the baseline concepts are a grind to deal with, and every hour you spend reworking ads you take away from doing the stuff you really enjoy doing: namely, working on your site and creating something new. &lt;/p&gt;

&lt;p&gt;The path of least friction is to outsource to 3rd party networks. Google, Tribal Fusion, Amazon, whomever. It&amp;#39;s far easier than doing direct sales, and they ensure that you can monetize your entire traffic stack from top to bottom. But that&amp;#39;s exactly the reason people block: the ads you get are usually shitty, irrelevant, and a pain to deal with. That&amp;#39;s the core of the problem: the &lt;strong&gt;path of least resistance is the path of most suck&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;There&amp;#39;s ways to get around this. Google AdSense, for example, is far less invasive, but you&amp;#39;re still gambling on the quality of text results to be contextual and not low-brow, and that&amp;#39;s a risky gamble. Ideally, networks like &lt;a href="http://decknetwork.net/"&gt;The Deck&lt;/a&gt; and &lt;a href="http://buysellads.com"&gt;BuySellAds&lt;/a&gt; start taking over as the easiest thing to implement. I run BuySellAds on &lt;a href="http://www.good-tutorials.com"&gt;Good-Tutorials&lt;/a&gt; and, though it doesn&amp;#39;t offer me enough of a breadth of advertisers to run them exclusively, it does consistently run ads that are topical, neatly-designed, and more clickable than anything else currently.&lt;/p&gt;

&lt;h2&gt;Farewell, Ads?&lt;/h2&gt;

&lt;p&gt;I don&amp;#39;t think this is going to happen. If the last decade was instructive (which it should have been), it&amp;#39;s taught us that site owners are scum or otherwise don&amp;#39;t care enough to make advertising an effective long-term revenue model. I doubt advertising is going to completely collapse, of course, but between ad blocking, the user&amp;#39;s natural avoidance inclination, and the general decreasing effectiveness of advertising, things aren&amp;#39;t going to get better. And the problem with ad blockers is that the online advertising industry has been so messed-up for so long that honest publishers like Ars get slotted into the same grouping as your Viagra vendor and they feel the squeeze financially because of it.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/A7MuSrqkcj0" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2010/03/your-ad-blocker-probably-blocked-this-post</feedburner:origLink></entry>
 
 <entry>
   <title>The Human is a RESTful Client</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/v5DDQov4nEA/the-human-is-a-restful-client" />
   <updated>2010-03-01T00:00:00-08:00</updated>
   <id>http://zachholman.com/2010/03/the-human-is-a-restful-client</id>
   <content type="html">&lt;p&gt;There&amp;#39;s plenty of great &lt;a href="http://en.wikipedia.org/wiki/Representational_State_Transfer"&gt;technical writeups&lt;/a&gt; and &lt;a href="http://tomayko.com/writings/rest-to-my-wife"&gt;non-technical writeups&lt;/a&gt; on REST. In short, REST is one way to model and present your data to your users in a consistent, logical fashion that lends itself to being accessible humans, machines, and your own developers. (I don&amp;#39;t know if I just called developers neither human nor machine, but let&amp;#39;s go with it.)&lt;/p&gt;

&lt;p&gt;There&amp;#39;s a number of great technical reasons to move to an architecture like REST. In fact, there&amp;#39;s a number of great reasons to implement SOAP, XML-RPC, or similar architecture on your app, the distinctions being less relevant for this post. But REST isn&amp;#39;t just for API clients or web browsers: REST is for people, too.&lt;/p&gt;

&lt;p&gt;Part of what REST does really well is help you to define the resources for your app. User, Post, Tag, Comment... all of these form the concept of a blog. By defining your structure this way, not only can you craft a machine-readable and machine-writeable interface for your site, but you can end up centering your UI around this, too. It&amp;#39;s easy enough to scaffold your usual CRUD of an app: a barebones form to create a new Post, a page to show that Post, an index page to list Posts.&lt;/p&gt;

&lt;p&gt;Humans understand this. I&amp;#39;d wager even your stereotypical I-don&amp;#39;t-understand-computers Farmville player has a basic grasp on the basics of REST, even though they haven&amp;#39;t the foggiest of what a &amp;quot;resource&amp;quot; is. They might not know &lt;em&gt;how&lt;/em&gt; to do something upon first visit, but they know &lt;em&gt;what&lt;/em&gt; resource they want to interact with. Posting a comment on a blog post? Look for the form labeled &amp;quot;New comment&amp;quot;. Signing up for an account? Look for the &amp;quot;New account&amp;quot; button. As long as the resources are basic and intuitive — &amp;quot;create a new TransientSubscriberSubscriptionNode&amp;quot; might be slightly too complex, for example — humans are going to have a good chance at figuring out how to work with your objects.&lt;/p&gt;

&lt;p&gt;This is all pretty straightforward, of course. A comment on a blog is simple enough that it&amp;#39;s hard for anyone to get that wrong. The problem is when you bleed between objects or devise complex on-page ajax interactions. I have nothing but reckless intuition to back this up, but I&amp;#39;d bet that the majority of the most-confusing forms and interactions online stem from a failure to separate resources sufficiently, or a failure to properly define resources for your app (one resource doing the job instead of splitting things up into smaller pieces, for example).&lt;/p&gt;

&lt;p&gt;Admin screens are a magnet for this. The noble idea is to have a few screens to manage as much data as possible, since we really care about efficiency and flexibility and productivity and other words ending in &lt;em&gt;-y&lt;/em&gt;. This is where the minefield of checkboxes and radio buttons and dropdown filters come from when you&amp;#39;re trying to graft one screen onto multiple interactions with resources that are sort of related but not &lt;em&gt;exactly&lt;/em&gt; related. Yes, it can certainly work, but the more you drift from that simplistic, single-resource mindset, the harder it is to intuitively grasp what the hell&amp;#39;s going on here. And sure, you can add help text and documentation and mouseovers and plenty more to explain how all these doohickeys interact with the data, but that just means you have a more complex screen that&amp;#39;s harder to use and harder to get others to use. This doesn&amp;#39;t even take into account the harder technical hurdles you face with complex screens, either.&lt;/p&gt;

&lt;p&gt;It&amp;#39;s not just admin screens, of course. Complex, multi-page signup forms may expand beyond just the User object and into other areas (Profile, Social Networks, Preferences, Billing, and so on). There may be a tendency to have a listing page that offers inline editing, state changes, and child creation for each object on the page. The listing page may, in fact, list a mixture of four separate resources rather than having four discrete lists. By bypassing the simple and straightforward, the user has to sit and think about how they might go ahead and accomplish their goal. I don&amp;#39;t know about you, but users aren&amp;#39;t the brightest tool in the shed, so leaving them to their own devices to think for themselves probably will sink your company and likely will cause California to sink into the ocean.&lt;/p&gt;

&lt;p&gt;I&amp;#39;m not saying any of these are &lt;em&gt;wrong&lt;/em&gt;, of course. REST is meant to be broken, really. It&amp;#39;s not entirely all-encompassing; we&amp;#39;ve all skimped on a &lt;code&gt;show&lt;/code&gt; action when the data is small enough to put on the &lt;code&gt;index&lt;/code&gt; action, or we&amp;#39;ve added a few actions to help separate out complex state changes. But every time you cram more interactions into your controller than those magic seven actions or try to consolidate multiple resources into one page, you&amp;#39;re not just going against the REST implementation grain; you&amp;#39;re going against what might be the most intuitive route for the user.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/v5DDQov4nEA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2010/03/the-human-is-a-restful-client</feedburner:origLink></entry>
 
 <entry>
   <title>Boastful, a new tweetback library for your blog</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/CBvXdtGfJgM/boastful-a-new-tweetback-library-for-your-blog" />
   <updated>2010-02-13T00:00:00-08:00</updated>
   <id>http://zachholman.com/2010/02/boastful-a-new-tweetback-library-for-your-blog</id>
   <content type="html">&lt;p&gt;I &lt;a href="http://twitter.com/holman/status/9004291322"&gt;alluded to this yesterday&lt;/a&gt;, but finally have been able to release &lt;a href="http://github.com/holman/boastful"&gt;Boastful&lt;/a&gt;, a jQuery plugin that grabs &amp;quot;tweetbacks&amp;quot; for your blog. Tweetbacks are like trackbacks- every time someone mentions your blog on Twitter, you can pull in those mentions and print them out on your blog. This has gained in prevalence lately with 3rd party services like Disqus, which grabs all those tweets and integrates them with your normal blog comments. That&amp;#39;s a really crappy solution.&lt;/p&gt;

&lt;p&gt;Every year or so, the blogosphere circles the wagons and self-germinates on the topic of blog comments. Most of the elitist bastards of the internet — myself included — go sans-comments for ease of living without spam and for added focus on your writing. So I&amp;#39;m not terribly interested in pulling in tweets themselves and tossing them on my blog, particularly since I don&amp;#39;t have traditional blog comments in the first place. But I like the idea of at least offering some aspect of dialogue, some aspect of community to the site. The Disqus way of doing things — regurgitating tweets on-page like a comment — never made any sense to me for the simple fact that tweets aren&amp;#39;t comments. It&amp;#39;s not just Disqus, either; almost every implementation I&amp;#39;ve seen works this way. This is why if you see this functionality on a site it&amp;#39;s almost always tweets that take the form of &amp;quot;RT @someone RT @someoneelse RT @originator Hey! A link! http://example.com&amp;quot;. 140 characters (minus your short URL) is not a lot of space to add your personal flavor. But it&amp;#39;s kind of cool to see who&amp;#39;s linking to you, what the general sentiment is, that sort of thing.&lt;/p&gt;

&lt;p&gt;So I tackled this a bit differently. You can see it in my blog footer now (once this post gets mentioned online, that is). It looks like this:&lt;/p&gt;

&lt;div style="text-align: center; padding-top: -1em"&gt;&lt;img src="http://files.droplr.com/files/11322372/oO5q.jquery.boastful.png" alt="boastful screenshot" /&gt;&lt;/div&gt;

&lt;p&gt;Just the avatars, with a tooltip that lets you look at the tweet if you really are interested. Simple, not obtrusive, and hopefully something where the average reader might say &amp;quot;Hey, I can get some exposure just by tweeting this? Nifty!&amp;quot; (Actually, it might be nice to pull in follower numbers or Twitter bios here, too, as a way for existing readers to find more interesting people to follow. But that&amp;#39;ll have to wait for a future version.)&lt;/p&gt;

&lt;p&gt;The other difference with this is that it uses &lt;a href="http://topsy.com"&gt;Topsy&amp;#39;s&lt;/a&gt; API, which handles all the yucky details of old data that Twitter normally wouldn&amp;#39;t return results on, and breaks through URL shorteners to get to the actual page in question (usually a search for zachholman.com/some-page won&amp;#39;t match a shortened url like is.gd/some-string). So no matter how they link to your blog post, it should still be picked up by boastful.&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://github.com/holman/boastful"&gt;code&amp;#39;s on GitHub&lt;/a&gt;, and you can browse the readme there for some additional background on the technical side of things. Hope you dig it, fork it, contribute back, and be merry. Or tweet a link to this page over Twitter. Your mug will look good down there.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/CBvXdtGfJgM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2010/02/boastful-a-new-tweetback-library-for-your-blog</feedburner:origLink></entry>
 
 <entry>
   <title>The Future of iTunes</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/NyNGTvymvDM/the-future-of-itunes" />
   <updated>2010-02-05T00:00:00-08:00</updated>
   <id>http://zachholman.com/2010/02/the-future-of-itunes</id>
   <content type="html">&lt;p&gt;iTunes is old. It was first released in 2001, with the majority of its code then based on SoundJam MP, which can trace its origins way back to 1999. After QuickTime&amp;#39;s recent Snow Leopard rebuild, iTunes is left as one of Apple&amp;#39;s oldest apps. That leaves it on a relatively ancient Carbon foundation, which carries some &lt;a href="http://daringfireball.net/2009/09/itunes_and_cocoa"&gt;implications John Gruber detailed&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If we accept that iTunes will eventually go through The Big Rewrite — and that assumption might warrant some discussion, but let&amp;#39;s go with it for now — what form does iTunes take? Does the existence of iPad fundamentally change iTunes&amp;#39; future? What can Apple&amp;#39;s direction as of late tell us about &amp;quot;iTunes X&amp;quot;?&lt;/p&gt;

&lt;p&gt;There are three main concepts that form iTunes: Your Syncing, Your Library, iTunes Store.&lt;/p&gt;

&lt;h2&gt;Your Syncing&lt;/h2&gt;

&lt;p&gt;This is the eight billion pound gorilla in the app. There&amp;#39;s no huge mysteries behind playing a song. You don&amp;#39;t need to innovate very hard on that. But syncing in iTunes has gone from very humble and very music-only iPod beginnings to full-fledged broad media iPhone syncing to hybrid iPod+iPhone+iPad syncing. In The Big Rewrite of iTunes, this is absolutely the area that will receive the most attention.&lt;/p&gt;

&lt;p&gt;When &lt;a href="http://zachholman.com/2010/01/ipad-ambiguity/"&gt;I first talked about the iPad&lt;/a&gt;, part of the problem I had was the concept of where your data lived. In the current scheme, everything surrounded your main machine. You hooked up your devices — iPod, iPhone, and now iPad — and they become slaves to the content hosted on your machine. And it is &lt;em&gt;machine&lt;/em&gt;. Not &lt;em&gt;machines&lt;/em&gt;. This has been a common gripe for years: how can you keep your music and library metadata in sync between your iMac and your MacBook? It&amp;#39;s a huge pain in the ass, and even if you do that your devices are still basically tethered to one specific machine. It&amp;#39;s not just a &amp;quot;hardcore techie problem&amp;quot;, either; I&amp;#39;ve heard this gripe from a variety of sources, including my dad. With a more digital lifestyle, more people want to use and sync their stuff in more places.&lt;/p&gt;

&lt;p&gt;So where does that put us? The natural direction, of course, is the cloud. It&amp;#39;s the holy grail, really: over-the-air syncing of all of your data. You become effectively free from having to worry about where your data is housed, which device is up to date and which is doing the updating, and hell, you don&amp;#39;t even have to worry about files (which is one of the things Apple seems poised to dismantle, and for good reason: the file system is still a confusing concept to many). This solves a lot of my initial worries about the iPad, too; if you&amp;#39;re not tied to a certain machine, the iPad itself becomes far more capable as a standalone machine.&lt;/p&gt;

&lt;p&gt;This is a technical nightmare. Part of it is sheer bandwidth, part of it is reliability, part of it is it&amp;#39;s just too damn &lt;em&gt;new&lt;/em&gt; of a concept. The bandwidth issue can be solved by, you know, building a &lt;a href="http://gizmodo.com/5339977/apple-building-secret-massive-data-center-probably-to-hold-steves-electronically-cloned-brain"&gt;massive, massive data center&lt;/a&gt;. But the rest is typical cloud computing criticisms, and for good measure. There&amp;#39;s been quite a few &lt;a href="http://www.pcworld.com/article/173470/microsoft_redfaced_after_massive_sidekick_data_loss.html"&gt;high-profile&lt;/a&gt; &lt;a href="http://www.appleinsider.com/articles/09/11/25/palm_pre_users_suffer_cloud_computing_data_loss.html"&gt;mishaps&lt;/a&gt; and &lt;a href="http://gigaom.com/2008/02/15/amazon-s3-service-goes-down/"&gt;unreliability&lt;/a&gt;. Pushing everyone&amp;#39;s media and data to the cloud would be, in a lot of instances, just frightening.&lt;/p&gt;

&lt;p&gt;But still achievable. I&amp;#39;m an avid supporter of MobileMe. Between three Macs and an iPhone, it&amp;#39;s managed all of my data beautifully, to the point where I no longer care or worry about where my contacts or email settings are. But Apple did have its fair share of hiccups when MobileMe launched, and one has to take into account that the underlying technology, .Mac, has been around for nearly a decade, slowly being built upon and improved the whole time. Expanding that same tech would be a substantial feat, to say the least. But the payoffs are fantastic.&lt;/p&gt;

&lt;p&gt;I&amp;#39;d imagine direct, over-the-line syncing would be here for quite some time, and it likely would be the only option for the large initial sync and any large video or music additions, mostly for the sake of speed (even wireless &lt;em&gt;N&lt;/em&gt; is painfully slow compared to USB 2.0 and 3.0). But after that initial sync, one could imagine the incremental downloads and uploads of your library metadata — play counts, skip counts, titles, album art, and so on — could be done entirely over-the-air, likely when you&amp;#39;re not even using your device. Download an album on your MacBook and, like MobileMe contacts, it gets pushed simultaneously to your iMacs at work and home and your iPhone in your pocket.&lt;/p&gt;

&lt;p&gt;One big question mark is how much data gets pushed to Apple&amp;#39;s servers. Can you only send Music Store-purchased songs to the cloud, or can you send your songs pirated from Napster in 1999, too? How much will the EFF piss themselves when they realize how much information Apple would have on you? Does the central server even make sense in this scenario, or will you instead deem one of your own machines as the &amp;quot;host&amp;quot; and push all the updates out directly over your own private pipes? A lot of questions, a lot of problems, but still one tantalizing prospect.&lt;/p&gt;

&lt;h2&gt;Your Library&lt;/h2&gt;

&lt;p&gt;This is, and always will be, the bedrock of iTunes. It&amp;#39;s a way to access your media: music, video, podcasts, and soon-to-be likely e-books. It may seem fairly straightforward at first; list your media, play your media. But I wouldn&amp;#39;t be surprised if it&amp;#39;s some of the gnarliest code Apple&amp;#39;s got. The problem is that, over a decade of use, feature additions, and rewrites, there&amp;#39;s a &lt;em&gt;lot of stuff&lt;/em&gt; in there. Between playlist subtleties, library sorting, album art display, multiple views (including Cover Flow, List, and Grid), iTunes Store hooks, library metadata, audio file conversion, iTunes DJ, iTunes Genius, ringtones, album art downloading, ratings, and a slew of underlying code tying it all together... it&amp;#39;s a feat it works as well as it does in its current form. And the major problem with changing any of this is that iTunes is arguably the most entrenched software out there. Regardless of technical skill level, iTunes is the place most users call &amp;quot;home&amp;quot;. It&amp;#39;s their media. And everyone has very specific, custom ways of accessing their media. Removing, say, Skip Counts may utterly ruin some subset of users that tend to shuffle their library based on songs they&amp;#39;ve never skipped, for example.&lt;/p&gt;

&lt;p&gt;But in The Big Rewrite, this is an area I suspect would get reworked. There&amp;#39;s just so much stuff to handle, and the feature bloat of iTunes has grown substantially. I can&amp;#39;t think of one feature release where Apple has ever removed &lt;em&gt;anything&lt;/em&gt; from iTunes. That&amp;#39;s pretty significant, given Apple is the type of company willing to completely throw away iMovie and replace it with a new version entirely. If they were to start stripping out smaller, lesser-used features for the sake of streamlining and simplicity, this will be the area that will get the most amount of griping and criticism. I suspect they&amp;#39;ll keep the majority of the UI and look and feel around as they swap out the underlying engine, but those inconsistencies will creep through the cracks.&lt;/p&gt;

&lt;h2&gt;iTunes Store&lt;/h2&gt;

&lt;p&gt;The Store, interestingly enough, has gone through The Big Rewrite. And no one&amp;#39;s really noticed. While the Store had previously used some type of web-oriented technologies, as of iTunes 9 it&amp;#39;s basically &lt;a href="http://www.satine.org/archives/2009/09/09/does-itunes-9-use-webkit/"&gt;bleeding-edge HTML in a thin WebKit wrapper&lt;/a&gt;. This is a big deal. It means for one, they can leverage their existing investment in WebKit for cross-platform compatibility, and two, they can draw from the comparably bigger well of web designers and developers for a more flexible storefront. As a byproduct, this has let them shift more of their content onto the &amp;quot;proper&amp;quot; web; you can browse &lt;a href="http://itunes.apple.com/us/album/live-session-itunes-exclusive/id335812754"&gt;most of the music store&lt;/a&gt; without iTunes already, and just this week they&amp;#39;ve flipped on the ability to &lt;a href="http://itunes.apple.com/us/app/tweetie-2/id333903271?mt=8"&gt;view apps from AppStore&lt;/a&gt; on the web.&lt;/p&gt;

&lt;p&gt;In terms of the next version of iTunes, the Store is effectively independent of any new development work. It&amp;#39;s not nearly as big of a factor as it once was.&lt;/p&gt;

&lt;h2&gt;For reals?&lt;/h2&gt;

&lt;p&gt;This just &lt;em&gt;feels&lt;/em&gt; like the way to do it. But I wouldn&amp;#39;t even wager on a timeline. Apple&amp;#39;s been very cautious with iTunes for quite some time, and if they push something this substantial to market and they experience widespread failures, it&amp;#39;ll take some time to turn it around. But given iTunes&amp;#39; lag behind other 64bit apps in Snow Leopard, Apple&amp;#39;s move to Cocoa, the sheer &amp;quot;oldness&amp;quot; of the codebase, and the much larger focus as of late on satellite devices with iPhone and iPad leading the way, it seems like now&amp;#39;s the best time to really make a dent in how iTunes is positioned and built.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/NyNGTvymvDM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2010/02/the-future-of-itunes</feedburner:origLink></entry>
 
 <entry>
   <title>Impress the Ladies with Legacy Migrations</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/kGz7WhTuxfY/impress-the-ladies-with-legacy-migrations" />
   <updated>2010-01-30T00:00:00-08:00</updated>
   <id>http://zachholman.com/2010/01/impress-the-ladies-with-legacy-migrations</id>
   <content type="html">&lt;p&gt;If there&amp;#39;s one thing I&amp;#39;ve learned from my experiences with women, it&amp;#39;s that they secretly can&amp;#39;t control themselves if a man is there to sweep them off their feet with tales of legacy data migration suavity. (If you&amp;#39;re wondering why I didn&amp;#39;t title this in the reverse, it&amp;#39;s simply because I didn&amp;#39;t feel that it was any particular secret that every man is most attracted to legacy data conversions.)&lt;/p&gt;

&lt;p&gt;So, you&amp;#39;re a few weeks away from launch day and you have a fair amount of data in an older database structure and you want it accessible to your new app. The possibilities here are really quite endless, and it depends entirely on a multitude of questions: do you need access to the old data in the old app? Is speed an issue? Can you fill records after the fact, or do you need them all immediately in the new format pre-launch? Is this a one-off or a regular thing? Will anyone notice if you instead just add a couple hundred thousand rows of quotes from &lt;em&gt;Dr. Quinn, Medicine Woman&lt;/em&gt; instead of bothering with a possibly delicate transfer? These are all equally important questions. I recently did one such transfer, and here&amp;#39;s my process.&lt;/p&gt;

&lt;p&gt;I actually chose a few different routes. A lot of the data was going to be in a similar structure in the new system and the quicker the better, please. For those cases, you&amp;#39;re best off to do everything via database dumps and raw SQL commands. By far, that&amp;#39;s going to be the fastest way of doing things. Dropping out into Ruby land is going to be painfully slow. But in some cases, that&amp;#39;s a tradeoff worth making. In this post, I&amp;#39;m going to detail the latter process. The benefit of pushing data through Rails is that you have access to model-specific validations, callbacks, and relationships. If you&amp;#39;re dealing with complex data structures spread over multiple models and relationships (both in the old and new apps), sometimes the longer processing time is a decent tradeoff, particularly if you can kick off the process and slowly migrate post-deploy.&lt;/p&gt;

&lt;p&gt;The first thing to do is make the data accessible to your new app. I&amp;#39;ve found it&amp;#39;s easiest to create a temporary table that you can nuke when you&amp;#39;re done. If we&amp;#39;re migrating Users between totally different codebases, I&amp;#39;d use &lt;code&gt;mysqldump&lt;/code&gt; to dump your old &lt;code&gt;users&lt;/code&gt; table and import it with a prefix: &lt;code&gt;old_and_busted_users&lt;/code&gt;, for example.&lt;/p&gt;

&lt;p&gt;To actually use this data I&amp;#39;ve seen a few different approaches. The full-blown route is to &lt;code&gt;script/generate model OldAndBustedUser&lt;/code&gt;, which gives you access to an ActiveRecord instance of the &lt;code&gt;old_and_busted_users&lt;/code&gt; table. That&amp;#39;s fine, and it offers you some additional freedom in terms of testing and relationships, but I&amp;#39;ve found that in a number of cases you don&amp;#39;t really need to scaffold yourself out a full-fledged model. For the most part, you just need access to the table and to some relationships. Besides which, generating an entirely new model for your app means you&amp;#39;re more likely to keep this old code polluting your new code, which really kind of sucks if you&amp;#39;re only going to be doing this once.&lt;/p&gt;

&lt;p&gt;The trick I&amp;#39;ve used is to define all of your models inline. For example, if you&amp;#39;re running this as a rake task:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;  &lt;span class="n"&gt;namespace&lt;/span&gt; &lt;span class="ss"&gt;:import&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Import our old and busted users into the new hotness.&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ss"&gt;:users&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:environment&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OldAndBustedUser&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="ss"&gt;ActiveRecord&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;:Base&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;
      &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OldAndBustedProfile&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="ss"&gt;ActiveRecord&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;:Base&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;It&amp;#39;s a little funky defining classes like that, but for most scenarios you just don&amp;#39;t need much scaffolding. If your task balloons to hundreds of complex, intricate lines, definitely think about refactoring quite a bit more. The model names should coincide to your temporary tables. If they don&amp;#39;t, you can do so with &lt;code&gt;set_table_name&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Once you have your temporary models set up, you can use them as you&amp;#39;d expect:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;  &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ss"&gt;:users&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:environment&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OldAndBustedUser&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="ss"&gt;ActiveRecord&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;:Base&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OldAndBustedProfile&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="ss"&gt;ActiveRecord&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;:Base&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;
    
    &lt;span class="no"&gt;OldAndBustedUser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_each&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:batch_size&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;old_and_busted_user&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;old_and_busted_user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:email&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;old_and_busted_user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;...the &lt;code&gt;find_each&lt;/code&gt; being important since we&amp;#39;re in Ruby Land, where instantiating huge object arrays willy-nilly will deplete your available memory faster than the alcohol you experienced on your 21st birthday. You also can set up relationships as needed, too:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;  &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ss"&gt;:users&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:environment&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OldAndBustedUser&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="ss"&gt;ActiveRecord&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;:Base&lt;/span&gt;
      &lt;span class="n"&gt;has_one&lt;/span&gt; &lt;span class="ss"&gt;:profile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:class_name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;OldAndBustedProfile&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:foreign_key&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;profile_id&amp;#39;&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OldAndBustedProfile&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="ss"&gt;ActiveRecord&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;:Base&lt;/span&gt;
      &lt;span class="n"&gt;belongs_to&lt;/span&gt; &lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:class_name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;OldAndBustedUser&amp;#39;&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="no"&gt;OldAndBustedUser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_each&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:batch_size&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;old_and_busted_user&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;old_and_busted_user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="ss"&gt;:email&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;old_and_busted_user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="ss"&gt;:twitter_handle&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;old_and_busted_user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;twitter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Now for the Pro Tips: if you&amp;#39;re doing a lot of data importing, you&amp;#39;re bound to have to wipe your database and repopulate a gaggle of times. I found a lot of the manual steps in dumping data to be a pain, particularly in terms of importing into the temporary table. So I&amp;#39;d suggest making use of &lt;code&gt;sed&lt;/code&gt; for some fun file replacement (which sure beats having to pick through &lt;code&gt;vi multi-hundred-megabyte-db-dump&lt;/code&gt; every time). Assuming you&amp;#39;re using regular &lt;code&gt;mysqldump&lt;/code&gt; output:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;  sed -i &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt; -e &lt;span class="s1"&gt;&amp;#39;s/`users`/`old_and_busted_users`/g&amp;#39;&lt;/span&gt; multi-hundred-megabyte-db-dump.sql
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Your mileage may vary on that particular &lt;code&gt;sed&lt;/code&gt; command, though. OS X uses BSD &lt;code&gt;sed&lt;/code&gt;, Linux uses GNU &lt;code&gt;sed&lt;/code&gt;. I&amp;#39;ve found the difference to be the spacing after the -i and before the single quotes (denoting an in-place substitution, which is usually safe enough considering you can always re-dump from MySQL if the file gets corrupted).&lt;/p&gt;

&lt;p&gt;Since we&amp;#39;re dealing with Rails, we get all the fun magic methods, but they&amp;#39;re not all fun and games: they&amp;#39;ll overwrite your &lt;code&gt;created_at&lt;/code&gt; and &lt;code&gt;updated_at&lt;/code&gt; fields. Have no fear; &lt;code&gt;record_timestamps&lt;/code&gt; is here:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;  &lt;span class="ss"&gt;ActiveRecord&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;:Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;record_timestamps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;
  &lt;span class="n"&gt;method_that_does_crazy_zany_stuff&lt;/span&gt;
  &lt;span class="ss"&gt;ActiveRecord&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;:Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;record_timestamps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You&amp;#39;ll also want to think about turning validations on or off (with a &lt;code&gt;user.save&lt;/code&gt; or &lt;code&gt;user.save(false)&lt;/code&gt;)- validations are good for ensuring the validity of your data, but it&amp;#39;s another point of slowness, and if you&amp;#39;re importing legacy data there&amp;#39;s a good chance your data might break validations anyway.&lt;/p&gt;

&lt;p&gt;If all else fails, IMDB maintains a startlingly &lt;a href="http://www.imdb.com/title/tt0103405/quotes"&gt;large repository&lt;/a&gt; of &lt;em&gt;Dr. Quinn&lt;/em&gt; quotes.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/kGz7WhTuxfY" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2010/01/impress-the-ladies-with-legacy-migrations</feedburner:origLink></entry>
 
 <entry>
   <title>iPad Ambiguity</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/cQHLoVXovqY/ipad-ambiguity" />
   <updated>2010-01-27T00:00:00-08:00</updated>
   <id>http://zachholman.com/2010/01/ipad-ambiguity</id>
   <content type="html">&lt;p&gt;So The Tablet is now iPad. That was a fun little announcement.&lt;/p&gt;

&lt;p&gt;There&amp;#39;s been plenty of discussion and arguing about the name, the form factor, and its apparent iPhone-inspired lockdown. That&amp;#39;s to be expected, in my mind. Apple takes away the number one complaint — price — and people&amp;#39;ll find something else to talk about.&lt;/p&gt;

&lt;p&gt;What I&amp;#39;ve been brewing on today is somewhat different. I&amp;#39;m having a hard time classifying this device. Jobs positioned it as something between an iPhone and a Mac, which is true, but what it really is is a bigger iPhone. I don&amp;#39;t mean that in the typical ranting way found on the Engadget comment section (&amp;quot;It&amp;#39;s just a bigger iPhone wtf&amp;quot;); I mean it in terms of content.&lt;/p&gt;

&lt;p&gt;The way the iPhone works is that it&amp;#39;s an &lt;em&gt;extension&lt;/em&gt; of your data. The vast, vast majority of consumers sync from a laptop or desktop to their phones. Very few get by with buying only iTunes-supplied music and video and retain all of their contacts and email settings exclusively on their iPhone. Given the way the iPad is set up, it also is an extension of your data.&lt;/p&gt;

&lt;p&gt;This is weird.&lt;/p&gt;

&lt;p&gt;By setting it up this way, Apple&amp;#39;s effectively saying that you have to have another computer for the iPad. This is fine, since we&amp;#39;ve progressed to the point as a society that most people have, you know, a computer. But what type of computer? Apple as a product company has traditionally been much stronger in the laptop market. I have a harder time seeing someone with a laptop picking this up; that makes you mobile twice over. If the iPad is so good as a mobile device, why do you still have a MacBook? If the MacBook offers so much more power and is mobile, why have an iPad?&lt;/p&gt;

&lt;p&gt;This points towards people in my situation: those with desktops at home who traditionally might pick up a MacBook to split the difference. This makes total sense to me; my iMac can be my hub, and my iPad is an extension of that Mac. Logical.&lt;/p&gt;

&lt;p&gt;But where does this place Apple? Instead of a MacBook I&amp;#39;ll be picking up a product at half the price. I may be wrong, but most of those with laptops won&amp;#39;t splurge on two similar mobile devices. And the way the iPad is set up, not many will go exclusively iPad.&lt;/p&gt;

&lt;p&gt;Does this mean Apple&amp;#39;s direction for the future is an iMac + iPad combo? That certainly takes some time to shift buying habits in that fashion, and I&amp;#39;m not sure desktops are what people really are looking for anymore. It&amp;#39;s trending smaller than the laptop market. Does it mean that Apple will be forced to open up the iPad for use as an exclusive, syncless machine? By doing that I could install what I want on it — developer tools, for example — and use it in lieu of a laptop. But again, if they go that route they enable their customers to bypass pricier machines for the cheaper tablet.&lt;/p&gt;

&lt;p&gt;That&amp;#39;s the weird part. It potentially puts them either in the tiny-marketshare business or the less-profitable business. The aggressive pricing is nice, of course, but I&amp;#39;m trying to figure out who they&amp;#39;re trying to aggressively attract, given these options.&lt;/p&gt;

&lt;p&gt;I think it&amp;#39;s a great product that will appeal to many, but that few people — in its current iteration — will be able to look at their existing computing setup and say, &amp;quot;Yeah, this makes sense for me to pick up.&amp;quot;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/cQHLoVXovqY" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2010/01/ipad-ambiguity</feedburner:origLink></entry>
 
 <entry>
   <title>Immeasurably Improve Your Life by 34 Percent</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/PtKOGrGaFAU/immeasurably-improve-your-life-by-34-percent" />
   <updated>2010-01-24T00:00:00-08:00</updated>
   <id>http://zachholman.com/2010/01/immeasurably-improve-your-life-by-34-percent</id>
   <content type="html">&lt;p&gt;So there were a few things that came out of 2009 that improved my computing lifestyle so dramatically that I question your morals if you aren&amp;#39;t using them, too.&lt;/p&gt;

&lt;h2&gt;Homebrew&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://twitter.com/mxcl"&gt;Max Howell&lt;/a&gt; first started work in May 2009 on &lt;a href="http://github.com/mxcl/homebrew"&gt;homebrew&lt;/a&gt;, a friendly beer-themed package management system for OS X. The accepted practice before Homebrew caught steam was to install Fink or MacPorts, both of which I always had frustrating experiences with. There&amp;#39;d be some random dependency for a Ruby library I wanted to leverage, for example, and you&amp;#39;d have to pull it down from MacPorts. Between slow servers, slow compilation, and installs that just flat-out didn&amp;#39;t work for months at a time, that solution was a source of disgust.&lt;/p&gt;

&lt;p&gt;Homebrew does things differently. It&amp;#39;s opinionated in that it optimizes for 64bit fast Snow Leopard compilation that leverages your Mac&amp;#39;s existing installs of Ruby, Python, and other underlying languages and libraries. Most installs are now as easy as &lt;code&gt;brew install postgres&lt;/code&gt; or &lt;code&gt;brew install imagemagick&lt;/code&gt;. You can pull down any new installation or configuration changes with a simple &lt;code&gt;brew update&lt;/code&gt;. As an added bonus, you can &lt;a href="http://wiki.github.com/mxcl/homebrew/cpan-ruby-gems-and-python-disttools"&gt;modify your Ruby gems to install&lt;/a&gt; to /usr/local, too, which lets you un-sudo your gem installs and just keeps all your third-party library and code in one neat, tidy location. What&amp;#39;s even better is that since it&amp;#39;s on GitHub, it&amp;#39;s laughably easy to fork the project, add your own Formulas (instructions on how to install your given software), and contribute back to the main branch. This means that the Formulas in Homebrew top out in the hundreds, and any broken Formulas get fixed really, really quickly. Loves it. I just wish I could &lt;a href="http://twitter.com/defunkt/status/8127462365"&gt;install everything&lt;/a&gt; with Homebrew.&lt;/p&gt;

&lt;h2&gt;Versioning your .dotfiles&lt;/h2&gt;

&lt;p&gt;2009 was home to the meteoric rise of &lt;a href="http://github.com"&gt;GitHub&lt;/a&gt;, and I think it&amp;#39;s the first clear example of developers as a community starting to version control their .dotfiles- their shell scripts, shell aliases, helper scripts, formatting, irb configurations, the whole shebang.&lt;/p&gt;

&lt;p&gt;That&amp;#39;s all well and good; you get what&amp;#39;s traditionally a somewhat private, personal process and get it out in the open, letting everyone else dip into years (sometimes decades!) of carefully tuning and pruning to construct what they think is the perfect shell setup. But what&amp;#39;s even cooler is that small networks began to emerge. &lt;a href="http://twitter.com/rbates"&gt;Ryan Bates&lt;/a&gt; of &lt;a href="http://www.railscasts.com"&gt;Railscasts&lt;/a&gt; fame &lt;a href="http://github.com/ryanb/dotfiles"&gt;published his .dotfiles&lt;/a&gt; on GitHub and since then he&amp;#39;s gotten 300-some forks of his code. (His was the main repo I forked from for &lt;a href="http://github.com/holman/dotfiles"&gt;my own .dotfiles&lt;/a&gt;). The best part isn&amp;#39;t his particular dotfiles, though; it&amp;#39;s that he&amp;#39;s effectively created a &lt;em&gt;framework&lt;/em&gt; that everyone else can leverage. My fork is wildly different after a year&amp;#39;s worth of heavy usage, but the majority of the commits from the 300 other forks will still apply cleanly to my fork. That means I can browse GitHub&amp;#39;s network view, see if there&amp;#39;s anything interesting out there that someone else has added to their dotfiles, cherry pick it, and pull locally. A few seconds doing the process and boom, I suddenly have a &lt;a href="http://github.com/holman/dotfiles/commit/6eace56de9a84a693f4c2deadfe3c9d2a33a37c7"&gt;smart archive extractor&lt;/a&gt;. Or &lt;a href="http://github.com/holman/dotfiles/commit/88d8717946ab740b29448f8aaff315ca10f9996f"&gt;autocompletion for Homebrew&lt;/a&gt;. Or &lt;a href="http://github.com/holman/dotfiles/commit/6141fc7eaabc92aad03adc17785c27bcf1a3bc2d"&gt;autocompletion from my .ssh/config&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That I can pull great time-savers from so many different people so trivially is awesome and a half. You develop good habits, too; Ryan&amp;#39;s dotfiles and associated forks pushed me from ditching bash in favor of zsh. (And along those lines, if you&amp;#39;re looking for a good &amp;quot;community&amp;quot; of zsh .dotfiles, check out &lt;a href="http://github.com/robbyrussell/oh-my-zsh"&gt;oh-my-zsh&lt;/a&gt;, which also has a huge following.)&lt;/p&gt;

&lt;h2&gt;Byline&lt;/h2&gt;

&lt;p&gt;I&amp;#39;m starting to feel like the weird kid on the playground that plays tetherball by themselves. How is it so many of you have ditched or simply don&amp;#39;t use RSS? I love Twitter to pieces, and I follow some insanely smart people that drop great information in their streams, but really, that&amp;#39;s only half the glory. RSS, in all its fulltext, dense information glory is the absolute primary source of knowledge for me. I&amp;#39;m always — &lt;strong&gt;always&lt;/strong&gt; — reading my 228 subscribed-to feeds as I bus to work. It&amp;#39;s a deeper communication that I&amp;#39;m a little worried people are starting to shun from in this gimme-gimme-gimme crazy world. Also, get off my porch.&lt;/p&gt;

&lt;p&gt;Anyway, for those that do leverage RSS heavily, you probably already know about the great &lt;a href="http://www.newsgator.com/INDIVIDUALS/NETNEWSWIRE/"&gt;NetNewsWire&lt;/a&gt; on the Mac, which has been the best RSS reader on any platform for roughly 43 years now. My new love in 2009 was &lt;a href="http://www.phantomfish.com/byline.html"&gt;Byline&lt;/a&gt;, a nicely-designed iPhone app that, now that NNW syncs with Google Reader instead of their closed backend, will sync up with your Macs, too. And I&amp;#39;ve looked at a lot of iPhone readers. Even NNW for iPhone leaves me greatly wanting. Its design is so straightforward that it&amp;#39;s not really worth diving into here; it just works exactly how I intuitively thought a reader should work. Nifty.&lt;/p&gt;

&lt;h2&gt;Plancast&lt;/h2&gt;

&lt;p&gt;My infatuation with &lt;a href="http://plancast.com"&gt;Plancast&lt;/a&gt; has been a rather recent development, but I dig it nonetheless. Ostensibly, it&amp;#39;s a site to manage what you&amp;#39;re going to be doing: plans, conferences, meetups, and so on. Really, I just enjoy their execution. Adding an event is really easy- they have natural language parsing so you can say &amp;quot;next Thursday at four&amp;quot; and it&amp;#39;ll do a good job of parsing and displaying that. It&amp;#39;s a fun way to see what&amp;#39;s going on in your city, particularly if you happen to live in the Valley where there&amp;#39;s a bunch of tech-themed events planned every day. Add yourself as &amp;quot;attending&amp;quot; to any event, subscribe to it in iCal and it&amp;#39;ll show up on your calendar.&lt;/p&gt;

&lt;p&gt;Plus, you can look at &lt;a href="http://plancast.com/Scobleizer"&gt;Scoble&lt;/a&gt;, see how many subscriptions he has and events he&amp;#39;s attending, and marvel at how crazy that dude is.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/PtKOGrGaFAU" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2010/01/immeasurably-improve-your-life-by-34-percent</feedburner:origLink></entry>
 
 <entry>
   <title>Simplifying Rails Controllers with named_scopes</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/lc27jXsv7vM/simplifying-rails-controllers-with-named_scopes" />
   <updated>2010-01-20T00:00:00-08:00</updated>
   <id>http://zachholman.com/2010/01/simplifying-rails-controllers-with-named_scopes</id>
   <content type="html">&lt;p&gt;So &lt;a href="http://api.rubyonrails.org/classes/ActiveRecord/NamedScope/ClassMethods.html"&gt;&lt;code&gt;named_scope&lt;/code&gt;&lt;/a&gt; is great. It&amp;#39;s a quick and clear way to share common SQL fragments within your app by defining them in your models. It saves you a lot of repetition: instead of calling &lt;code&gt;Article.find(:all, :order =&amp;gt; &amp;#39;views desc&amp;#39;)&lt;/code&gt; all over your app, you can define &lt;code&gt;named_scope :popular, :order =&amp;gt; &amp;#39;views desc&amp;#39;&lt;/code&gt; in Article, and then call it with &lt;code&gt;Article.popular&lt;/code&gt;. There&amp;#39;s a lot of good stuff in it; I encourage you to check the &lt;a href="http://ryandaigle.com/articles/2008/3/24/what-s-new-in-edge-rails-has-finder-functionality"&gt;initial edge Rails post from Ryan Daigle&lt;/a&gt; for more examples.&lt;/p&gt;

&lt;p&gt;One strong benefit of &lt;code&gt;named_scope&lt;/code&gt; (or, &lt;code&gt;scope&lt;/code&gt;, as it&amp;#39;s been &lt;a href="http://github.com/rails/rails/commit/d60bb0a9e4be2ac0a9de9a69041a4ddc2e0cc914"&gt;renamed in Rails 3&lt;/a&gt;) that wasn&amp;#39;t immediately apparent to me was how much logic you can strip from your controllers this way. Not just logic about which scoped SQL fragment to leverage, but a lot of the logic surrounding how you initially might set up your action before it even gets to your Model queries. This originally stemmed from a discussion with &lt;a href="http://twitter.com/zaius"&gt;David Kelso&lt;/a&gt; over Twitter, where he tweeted about simplifying some common controller code that&amp;#39;s familiar to all of us- something similar to this generalized example:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;  &lt;span class="n"&gt;conditions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:city&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="n"&gt;present?&lt;/span&gt;
    &lt;span class="n"&gt;conditions&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;city_name = ?&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;conditions&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:city&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:state&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="n"&gt;present?&lt;/span&gt;
    &lt;span class="n"&gt;conditions&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; AND &amp;#39;&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="n"&gt;conditions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;blank?&lt;/span&gt;
    &lt;span class="n"&gt;conditions&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;state_name &amp;gt; ?&amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;conditions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:state&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="vi"&gt;@users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:all&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:conditions&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;conditions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In other words, you make a variable to hold your conditions (and maybe other variables for any group_bys or joins) and then conditionally build them up- but only if the user submitted values for those particular fields. There&amp;#39;s certainly some refactoring we can do already (or avoid everything by using the ever-excellent &lt;a href="http://github.com/binarylogic/searchlogic"&gt;Searchlogic&lt;/a&gt; or a more capable Sphinx or Solr backend), but it&amp;#39;s not just a search-specific problem, of course.&lt;/p&gt;

&lt;p&gt;Our solution has evolved over time to use a &lt;code&gt;named_scope&lt;/code&gt; to handle the conditionals in the model... something which didn&amp;#39;t seem entirely obvious to me in these cases at first. It reduces the controller logic dramatically:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;  &lt;span class="vi"&gt;@users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;with_city&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:city&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;with_state&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:state&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;...with &lt;code&gt;named_scopes&lt;/code&gt; defined as:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;  &lt;span class="n"&gt;named_scope&lt;/span&gt; &lt;span class="ss"&gt;:with_city&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;present?&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:conditions&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:city_name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}}&lt;/span&gt;
  &lt;span class="n"&gt;named_scope&lt;/span&gt; &lt;span class="ss"&gt;:with_state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;present?&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:conditions&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:state_name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This results in a far more readable controller, and, more importantly, you can reuse this all over the place now. The conditionals have been tucked away in lambdas in the model. If the passed-in argument isn&amp;#39;t blank, the argument is forwarded as a condition; otherwise a blank hash is forwarded on. (Note: if you&amp;#39;re using lambdas in &lt;code&gt;named_scopes&lt;/code&gt;, you must ensure you&amp;#39;re returning a hash, otherwise you&amp;#39;ll explode a bit on some funky curly brace errors).&lt;/p&gt;

&lt;p&gt;In other words, &lt;code&gt;User.with_city(nil)&lt;/code&gt; or &lt;code&gt;User.with_city(&amp;#39;&amp;#39;)&lt;/code&gt; will generate &lt;code&gt;User.find(:all, :conditions =&amp;gt; {})&lt;/code&gt;, returning all records. It might seem a little counter-intuitive at first, but we tend to look at it as asking, &amp;quot;Hey, give me all of the users with this particular city that I&amp;#39;m not going to tell you about&amp;quot;, in which case it makes a bit more sense when it replies &amp;quot;Well, if you&amp;#39;re not going to be specific, here&amp;#39;s all of them&amp;quot;. The other hidden benefit is that this is all much easier to test; the less controller tests the better, in my humble and lazy opinion.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/lc27jXsv7vM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2010/01/simplifying-rails-controllers-with-named_scopes</feedburner:origLink></entry>
 
 <entry>
   <title>WiiFailure™</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/_T5nMaLu4UE/wii-failure" />
   <updated>2010-01-18T00:00:00-08:00</updated>
   <id>http://zachholman.com/2010/01/wii-failure</id>
   <content type="html">&lt;p&gt;The Wii is a terribly interesting device. Unimpressive hardware, non-breakthrough game design, overtly simplistic. Yet the Wii has &lt;a href="http://en.wikipedia.org/wiki/Console_wars#Worldwide_sales_figures_5"&gt;sold roughly the same as the 360 and PS3 combined&lt;/a&gt;. From the onset, Nintendo nailed the prediction that they would be seriously outgunned in an arms race. Pushing more bits faster would doom them, so they more or less invented — or at least revolutionized — casual gaming. That clears them from becoming fodder for Microsoft and Sony&amp;#39;s battle and gives them a huge space to stretch out in their new sphere. It also opens them up to new competition from new faces.&lt;/p&gt;

&lt;h2&gt;Change You Could Believe In&lt;/h2&gt;

&lt;p&gt;I picked up my Wii near launch date (after a few months of battling starved supply). It was a lot of fun; Zelda was one of the finest games on any platform, Resident Evil 4 — a port — still was fun using motion technology, and casual gaming like WarioWare, MarioKart, and WiiSports rounded out the lineup. What I quickly discovered, however, was that my serious gaming shifted to my newly-purchased 360, and my casual gaming dried up. There&amp;#39;s only so many frames you can virtually bowl before you decide that maybe real bowling could be fun, too. In effect, there wasn&amp;#39;t enough movement in the casual gaming sphere, at least for me and my immediate and extended families, to pour as many hours into the Wii as we did in the initial few years post-launch. I have not touched my Wii in a year.&lt;/p&gt;

&lt;p&gt;This wasn&amp;#39;t always the feeling. When it first launched and I booted up the start screen, you saw all those smooth, white blank application icon squares on the home screen. As a developer, I immediately thought of two things: that, tied with an open API, developers could supply a consistently-fresh experience straight to your TV; and that the Apple-reminescent UI eagerly awaited some kind of Apple-Nintendo integration.&lt;/p&gt;

&lt;p&gt;They haven&amp;#39;t happened.&lt;/p&gt;

&lt;h2&gt;WiiAppStore&lt;/h2&gt;

&lt;p&gt;With Nintendo taking a fresh new approach to gaming, I had hoped that part of that approach would be to open up the Wii home screen to developers, to let them user your TV in a way we&amp;#39;ve never had before. Streaming video, mounting and viewing content from your home computer, mini games, mini apps, internet apps, maybe even full-blown TV over time. In hindsight, one could imagine the Wii having its own AppStore. They already have a concept of downloading classic games, with a billing infrastructure already in place. But as far as I can tell, the system remains closed, enslaving the consumer mainly to physical disks and Nintendo-ordained solutions.&lt;/p&gt;

&lt;h2&gt;WiiTV&lt;/h2&gt;

&lt;p&gt;Along those lines, I was hoping for more integration with existing systems, like iTunes or Windows Media Center streaming. In effect, this changes your strictly-casual gaming experience into a true convergence box, one the likes of which Bill Gates was clamoring for fifteen years ago. Stream your music, movies, documents, whatever you&amp;#39;d like, straight to your TV. On top of that, you have a familiar device to control it all: the Wii Remote. Similarly, its intuitive motion control puts Nintendo in a position that other gaming companies would be harder-pressed to emulate (try having your grandma play a movie with a PS3 controller compared to Nintendo&amp;#39;s offering, for example). You end up with a small, simple system that can play your digital content on your TV in addition to allowing people of all ages to play fun, social, casual games with an intuitive controller.&lt;/p&gt;

&lt;p&gt;This all seems very familiar to me.&lt;/p&gt;

&lt;h2&gt;Apple&lt;/h2&gt;

&lt;p&gt;The Apple TV is a flop. (I measure &amp;quot;flop&amp;quot; strictly in terms of fanboy-strokes-per-second, which, judging from the Apple rumor boards and blogs, is comparatively at an all-time low.) The recent &lt;a href="http://www.apple.com/appletv/"&gt;Apple TV 3.0&lt;/a&gt; update is cool and all, but doesn&amp;#39;t solve any real core problems with the device. It solves the streaming content problem, but there just isn&amp;#39;t anything &lt;em&gt;more&lt;/em&gt;. It lacks in two specific areas: television, and casual gaming.&lt;/p&gt;

&lt;p&gt;Casual gaming is within reach. Without any insider knowledge, it wouldn&amp;#39;t be outlandish for an objective outsider to surmise that, between the AppStore&amp;#39;s past success, vague Tablet/AppStore tie-in rumors in the future, and today&amp;#39;s Apple TV, Apple&amp;#39;s got some notion of how they might pull everything together for your fat home media setup, too. If they do have some sort of Apple TV AppStore in the works, it&amp;#39;s going to place an awful amount of stress directly on Nintendo&amp;#39;s shoulders. Once that happens, you end up with a small, simple system that can play your digital content on your TV in addition to allowing people of all ages to play fun, social, casual games with an intuitive controller (in this case, the iPhone itself). Having a DVR baked-in would be a &amp;quot;nice to have&amp;quot;, but at this point we already have a compelling system that at least offers very real competition to Nintendo&amp;#39;s core market.&lt;/p&gt;

&lt;p&gt;This has already happened once before. Case in point: the iPhone has already done this to the Nintendo DS. Whereas a few short years ago I was seriously considering buying a DS for its innovative, not-totally-serious gameplay (&lt;a href="http://en.wikipedia.org/wiki/Scribblenauts"&gt;Scribblenauts&lt;/a&gt; is still one of the most intriguing games I&amp;#39;ve ever seen), today I would almost find that notion offensive if only for the idea that I&amp;#39;d have to carry around another physical device. I&amp;#39;ve already consolidated my camera, my iPod, and my laptop into my iPhone; why would I ever want to reverse that trend? I don&amp;#39;t think it&amp;#39;s shocking to suggest that the days of the dedicated gaming device are numbered. Market reality backs this up, too: Nintendo&amp;#39;s recently been &lt;a href="http://www.sfgate.com/cgi-bin/blogs/techchron/detail?&amp;amp;entry_id=50566"&gt;facing 50% drops in net profit&lt;/a&gt; due to lagging Wii and DS sales.&lt;/p&gt;

&lt;h2&gt;Casual Mobile Immersive Graphical Hotness&lt;/h2&gt;

&lt;p&gt;In many ways, this shows the volatility of the fickle gaming market. From Atari&amp;#39;s start to Nintendo&amp;#39;s dominance, from Sony&amp;#39;s reign to Microsoft&amp;#39;s successful entry, from Nintendo&amp;#39;s huge comeback to the next newcomer, perhaps. A lot has happened in the last few decades. The funny part of it is that we all know what&amp;#39;s going to happen: things are going to get more integrated, more mobile, more cutting edge, more casual. But everyone&amp;#39;s coming at it differently: Apple and Nintendo are going casual-mobile, Sony&amp;#39;s throwing high tech at the problem, and Microsoft&amp;#39;s gunning for some kooky &lt;a href="http://www.xbox.com/en-US/live/projectnatal/"&gt;full-body immersion&lt;/a&gt;. You could probably make an argument that everyone is headed in the right direction, but who&amp;#39;s going to get there first is another question entirely.c&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/_T5nMaLu4UE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2010/01/wii-failure</feedburner:origLink></entry>
 
 <entry>
   <title>Getting Real. Real Tasty.</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/GUkCXL8VmPA/getting-real-real-tasty" />
   <updated>2010-01-17T00:00:00-08:00</updated>
   <id>http://zachholman.com/2010/01/getting-real-real-tasty</id>
   <content type="html">&lt;p&gt;I amused myself today when I realized 37signals does my groceries.&lt;/p&gt;

&lt;p&gt;I grew up in the Midwest, where you did your groceries by driving 5-10 minutes to your local supermarket, grabbing a cart, and selecting your food as you wander the endlessly winding aisles. The process, depending on how many you&amp;#39;re buying for and how far away the supermarket is, can take 20-40 minutes.&lt;/p&gt;

&lt;p&gt;Since recently moving to San Francisco, I&amp;#39;ve been frequenting my local grocer more and more. It&amp;#39;s less than a block away, I don&amp;#39;t need to drive, and it&amp;#39;s physically small, so the entire process can be slimmed to four or five minutes for travel, selection, and purchasing.&lt;/p&gt;

&lt;p&gt;The more I thought about &lt;em&gt;why&lt;/em&gt; I appreciated the small market so much, the more I saw that paralleled what 37signals espoused in &lt;a href="http://gettingreal.37signals.com/"&gt;Getting Real&lt;/a&gt;, and, more broadly, to shipping product. It&amp;#39;s all about limitations.&lt;/p&gt;

&lt;p&gt;The reason I&amp;#39;ve been going to my local grocery instead of the nearest supermarket is convenience, of course. The time and hassle I save is obvious. But there&amp;#39;s a massive limitation: will they have what I want? They&amp;#39;re obviously much, much smaller; how will I get by without my precious Dulce de Leche ice cream? The answer, of course, is &lt;em&gt;it doesn&amp;#39;t matter&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Would these things be nice to have? Sure. But are they essential? Do they really matter? Nope.&lt;/p&gt;

&lt;p&gt;&lt;cite&gt;&lt;a href="http://gettingreal.37signals.com/ch05_It_Just_Doesnt_Matter.php"&gt;It just doesn&amp;#39;t matter&lt;/a&gt;, 37signals&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pretty quickly, I found it just doesn&amp;#39;t matter. If I&amp;#39;m not throwing a party or feeling like making a special meal that week, the vast majority of the time I&amp;#39;m simply looking to not be hungry; type of food is fairly irrelevant. The things I missed from my local grocer I just stopped getting and substituted them with something different than my &amp;quot;usual&amp;quot; items. The same can be said for web apps. You could try to please your user with every feature under the sun, but users are resilient- they can usually make due with an alternative existing process or feature. In most cases, the difference between the two isn&amp;#39;t going to be significant.&lt;/p&gt;

&lt;p&gt;Furthermore, you could look at the grocer&amp;#39;s stock choices as their idea of what makes a good kitchen. They&amp;#39;re a small company. They can&amp;#39;t come close to delivering the breadth that a large company can. So they have to make choices. And for the most part, their choices are going to be good enough for me. If they aren&amp;#39;t, I can always use them for the majority of my needs, and hit a supermarket every two months when the need arises. In the long term, I could let the owner know what I need, and if enough customers feel similarly I&amp;#39;m sure he&amp;#39;d be fine with implementing my request.&lt;/p&gt;

&lt;p&gt;Limitations are a good thing, particularly the smaller you are. If you&amp;#39;re building a new site, or if your company is forging ahead against the behemoth, there&amp;#39;s no reason to shy away from them. The opposite is true, really: limitations make you who are. A huge company doesn&amp;#39;t care about limitations because they&amp;#39;re big enough to offer everything under the sun. They &lt;em&gt;miss out&lt;/em&gt; on limitations because they don&amp;#39;t even need to comprehend them. A small company does, and that shapes how they offer their product, how quickly they can adapt to changes in their product and in changes in their customers. If you&amp;#39;re building a data-driven backend there&amp;#39;s no reason you both need a list view and a browse view to access the same data. Take a stand, grow a pair and decide which singular view makes sense. It keeps you flexible for the future and lets you ship yesterday rather than tomorrow. The big company doesn&amp;#39;t care; they&amp;#39;ll build two, three, or five views, because they have the resources. And that&amp;#39;s why they&amp;#39;ll tend to build a very lukewarm user experience.&lt;/p&gt;

&lt;p&gt;I don&amp;#39;t mean to harp on 37signals as the end-all, be-all for simplicity in design, of course. But I found it amusing to compare my local grocery situation to Getting Real&amp;#39;s table of contents and seeing how similar they line up in places. Simplicity is a little more universal than that. That&amp;#39;s pretty cool.&lt;/p&gt;

&lt;p&gt;So anyway, what I&amp;#39;m trying to say is I&amp;#39;ll have a sandwich, &lt;a href="http://twitter.com/dhh"&gt;@dhh&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/GUkCXL8VmPA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2010/01/getting-real-real-tasty</feedburner:origLink></entry>
 
 <entry>
   <title>Because 11Mbps is better than 10Mbps</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/C0K2y6-9yIg/because-11mbps-is-better-than-10mbps" />
   <updated>2009-11-30T00:00:00-08:00</updated>
   <id>http://zachholman.com/2009/11/because-11mbps-is-better-than-10mbps</id>
   <content type="html">&lt;p&gt;Why do cable companies bother advertise their connection speeds so heavily? Internet connectivity has lagged behind hardware specs by about 5-10 years, but they&amp;#39;ve followed the same path. In the 1990&amp;#39;s, a 486 blew away a 386. 512MB of RAM offered enormous advantages over 256MB. But today it just doesn&amp;#39;t matter. Apple, in particular, buries technical specs away, because the vast majority of people just don&amp;#39;t care if their Core 2 Duo is running at 3.06GHz or at 2.1GHz. Software and hardware have progressed to a point where incremental improvements are effectively negligible. It&amp;#39;s the experience that matters. It&amp;#39;s the design. It&amp;#39;s the freedom. It&amp;#39;s the productivity.&lt;/p&gt;

&lt;p&gt;Today, connectivity is the same. The vast majority of people are fine with a basic cable internet package. Most YouTube videos — the fattest bandwidth hit for the average consumer — will buffer and start playing within seconds. The connection speed shouldn&amp;#39;t be a selling point. The selling point is how your experience is: are your customer service reps assholes? Or the design. Is billing and package management a complete nightmare? Or the freedom. Are you filtering and prioritizing your customer&amp;#39;s bandwidth? Or simple economics. Are you dicking everyone with fee after fee, even when someone upgrades their equipment to pay more money to you?&lt;/p&gt;

&lt;p&gt;Yes, you techies out there streaming bittorrent over a tunneled Tor node to a DC++ server do want more bandwidth. But you&amp;#39;re also not going to buy a random, vanilla metal box from Dell. You&amp;#39;re in the minority. &lt;em&gt;It just doesn&amp;#39;t matter anymore&lt;/em&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/C0K2y6-9yIg" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2009/11/because-11mbps-is-better-than-10mbps</feedburner:origLink></entry>
 
 <entry>
   <title>More Logical File System Organization with iTunes 9</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/sDi4fgnSaU0/more-logical-file-system-organization-with-itunes-9" />
   <updated>2009-11-10T00:00:00-08:00</updated>
   <id>http://zachholman.com/2009/11/more-logical-file-system-organization-with-itunes-9</id>
   <content type="html">&lt;p&gt;&lt;img src="http://files.droplr.com/files/11322372/eMDde.itunes%20library%20conslidation.png" alt="iTunes 9 Library Consolidation"&gt;&lt;/p&gt;

&lt;p&gt;The iTunes organizational hierarchy has been slowly getting more and more disorganized with each feature Apple adds. When you let iTunes manage your files, traditionally they toss everything in &lt;code&gt;~/Music/iTunes/iTunes Music&lt;/code&gt;. That works great when everything in &amp;quot;iTunes Music&amp;quot; is, you know, music. Once they&amp;#39;ve tossed movies, podcasts, and a slew of other features in the mix, your directory hierarchy gets really nonsensical with everything in one big ol&amp;#39; pile.&lt;/p&gt;

&lt;p&gt;iTunes 9 finally moves away from this mentality, though the feature is hidden by default. iTunes now lets you organize everything into an upper level &amp;quot;iTunes Media&amp;quot; folder structure, which then breaks out neatly into logical groupings: movies, apps, shows, and so on. You can find this in File =&amp;gt; Library =&amp;gt; Organize Library. You&amp;#39;re welcome.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/sDi4fgnSaU0" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2009/11/more-logical-file-system-organization-with-itunes-9</feedburner:origLink></entry>
 
 <entry>
   <title>Positioning Apple</title>
   <link href="http://feedproxy.google.com/~r/holman/~3/xOmov5amFHo/" />
   <updated>2009-10-19T00:00:00-07:00</updated>
   <id>http://zachholman.com/2009/10/positioning-apple</id>
   <content type="html">&lt;p&gt;It&amp;#39;s easy to say that Apple has a great marketing department. It&amp;#39;s also boring. The interesting question is: &lt;em&gt;why&lt;/em&gt; is Apple so good at marketing their products?&lt;/p&gt;

&lt;h2&gt;Managing Expectations&lt;/h2&gt;

&lt;p&gt;To put it plainly: &lt;strong&gt;Apple is great at managing expectations&lt;/strong&gt;. I don&amp;#39;t really mean this in the traditional sense, that Apple first tries to scope down expectations and then releases an incrementally better version, blowing away expectations and having immediate success. Apple is more clever than this. What Apple does differently is that they &lt;em&gt;mold&lt;/em&gt; expectations.&lt;/p&gt;

&lt;p&gt;It&amp;#39;s not about under-promising and over-delivering. It&amp;#39;s about adjusting how consumers use your product in order to reach what is ultimately a great experience. This adjustment can be extremely non-intuitive. I&amp;#39;d argue that historically Apple has made moves in the very opposite direction than you&amp;#39;d expect in order to set up an easy layup months or years down the line.&lt;/p&gt;

&lt;p&gt;This is all illustrated better with concrete examples.&lt;/p&gt;

&lt;h2&gt;iPod Nano&amp;#39;s new &amp;quot;camera&amp;quot;&lt;/h2&gt;

&lt;p&gt;The Apple rumor community had the new iPod Nano pegged for a camera for weeks. Toss in a tiny lens, hook up a small chip, and we&amp;#39;re done. It&amp;#39;s an interesting rumor, but contains no shockers. It&amp;#39;s straightforward enough that everyone thought they had it all figured out.&lt;/p&gt;

&lt;p&gt;Steve comes out, mentions the Nano has a camera in it. Cool. The weird part is that it&amp;#39;s a camera that takes no pictures; only video. This is strange. The cynical amongst the internet (surprise! there&amp;#39;s a bunch of them) immediately jump on two related points: 1. The video quality sucks, and 2. You can&amp;#39;t take photos! Seriously! A Linux-based 200GB media center deluxe from 2007 with a massive zoom lens is half the price of the Nano! Apple&amp;#39;s screwing you, you suckers!&lt;/p&gt;

&lt;p&gt;This is the interesting bit for me. The one fundamental constraint for any Apple-produced device is physical size and shape. More than anyone else, Apple will compromise on almost anything — Firewire 800, battery life, expandable batteries, PCI Express cards, the entire video card itself — with the exception of physical design. It&amp;#39;s worked for them. I think it&amp;#39;s clear that a number of consumers will pay extra for more durable aluminum casing, a slimmer profile, a more inviting grasp to it. Immediately, this fundamental constraint limits the camera. At a certain physical size, the physics don&amp;#39;t work for high quality pictures while retaining small dimensions.&lt;/p&gt;

&lt;p&gt;Once the decision has been made to include a camera, the driving design of the product has limited your choices in how to implement it: not well. By constraining design, they just can&amp;#39;t implement a fantastic camera. Luckily, &amp;quot;not well&amp;quot; is relative. I&amp;#39;d wager that the chip Apple selected fits into the category of &amp;quot;takes mobile video decently, but the photos kind of blow a bit&amp;quot;.&lt;/p&gt;

&lt;p&gt;Once that decision has been made, most companies would just toss the bucket at the consumer. &lt;em&gt;It takes decent video, and, hey, you can take some kind of quality of photo, too.&lt;/em&gt; This is what makes Apple different. By removing photos from the equation completely, yes, Apple avoids shouts of &amp;quot;This picture looks like garbage!&amp;quot;, but more importantly it explicitly shapes the experience into one revolving around video.&lt;/p&gt;

&lt;p&gt;It&amp;#39;s no longer another smartphone. Or a point and shoot. Or an SLR. Its purpose is strictly for fun, off-the-cuff video for those times you might have your Nano with you. By ripping stills out, it&amp;#39;s no longer just another de facto &amp;quot;Photographic Device&amp;quot;. It becomes less of an option to bring with you on your family vacation; it&amp;#39;s rather a subtle prod that maybe you should bring that SLR or point-and-shoot with you instead. Does this ruin the Nano as a broad, multi-purpose device? Yes. Absolutely. But again, it&amp;#39;s not a primary market for the Nano (yet). Having the ability to take stupid, silly little videos is a bit of an untapped market, really. I have a &lt;a href="http://store.kodak.com/store/ekconsus/en_US/list/Digital_Video_Cameras/categoryID.28889100"&gt;Kodak Zi6&lt;/a&gt;, which is nifty and is similar to the Flip, but I have to consciously bring that with me. People carry their iPods around every day; having a low quality video camera on the Nano is going to be extremely popular in high schools and universities across the country. By shifting — not undervaluing — how you&amp;#39;re expecting to use the Nano&amp;#39;s camera, Apple&amp;#39;s able to gently redirect it into another, more successful experience.&lt;/p&gt;

&lt;h2&gt;iPhone&amp;#39;s MMS (or lack thereof)&lt;/h2&gt;

&lt;p&gt;Pardon my French, but fuck AT&amp;amp;T. Unfortunately, I&amp;#39;m a developer by profession, so I can grasp how messed up AT&amp;amp;T made viewmymessage.com, which was the website you previously were redirected to if you received a multimedia message on your iPhone.&lt;/p&gt;

&lt;p&gt;Upon receipt of the MMS, you&amp;#39;re directed to either viewmymessage.com/1, or viewmymessage.com/2. One of those appears to be a legacy site that&amp;#39;s still in use, and it matters which one you go to- the logins are not federated. Once there, you have to laboriously type (or copy and paste one chunk at a time) a username and a password (the password being memorable, whereas the username being randomly generated, of all things). Inside, you see a maliciously-cropped photo or clip or whatever your insensitive friend texted you.&lt;/p&gt;

&lt;p&gt;It&amp;#39;s a terrible process.&lt;/p&gt;

&lt;p&gt;From common sentiment, this is all AT&amp;amp;T&amp;#39;s fault. Their network can&amp;#39;t handle full-fledged iPhone MMS rollout, and they apparently can&amp;#39;t build web apps for shit. But that&amp;#39;s beyond the point; no one expected real competency from AT&amp;amp;T anyway. Again, what&amp;#39;s interesting is how Apple managed this.&lt;/p&gt;

&lt;p&gt;From the very beginning, even before launch day, you had Steve up on stage going out of his way to say how cool it was to take a picture on your phone, drop it into the mail app and your recipient would then get pretty decent-quality photos. This was the case for two years. It wasn&amp;#39;t a matter of saying, &amp;quot;well, sending multimedia is tough right now, so don&amp;#39;t expect much, but hey, a few years down the line we&amp;#39;ll surprise you with KILLER MMS!&amp;quot; It&amp;#39;s a route they could have taken. From the get-go, Apple could have said, &amp;quot;hey, we&amp;#39;ve got a bunch of stuff on our plate; we&amp;#39;ll get to MMS eventually. In the meantime, I guess email could work.&amp;quot; Or even, &amp;quot;well, MMS is a little hard to figure out and/or not high on our own lists, so here&amp;#39;s a mediocre solution now that we might clean up in the future&amp;quot;. Instead, Apple tossed all of its weight behind email. Everyone has email, everyone is used to email. (I&amp;#39;m continually surprised by friends who both 1) don&amp;#39;t know what MMS is, and 2) don&amp;#39;t receive traditional MMS. A number of my friends who don&amp;#39;t receive traditional MMS get it forwarded to their email inboxes automatically anyway.)&lt;/p&gt;

&lt;p&gt;viewmymessage.com, for better or worse, has adjusted my expectations of MMS. I hated that solution; I embraced email for sending multimedia. Even though I&amp;#39;m now happily situated with MMS finally, I still will tend to use email for multimedia. I suspect that&amp;#39;s good for a number of people: I have a stable, cross-device avenue to share media, and AT&amp;amp;T doesn&amp;#39;t have to carry another few kilobytes on their load-laden network.&lt;/p&gt;

&lt;p&gt;Like the Nano, for some reason their development cycle was constrained or set up such that a particular feature would turn out subpar or limited in some fashion. By molding expectations, however, Apple is able to change the rules as they see fit. Again, this isn&amp;#39;t a surefire way to win support. Plenty of people (myself included) hated MMS, and I&amp;#39;m sure plenty of people don&amp;#39;t like that they can&amp;#39;t take Nano stills. But they&amp;#39;re taking things in a different direction in hopes of repositioning customer expectations.&lt;/p&gt;

&lt;h2&gt;The subtle prodding&lt;/h2&gt;

&lt;p&gt;At the expense of over-analyzing every decision, you can start seeing these progressions, these shifts over the course of many products at Apple. iTunes has had smart playlists for years. At first, I found them foreign. If you go way back to the Napster-era WinAmp days, you find everything riddled with static, manual playlists. It&amp;#39;s really a carry-over from CD mixes, where you want control in picking each and every song, because heaven forbid you&amp;#39;re stuck with a crappy song on your 16 song mix and you&amp;#39;re driving in the middle of nowhere and you have to listen to that song.&lt;/p&gt;

&lt;p&gt;Smart playlists started making sense the more I grew my library. Top 100 songs listened to. Songs rated 4 stars or higher. Last 100 songs purchased. Things like that. I had started to adjust to letting my computer figure out my habits. I suspect this was something Apple must have noticed years back, but they didn&amp;#39;t have the technology to do much with it until recently. Then iTunes DJ and Genius Playlists came into the mix, which let you listen more on a global recommendation level. Most recently, Genius Mixes, which give you pretty targeted genre-based playlists. More and more I don&amp;#39;t use shuffle and I don&amp;#39;t use playlists; I just let Genius take over.&lt;/p&gt;

&lt;p&gt;You can also see this with the evolution of geolocation. The iPhone first got broad wifi-based geopositioning. Then iPhone got quite accurate GPS. Then iPhoto got Places to organize your months of newly-geopositioned photos. Then Snow Leopard got OS-level  CoreLocation. I rather doubt this is the last of the progression, either. It&amp;#39;s a logical hierarchy, but one that might have been a little confusing with the advent of iPhone wifi-detection, since outside of Flickr there just wasn&amp;#39;t many avenues to &lt;em&gt;do&lt;/em&gt; anything with that data.&lt;/p&gt;

&lt;p&gt;From a consumer standpoint, it&amp;#39;s comforting to suspect that there&amp;#39;s some grand plan behind everything, that each step Apple takes is a step towards a more integrated, neatly designed end game that will make my life terribly more organized and worthwhile a year down the line. I hold no illusions that this is always the case. I&amp;#39;m sure some brilliant Apple decisions have been complete seat-of-the-pants bullshitting that just happened to hit paydirt. But I also think that what sets Apple uniquely apart is that ability to take high level, end-to-end past-to-future views across entire product lines.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/holman/~4/xOmov5amFHo" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://zachholman.com/2009/10/positioning-apple/</feedburner:origLink></entry>
 
 
</feed>
