Skip to content

Instantly share code, notes, and snippets.

@defunkt
Created August 20, 2008 20:30
Show Gist options
  • Save defunkt/6443 to your computer and use it in GitHub Desktop.
Save defunkt/6443 to your computer and use it in GitHub Desktop.

Revisions

  1. defunkt revised this gist Aug 20, 2008. 1 changed file with 2 additions and 1 deletion.
    3 changes: 2 additions & 1 deletion gistfile1.txt
    Original file line number Diff line number Diff line change
    @@ -151,7 +151,8 @@ historians and other nerds in the IAS building were pretty pissed.
    All the engineers kept notebooks, of course. Blogs. They'd write frustrated
    entries, only to have massive elated breakthroughs the following day.
    Their notes were being sent out to institutes all over the country so
    others could reproduce their work and create new machines with the von Neumann architecture.
    others could reproduce their work and create new machines with the von Neumann
    architecture.

    And then they finished. On June 10, 1952 the IAS machine was fully
    operational. Others built similar machines (though none of the
  2. defunkt created this gist Aug 20, 2008.
    503 changes: 503 additions & 0 deletions gistfile1.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,503 @@
    # Video: http://rubyhoedown2008.confreaks.com/08-chris-wanstrath-keynote.html

    Hi everyone, I'm Chris Wanstrath.

    When Jeremy asked me to come talk, I said yes. Hell yes. Immediately. But
    then I took a few moments and thought, Wait, why? Why me? What am I supposed
    to say that's interesting? Something about Ruby, perhaps. Maybe the
    future of it. The future of something, at least. That sounds
    keynote-y.

    So why don't I just get that part out of the way. The future of Ruby.

    In the future, Ruby will become... more popular. There will be more
    implementations. There will be more programmers using it. More
    machines with it installed by default. There will be more people
    writing blogs about it, and more people reading blogs about it.

    I know this may sound kind of crazy, but you have to trust me. I'm keynoting.

    There will be more RubyGems, and there will be more RubyGems servers. At
    least one, possibly as many as two, and it's conceivable that more
    than three new books will be written about it. Current books will be
    released in new editions, with more pages and more in depth information on
    new features.

    New Rubyists will be younger, and current Rubyists will get older. Some
    Rubyists will get dogs, others cats. A few will remain dogless and
    catless, perhaps opting for children instead. (This is a common
    mistake, as, in my experience, children are much more expensive than either
    dogs or cats.)

    Websites will be created in Ruby, using futuristic versions of Ruby on Rails
    and Merb. Versions like 3.0 and 1.0, respectively. New web
    frameworks will be created with strange names and stranger maintainers. We will
    come to know _why the lucky stiff as a less violent version of the Joker, matz guys
    as a more controlled version of Two Face, Dr Nic as the Penguin (he really loves
    fish), and DHH as our Batman. As for me... I am Iron Man.

    New languages will come along, and they will become popular. People will
    continue to scorn Ruby, calling it names like "Python's Perl," or
    "Java for nerds," or even, God forbid, "Visual Basic for the web."
    (Technically, however, I think that role was already filled by ASP versions
    1 through 3.)

    Ruby will be taught in college, to young nubys eager to learn the ways of the
    master craftsmen. Most of the students will be drunk during these
    classes, others hungover, all hungry for knowledge.

    Behavior will drive us and macros will help define us. Well, some of us.

    Proc. Lambda.

    There will be more conferences. People will speak at these conferences,
    sometimes about Ruby, sometimes not about Ruby. Speakers will wax
    philosophically about the glory days of Smalltalk... without actually
    having written any Smalltalk. Others will show benchmarks for their new,
    superfast Ruby VM. No, it's not open source and no, you can't try it
    out yet.

    Someone will bring up a 2.0 version number, then quickly be hushed. Suit
    people will surround us. Tests will be mocked, and mocks will be
    tested. Or is that stubs?

    Ruby will be fast and it will be slow, patches will be released that break
    backwards compatibility, and security vulnerabilities will be handled
    in a less than satisfying manner. Big websites will attract billions
    of visitors while little blogs will appear, amaze, then vanish.

    Most importantly, Ruby will stay beautiful. At least, we hope so.

    And that's the future of Ruby.

    Did that feel keynotey? Let's talk about the past now.

    John von Neumann was one of the great mathematicians of the 20th century. He
    made contributions to cellular automata, set theory, functional
    analysis, quantum mechanics, ergodic theory, continuous geometry,
    economics and game theory, computer science, numerical analysis, explosive
    hydrodynamics, and statistics. (I know about 60% of those words.)

    He also helped invent the modern computer. The ones we're all using, right
    now.

    In the 1940s, von Neumann and a group of, basically, geniuses got together to
    build a computer. It wasn't the first computer, mind you. In fact,
    'computer' is a term once used to describe individuals who computed
    numbers.

    Charles Babbage was such a computer frustrated by the fallibility of the human
    brain - when dealing with massive amounts of numbers, mistakes were
    common. For example, William Shanks spent 15 years calculating 707
    digits of Pi.

    Tragically, he made a mistake at year 11. His next four years were
    spent computing in vain and only the first 527 digits were correct.

    Anyway, Babbage envisioned a machine that could carry out precise instructions
    and deliver accurate information. If machines could do physical labor,
    why not mental labor?

    Guys like Alan Turing got in on the action and came up with ideas which would
    eventually produce machines such as ENIAC, the first programmable
    digital computer. While ENIAC was a breakthrough, von Neumann's
    architecture was different in an important way: it stored both program
    instructions and user data in RAM. Prior to von Neumann's ideas, program
    instructions, while modifiable, were stored separately from data.

    Like I said, this idea (called the von Neumann or stored-program architecture)
    is what we use today. When you're writing your Rubys in your
    TextMates, both the Rubys and TextMates are stored together in RAM.

    Having both instructions and data in memory together could be used to
    implement, as a primitive example, loops - branch instructions are
    modified as the loop iterates. In the ENIAC and others, these sort of
    transformations were done by hand, by programmers. (Oh, and the first
    programmers? All women.)

    Anyway, in the second half of the '40s von Neumann and a small team got
    together at the Institute of Advanced Study (IAS) and started working
    on a machine based on his stored-program architecture. To be fair, it
    wasn't entirely his idea. Standing on the shoulders of giants, and all that.
    Also, Wikipedia claims that some British team actually beat his team
    at implementing a stored-program architecture computer.

    But who cares about Wikipedia?

    The IAS, where von Neumann's machine was built, was basically a dorm near
    Princeton, but not officially affiliated with Princeton, started by
    some philanthropists who wanted scientists to stay there, have their
    lodging and food paid for, and get their science on. Big time. Einstein was one
    of the first residents, as were von Neumann, Kurt Gödel, and J.
    "mother fin'" Robert "atomic bomb" Oppenheimer.

    So this place held historians, scientists, and engineers. The engineers
    working with von Neumann on the IAS machine worked in the basement.
    Sound familiar? To this day, the basement is the IAS server room.

    These guys working on the IAS machine that summer were both programmers and
    engineers. They would solder the parts themselves, program the
    programs, and fix bugs in both hardware and software. Actually, they
    often had a hard time distinguishing between hardware and software bugs.
    Is the code wrong or is the machine wrong? What a nightmare.

    They used about 2300 Radio Shack-caliber vacuum tubes for switches and memory.
    Stuff would break constantly. They'd stay up until 4, 5am drinking
    tons of tea with tons of sugar. In fact, since this was during the
    war, sugar was rationed and they were using more than their fair share. The
    historians and other nerds in the IAS building were pretty pissed.
    (Sounds like me and my brother over Mountain Dew in high school.)

    All the engineers kept notebooks, of course. Blogs. They'd write frustrated
    entries, only to have massive elated breakthroughs the following day.
    Their notes were being sent out to institutes all over the country so
    others could reproduce their work and create new machines with the von Neumann architecture.

    And then they finished. On June 10, 1952 the IAS machine was fully
    operational. Others built similar machines (though none of the
    machines had compatible instruction sets - you couldn't yet write a
    portable program) at similar institutions, and the IAS machine then carried
    out its intended purpose:

    Help design hydrogen bombs.

    The first hydrogen bomb was detonated on November 1, 1952. It was called "Ivy
    Mike," detonated on an island in the Enewetak atoll in the Pacific
    Ocean, and was 450 times more powerful than the bomb dropped on
    Nagasaki.

    So, mathematicians built the first modern computer to aid them in applied
    mathematics and hydrodynamics. These guys were true hackers working
    on what was a massive side project, and, in a way, the ultimate yak
    shave.

    (Interestingly, this may also explain why everyone thinks you need to be great
    at math to be a programmer, but I digress.)

    Today, that is, in the present, there are a number of high profile
    Ruby projects which began as side projects. Some of them might also
    be called... the bomb.

    Rubinius now has five people working full time on it, but began humbly
    in 2006 as Evan Phoenix's side project. He wanted to build his own
    Ruby.

    Ruby on Rails itself was extracted from Basecamp, which was a website
    the 37signals guys were doing on the side. At the time, they were a
    design firm and David Hansson was a contractor.

    No one really knows what _why does with his time, but Shoes is
    certainly moving full steam ahead with no mention of monetary gain.
    Just for hack's sake, to make things better for people wanting to put
    together GUIs in their favorite langauge, for fun.

    Merb started as a pastie, a thin layer on top of Mongrel to allow for
    fast, concurrent file uploads. Developers at Engine Yard now actively
    work on the framework. (Though I'm not so sure it can fit in a single
    pastie (or gist) anymore.)

    You should always have a side project, too. Side projects give you an
    outlet, provide a useful distraction, let you explore new ideas, learn
    new concepts, and generally give you the freedom to be unaccountable.
    You don't have to worry about your boss, or your coworkers, or the
    damn commentators on Reddit. Just have some fun. Treat yourself.

    After I dropped out of college, I worked at a PHP shop doing trucking
    logistics applications. We were a broker between independent truckers
    and big companies like KMart. Truckers would register on our website,
    say they're going to be in Delaware on the 3rd of May and that they're
    heading to Denver, then get information on shipments along their
    chosen route. They could then bid on shipments or accept them, all
    through us.

    It was a fairly complex application and two things were missing:
    version control and constants. There was no version control, so you'd
    have things like main2.php and compute_radius_of_from_shipment7.php
    laying around. Along with versions 0 through 6 of that same file, in
    the same directory. Truly painful.

    There were no constants and no configuration, so the source code was
    filled with magic numbers. If you wanted to tweak any of our
    algorithms, you had to find the code which did the computation and
    change some numbers by hand. Hopefully the correct numbers.

    Naturally, the first thing I did was institutionalize Subversion.
    (I've apparently always been a champion of source control, though I
    didn't realize it until setting this story to paper.)

    The second thing I did was start extracting the magic numbers into
    configuration files. At the time, it was a pretty common PHP idiom to
    use .ini files for configuration. Most of what you'd need was
    supported, and I'm pretty sure PHP came with a library (aka a shotgun
    blast of functions in the global namespace) that could understand .ini
    files.

    This worked okay, but once I started tinkering with Rails I was blown
    away by YAML. So clean, so powerful. There was Syck, the C extension
    written by _why, but it was just that: a C extension. I didn't know
    much about loading C code in PHP, and even less about doing it on our
    production servers.

    So I set out to write a YAML parser in PHP, on my own time. As a nod
    to Syck, I called it Spyc - S P Y C - a simple php yaml class. It was
    my first parser, was stateful, and I think did two passes for the
    reference / pointer stuff YAML supports. It didn't support all of
    YAML, but it supported most of it - both dumping and loading. The
    good parts.

    I snuck it in and before long we were using YAML with great success at
    my company. Naturally, I put the code up on SourceForge. King of all
    online source code repositories. My designer friend made a page and
    in the first month Spyc was a huge hit. I swear it had at least 70
    downloads. SEVENTY!

    That was a big deal.

    Fast forward about nine months: I realized the trucking logistics
    business isn't the beacon of progress or congregation of forward
    thinking individuals I had envisioned. After all, they hired me.

    I quit and begun re-enrolling in school. This time I would major in
    Computer Science instead of English. My path was set.

    But then, near the end of that summer, a friend IM'd me. A close
    friend I grew up with. He was into Digg and video games, but was far
    from a programmer. "Hey," he said. "Do you know MySQL?"

    "Shit," I thought. I figured this conversation would be the modern
    day equivalent of said friend asking why Ruby sites are always down.
    Real time trolling.

    "Yeah, I know MySQL."

    "And you know PHP too, right?"

    "Yes." I was dubious about the direction this conversation was headed.

    "GameSpot is hiring. You should apply."

    Ah, GameSpot. He and I were both into video games. During high
    school I worked at a local GameStop, and in college I worked at
    EBGames in the mall. I had all the modern systems and grew up with
    Atari, NES, Genesis, all that.

    Gamespot.com was a site I had visited quite often while in high school
    and college. By the way, notice how different the names GameSpot and
    GameStop are - this would later cause my family endless amounts of
    confusion, thinking I had moved to California to work retail. The
    American dream.

    So, when you Googled video games, GameSpot was usually #1 or #2 in the
    results. I knew it well. GameFAQs.com (that's game F A Qs) was owned
    by the same company, and probably the site I used most. It's
    basically walkthroughs, how-tos, guides... and cheats. Lots of
    cheats.

    Anyway, I had no idea where San Francisco was or what the guys at
    GameSpot were looking for, but I applied. I created a brand new
    resume and stayed up all night working on the cover letter. By the
    time I was finished, it was a page long and pretty convincing.

    In it I promised to move to California the next day, bringing nothing
    but my guitar and Xbox with me. My family would miss me but I was
    ready to leave, and I was hungry to show the world what I could do.
    Ready to learn from the masters.

    The phone interviews went well, they liked that I was into Macs and
    Ruby, and I obviously got the job. My first time ever stepping foot
    in California was when I flew out to find an apartment with my dad.

    My work experience wasn't what got me the job. I'm sure my cover
    letter had something to do with it, but my short lived career in
    trucking logistics was less than glamorous. I really only had one
    thing to show GameSpot - Spyc. My code was freely available, had been
    used in production, and worked. They could download it and play with
    it, or check it out online. Regardless of whether or not they thought
    it was good, they could tell it was clean and well thought out. Well,
    maybe not, but I had a website and 70 downloads.

    So I got the job at GameSpot, in my mind the first big step in the
    path that brought me right here, thanks to my open source side
    project.

    Something I learned from that experience is that you don't need to
    make money from code to make money thanks to code. I didn't make
    money off Spyc, but I made money thanks to Spyc. (Also, it got my
    name in a book. But that's a different story.)

    So that was pretty cool, and I thought unique, until it happened
    again. While I was working on GameSpot, I was doing more and more
    Ruby on the side. I had an open source Rails tumblelog called
    Ozimodo, a crappy FTP server called ftpd.rb (which I used as a way to
    learn about threading), and a command line option parser DSL called
    Choice. For Choice, I had a full test suite (I wrote the thing to
    learn TDD) and an RDoc generated homepage on Rubyforge.

    When CNET, GameSpot's parent company, acquired Chowhound, they decided
    to rewrite the site in Rails. Classic. They brought on two Rails
    programmers from Wayfaring.com and were looking for another. They
    found me.

    I later found out my RDoc site, Ruby gem, and test suite proved to the
    Wayfaring guys I was a "real" Ruby programmer. They wanted someone
    excited about this stuff, and I certainly was.

    So they threw a bunch of money in my face and convinced me to work on
    Chowhound. Thanks, again, to open source side projects.

    This happened to me twice, so it's not uncommon. Open source can make
    wonderful things happen for you, and not just financially but socially
    too. At Chowhound I met PJ Hyett, a GitHub cofounder and coauthor of
    Err the Blog.

    So, start a side project. Who knows where it will take you.

    Do you have one now? If not, why not? Not enough time? No ideas? I
    think I can help with both of those.

    First off, the time issue. I don't know how many of you read RSS, but
    I challenge you (that's a keynote term) to give it up for a month.
    Just turn it off. Stop using Google Reader or NetNewsWire or whatever
    the kids are using these days. It's not worth your time.

    What should you do instead? If you use Twitter, try following the
    authors of your favorite blogs. Read their tweets on the bus. Or in
    the bathroom. Check Ruby Inside once a week and skim over the posts.
    Visit an aggregator like planetrubyonrails.com once a month. But
    mainly, let other people do the filtering for you. Use your time for
    other things.

    You will not miss out on anything big. Stuff like the Google App
    Engine, or Rubinius running Rails, or the killer speaker line up at
    this year's Ruby Hoedown will find its way to you. How can it not?
    I'm willing to bet a lot of the stuff in your RSS reader is stuff you
    already knew, or heard about somewhere else.

    Personally, I used to check RSS multiple times per day. Now I don't
    use any reader, and haven't since January 2008.

    Another big time sink among programmers, I've found, are books on
    process and theory. Books like Smalltalk Best Practice Patterns,
    Practices of an Agile Developer, and even, I dare say, the Pragmatic
    Programmer, are not worth your time. Instead, listen to Rein's talk.
    Talk to your friends or coworkers. Let other people filter the
    information for you, then decide what you like.

    The best way to learn about patterns, idioms, and best practices is to
    read open source code. See how other people are doing it. It's a
    great way to stay current, and it's free.

    (I really wish someone had told me this before I bought and read Head
    Start Design Patterns. The whole thing.)

    Next implement the Jerry Seinfield GTD method. Every time you work on
    your side project, mark a big X through that day on calendar.
    Eventually you'll have a nice line of Xs. Missing an X will be
    torture - it'll mess up your beautiful streak. The goal is to maintain
    the streak, even if you don't think you have any ideas for the day.
    The best way to overcome writer's block is to write, after all.

    Okay, so the time excuse is gone. Now you have time to work on a side
    project and the motivation to do it consistently - the beautiful line
    of Xs. You can devote at least one Sunday a month to it, at least.
    But what's the idea?

    This is actually the easy part, because you don't need a good idea.
    Just start doing something interesting. Play with a new framework in
    Ruby - I hear Sinatra is pretty hot these days. Learn how to do GUI
    stuff, with Shoes.

    Learn JavaScript. Like, for real. If you don't know what the var,
    with, or delete keywords are, get a book and start working on some
    flashy effects. Or download Rhino or Johnson and write some server
    side JS. It's a really beautiful and misunderstood language.

    Take some time to master your editor. Pick up the TextMate book and
    dive in. Write a bundle. If you're already got massive Vim-fu, try
    out Emacs. Learn why people love it, then use that information in
    your holy wars against them.

    Write a web service. Something like Cheat, Subtlety, Disqus, or
    TwitPic - tools someone can use to help make running a blog, site, or
    coding simpler. Simple sites that do one thing very well, and surface
    their information with digestible APIs.

    If you've been meaning to learn a new language, start learning it.
    But don't just read a book. Start writing a program.

    Learn Objective-C and Cocoa. Write a little Mac app to do something
    useful, then give it away for free. Post the code on GitHub. Put up
    a Pledgie badge and accept donations. Profit.

    Write Rake in a Lisp. It's a good way to learn about metaprogramming
    and how command line scripts work in your new language. Write an RSS
    parser and explore native data types in Erlang. Write a simple blog
    and learn about the web frameworks in Haskell. Write Scrabble in Io,
    picking up some OpenGL along the way. It doesn't matter if people
    have done it before.

    In fact, stop worrying so much about other people. Every time I've
    worked on a project I thought other people would really love, it was a
    massive flop. Every time I've worked on a project I loved, it worked.
    If you're sitting in this room, your taste is not as far off from
    those around you as you'd think. Build something you love and others
    will love it, too. (Not everyone, of course.)

    Alternatively, do something hard, the hardest thing you can think of,
    in your language of choice. Stretch the boundries. Make Ruby cry out
    in pain. Install ImageMagick. Rewrite all of the standard library.
    Write an Objective-C bridge. You know, something just devilish. Flex
    your brain.

    Work on your small project for a few Sundays, declare it complete then
    move on. Learn another language, or write something else in your new
    language. Pick up a new web framework or work on flashy effect number
    two. Add concurrent task execution to your Rake. The more acclimated
    you get to this process, the more creative your ideas will be. It's
    the whole 10% inspiration 90% perspiration thing, and it worked for
    me.

    This, after all, is how GitHub was started. Tom and I had full time
    gigs, but we'd get together on Saturday, have lunch, then work on
    GitHub. We wanted a pretty and simple way to share Git repositories.
    Something we'd use. Something that would make it easier for us to
    share and work on open source.

    Now we have three people working on the site full time, thousands of
    paying users, and tens of thousands of repositories.

    But it wasn't an overnight eureka, and it wasn't intentional. I
    didn't just walk out of high school, pick up a Ruby book, meet Tom and
    PJ, then launch the site GitHub. Before GitHub came, in chronological
    order, Spyc, Ozimodo, my ozmm.org tumblelog, ftpd.rb, Choice, Err the
    Blog, acts_as_textiled, Cheat!, acts_as_cached, Mofo, Subtlety,
    cache_fu, Sexy Migrations, Gibberish, nginx_config_generator, fixture
    scenarios builder, Sake, Ambition, and Facebox. And that's just the
    stuff I released.

    The more side projects I had, the more I felt the pain of maintaining
    open source code.

    If you already have a job you love, this doesn't exclude you. You
    probably use, day to day, many side projects from others. You can
    also use your own side projects at your job. From Emacs configs to
    simple web services, there are a ton of things you can do to stretch
    your brain.

    I had no intention of leaving Chowhound when I wrote Cheat - I just
    wanted to make it easier to look up commands I rarely used. Things
    like TwitPic or Twictures have nothing to do with anyone's job,
    they're just fun and make life on the Internet a little bit more
    enjoyable. Ruby on Rails may have a financial angle, but if there's
    money to be made in Shoes I'm not sure I see it.

    My plea to you today is to start a side project. Scratch your own
    itch. Be creative. Share something with the world, or keep it to
    yourself.

    Side projects are less masturbatory than reading RSS, often more
    useful than MobileMe, more educational than the comments on Reddit,
    and usually more fun than listening to keynotes.

    Thank you.