Next

After nearly three years, last Friday was my last day at Getty Images. The time had come to move on to the next challenge. It was time to change direction and take some control for myself.

Last February was my five year anniversary from leaving Microsoft. When I left, my dream was to start my own company. The same dream is there but what it looks like has changed dramatically since 2005. I expected to build a desktop applications. People like Brent Simmons and Gus Mueller were my models. They ran successful indie software business on the Mac and built amazing applications. I experimented with some ideas that never went anywhere. So instead, I pursued another interest in open source software by joining Source Labs. That began a series of jobs at startups with varying degrees of success. It all reached an implosion at Jobster, a prime example of the decaying dot com mentality. Despite the lack of success at startups, I was gaining a new insight into another passion - the web. The single biggest gift Jobster gave me was Ruby on Rails. I was in the right place at the right time. Rails was just taking off and Jobster had jumped on board early.

Rails began to show me a new path. My thoughts were now entirely on the web. Rails was a tool that made creation of a new class of applications easy. I had done some of the large machinery that sits behind frameworks like Rails. But this was the link I needed to what I had done at Microsoft and what I wanted to do. My goal was no longer to build desktop applications but to build great web services.

I landed at Getty Images in 2007. I was feeling pretty destroyed from my tour of the startup world. I was tired of empty promises and working for 8 months on software that went into the toilet. I wanted to accomplish something instead of vaporware. I was fortunate to work on a skunkworks Rails project my friend Jeff Johnston had started. Together with a small team, we built a portal that opened up a new way for Getty to work with their artists. We shipped it. It succeeded. It was fantastic. We were rewarded with the Flickr integration project where we provided the bridge between Flickr and Getty Images - a new market and a pairing of the old with the new. We again launched and in most ways, we succeeded. But it was costly to me personally. It was a death march unlike any I had done since my earliest days of SQL Server. I felt beaten down by the project and in many ways never felt the pride or satisfaction I should have.

A lot changed after that. The team became very different, our role changed too. When I joined the team, I was the only one with any significant Rails experience. Now we had a team that had launched three major apps on Rails. In many ways, I had outgrown my usefulness for the team. We always like to think we are way more important than we really are. That has hit home these past few days. I decided it was time to do something else.

When I surveyed what was out there, I found I just couldn’t get excited about joining up with another startup whose ambitions had no grounding in reality. And I could not stomach going back to a large company and dealing with the complexities of modern corporations. Mobile applications have moved front and center. I got serious about iPhone development and took a side contract to build an application. That sparked the last connection - linking mobile with web services. Blurring the line between local and cloud or whatever you wish to call it. I loved that one person could again build the whole thing. I could fit the app in my head. I wrote UI code. It was exciting and different. I did this for a few months. Soon other project opportunities emerged. I decided this is what I wanted to spend my time on.

So now I’m an independent developer. I formed my own web development firm Source Blueprints, LLC. I’m doing contract projects using the technology I want. I’ve got some jobs to get started. I’ve been amazed at how many people have come forth with interesting ideas.

I have a new set of goals. I want to build a small team of developers with the same focus. My model is the way 37signals works. I have some ideas I want to build. It’s easier than ever to bootstrap yourself. That’s what I want to do. Balance contract work with building my own creations. No endless meetings, no commute. I want to look at my day and feel like I did something. I want to write code not talk about it. And I hope to have a better balance between work and life.

This is the dream anyway. The reality can be much more harsh. Right now, it’s a good time to be available as an independent. A gold rush is underway in mobile. It is actually driving down the price though. There is a dot com bubble forming. There will be a crash. Too many hacks are muddying the waters right now. But I’m confident in my skills and my experience. I’m avoiding the stuff that is purely derivative. I’m looking for the projects that mix both web and mobile. Those are more likely to succeed. I won’t do the cookie cutter apps nor the “anyone can be a developer” tools. That’s not the work I want.

I’m going into this with my eyes open. I can’t say what tomorrow will be. But I’ve been through multiple “revolutions” now. In many ways, I’ve done it all and heard it all. I’m going to focus on what I want now. That applies to the work and it applies to taking back my time. I know I’ll now be home much more to see my daughter. And that’s more important to me than anything else right now.

Jul 12 » permalink
RailsConf 2010 Day 3

I’m a few days late posting my wrap up of the final day of RailsConf. Traveling and getting back home delayed it.

Keynote

“Uncle Bob” Martin gave the morning keynote titled Twenty-Five Zeros. The premise of the speech was built on the notion that hardware has advanced by extraordinary amounts while software hasn’t kept pace. Mr. Martin states that we are writing code today that is not very different from the first FORTRAN programs 50 years ago. As he stated it, “sequence, selection, iteration” form the basis for programming both then and now. Objects and other innovations still fundamentally use the same pattern.

I’d agree that hardware advances have dwarfed software. And I also agree with the premise that Moore’s Law is likely dead. Advances will need to be driven from the software side rather than hardware. But I did find his apparent dissatisfaction with using fundamentals from 1957 questionable. To me, these represent basic truths in programming. Computer hardware is still built on the same digital fundamentals as well. We’ve gone from transistors to solid state. That doesn’t mean that 1’s and 0’s are fundamentally wrong. Or that logic networks or any of the other basics that form computer hardware.

I think he may have meant his talk to be a rallying cry. To me, it seemed like it was a misguided critique that didn’t apply. I also find the whole “Uncle Bob” schtick annoying.

Migrating Plugins and Gems to Rails 3

The first talk of the day I attended was Clinton Nixon of Vigent Labs on plugins and gems in Rails 3. The talk covered highlights of what gem authors should do to get their gem on Rails 3. In particular, there are some new locations you should be putting things like generators and rake tasks, using Rails.* instead of RAILS_*, and adapting to using Thor instead of Rubigen. One obvious piece of advice is to convert plugins to gems. I think everyone knows this but it’s always a question of whether it is worth the effort to take an old plugin and get it into a gem.

The second part of Clinton’s talk was a case study for migrating the Rails footnotes gem. It seemed like most of the problems for this gem were caused by how it was injecting itself into the core of Rails. I think this case was a bit extreme in that most gems don’t touch Rails at such a low level. Nevertheless, it was an enlightening exercise to see how to take a complex gem and get it on Rails 3.

I’ve begun to question relying on gems and plugins at all. This talk just reinforced it. The best case is to have no gem to upgrade. I’m not saying “don’t use gems”. Rather, I feel like the smarter course of action is to use a gem as a last resort.

Rails Next Top Model

Adam Keys presented a talk on ActiveModel and ActiveRelation. These are two very important additions to Rails 3. ActiveModel represents much of the ActiveRecord DSL in a form that you could apply to a pure Ruby object easily. This means you can hook in validations (validates_presence_of, etc.) and serialization. You also can use your ActiveModel classes easily in ActionView forms.

ActiveRelation (Arel) adds the new predicate syntax. It also provides the dynamic finder DSL seen in ActiveRecord. Like ActiveModel, this is another module you could apply to pure Ruby objects. In both ActiveModel and Arel, you include the modules in your code instead of deriving from a base like ActiveRecord. I have a couple ideas in mind for exposing some of our legacy systems as ActiveModels.

Agile the Pivotal Way

The last talk I attended was a presentation by Ian McFarland on how Pivotal Labs does agile. I wasn’t sure what the talk would be like but we do agile/scrum at my job. It’s not always been the smoothest process. I was curious to see how an experienced agile firm like Pivotal does it.

Pivotal is heavily into pairing (maybe even exclusively pairing). They even go so far as to eliminate personal workspace and create nothing but pairing stations. Part of me thinks this is crazy yet I can see the value. I’ve been at this for 15 years so I’m willing to admit my reluctance could be just as much ingrained habit as real rejection of the notion. Lately, our team has been doing this on their own. About half our team has effectively left their personal workspace in preference to a side-by-side setup for more effective pairing.

I liked that Pivotal seems to make a strong effort to serve their employees. They run an in-house tech library. They have lots of useable displays in conference rooms for meetings. They keep a build monitor up so everyone can always see the state of the continuous integration server. All good stuff.

My key takeaway though was don’t go half way on agile and paring. If you are going to do it, really do it.

Closing Keynote

The closing was given by Gary Vaynerchuck. I had no idea who he was. I do now.

It’s hard to describe his keynote accurately. You should just go watch it (warning - lots of adult language).

Gary is one intense dude. And I think he really is genuine. He is in the same mold as Jason Fried and 37signals. Work hard for your customers, care about what you do. He says all the things you’d love to hear if you are sick of faceless and gutless corporate entities. He’s dynamic and certainly inspiring.

He’s on my short list of someone I’d love to have a beer or three with.

Wrap Up

So there it is. My third RailsConf in the books. Like any conference, there were good and bad sessions. But I love the inspiration I get from being around so many people working on things they care about.

Jun 13 » permalink
RailsConf 2010 Day 2

The second day of RailsConf was another long one. My session choices were more misses than hits today.

Keynote

I didn’t find either the keynote by Neal Ford or Evan Phoenix particularly compelling. Neal Ford riffed on the idea coding as art. They may be some truth to that but I didn’t find it reasonating with the audience. Evan’s keynote was more of a skit. The premise was supposed to be Engine Yard’s usage of open source. That’s certainly not what he talked about.

Million Dollar Mongo

I made a last minute decision to go to Obie Fernandez’s case study of Hashrocket’s application of MongoDB. One of my goals for this conference was to understand the implications of No-SQL solutions. I also respect Obie’s work, particularly his book Rails Way.

The presentation was mostly good. They made a strong case for why they chose MongoDB. They also highlighted political pitfalls they encountered. None of the issues they experienced seemed to be technical. It’s likely common to meet with the kind of resistance they encountered when changing out such a fundamental systme. It is good to know that the technical merits seem to hold up.

The Hashrocket guys ended with a surprise airing of dirty laundry between them and another firm Intridea. While Hashrocket might have some legitimate issues with Intridea, it seemed a rather brash thing to do to call them out publicly at a developer conference. I don’t care much for the soap-opera stuff.

I skipped the RVM talk to go to this one. I think that was still the right thing to do. Wayne has done such an amazing job with his documentation and support, I didn’t feel I needed to go the session.

Redis, Rails, and Resque

Next up was Chris Wanstrath’s talk on how GitHub uses Redis, Rails, and Resque. It was a good talk. But Chris really needs to calm down. He goes at breakneck speed and without slides. So I was furiously making notes as he was flying along.

Chris did a great job in setting up the parts and what they are used for. Redis looks like a fantastic piece of software. If the performance is anywhere near memcache, Redis is a much better solution than memcache.

He spent a fair amount of time discussion Unicorn. I was a little surprised by that until he connected it up with how Resque works. They both have similar philosophies in that they leverage Unix. They handle child processes in very similar fashion.

Chris explained how GitHub had used Delayed Job (which we use currently). He highlighted the issues they had with it (which we have also seen to a small degree). The management piece and the dependency on SQL seemed to be the two biggest reasons they moved off Delayed Job.

Their current solution is to use Resque. Resque is very light in that it is a thin wrapper around the Redis API. In particular, I really liked the concept of using named queues over priorities. We absolutely could use that right now. We had issues with how priorities are implemented in Delayed Job. Consequently, we don’t use priority despite the fact we really need it.

Resque is a master process that forks child processes to run the jobs. This means each job runs in its own clean process space. That’s a very good characteristic.

Resque uses a plugins interface that allows the user to define much of the job capabilities.

I don’t like the idea of swapping out our background processing yet again but I think it will only be a matter of time before we move to Redis/Resque.

Cassandra & CassandraObject

The next talk I went to was Michael Koziarski’s presentation on Cassandra. I was interested in finding out what Cassandra is about compared to MongoDB. It has a very nice distribution model that allows you to introduce fault tolerance into the store. Depending on the configuration, any key you add to the store can be in 1 or more nodes. Consistency can be simply recording it on one node to using a quorum to determine the correct value. It seems a little like RAID for your key value store.

While I liked the architecture, I didn’t like the way data is structured. This is not a document system like Mongo or Couch. It defines a columns concept that is not the same as relational. It’s more of a two level JSON object.

Cassandra on the surface doesn’t fit the usage we would need. MongoDB seems like a more logical fit.

Rocket Fueled Cucumbers

Joseph Wilk gave a very good presentation on managing large sets of Cucumber features and what happens when the build time gets large. The primary tips would apply to any test framework, not just cucumber.

  • Development favors speed over confidence
  • Test favors confidence over speed
  • 10 minutes is a good target for a test run
  • Use Spork to help with Rails startup time in cucumber
  • Mock services that are slow
  • Cucover as a coverage aid
  • Run the tests more likely to fail frequently, the ones that never fail less
  • Worry about the tests that matter

Two other interesting tools were highlighted by Joseph. One is Capybara as a better webrat. The other is a javascript environment that doesn’t use a browser called envjs. Both looked like good cucumber aids.

Beyond (No) SQL

Sarah Mei from Pivotal Labs gave what turned out to be a very brief talk on No-SQL vs. relational. While I think she had good knowledge, it was not an indepth talk. It was really databases 101. The tradeoffs between relational and No-SQL was interesting. However, it was not the talk I had hoped it would be.

Lightning Talks

Since the No-SQL talk was so short, I caught part of the lightning talks. It always great to see people talk about projects that they have so much passion about.

Closing Keynote

Derek Sivers (of CD Baby fame) gave an entertaining talk. His personal story and relating how finding a way to work with others is important is a good lesson. He spent a lot of time developing CD Baby himself on a custom PHP framework. That proved difficult to expand with other developers of course. He has come back to looking at Rails seriously. I don’t know that I got much useful information but it as a nice talk nonetheless.

Closing Thoughts

Tomorrow is the closing of the conference. The talks are usually a little more erratic on the last day but I’m hoping to pick up a few things. I haven’t seen much on Javascript. I expected a little more in this area or I managed to miss those talks.

Jun 09 » permalink
RailsConf 2010 Day 1

Keynote

David Heinemeier Hansson and Michael Feathers each spoke at the opening keynote. David’s talk captures what Rails 3 is about. Incremental, steady change. It’s all about improvements and making stuff easier without breaking what has worked well. This was the first time I’ve seen the new ActiveRelation syntax in any detail. It looks like a major improvement.

Here’s a flavor of the new query syntax:

# Chaining works
# SELECT * FROM users WHERE name = "david" LIMIT 20
users = Users.where(:name => "David").limit(20)
users.where("age > 29")

# Lazy execution. Can build up the query until
# a call is made that needs the data!
# SELECT * FROM USERS
# WHERE name = "david" AND age > 29
# ORDER BY name
# LIMIT 20
users.order(:name).each { |user| puts user.name }

There are also nice improvements for the :scope syntax supporting the ActiveRelation syntax. I’m not clear about what happens if you add conflicting conditions.

Another nice improvement is in the routes functionality. RESTful routes are accepted as the norm and the syntax reflects this. It requires more code now to declare a resource route but it makes much more sense:

resources :people do
  resource :avatar

  member do
    get  :republish_deep_links
    post :resend
    put  :accessible_projects, :upload_preferences
  end
end

I find it much easier to understand despite the fact that it is more lines of code.

Finally, David touched on a couple ideas for Rails 3.1. He called out how CSS and Javascript are in the “junk drawer” known as public. These files really deserve to be in the app/ hierarchy. I totally agree. I always find it annoying to search for Javascript and CSS in public. Additionally, he thinks that all javascript and CSS should be compiled into a single file like application.js and application.css. I agree with this as well. Like David said, we are all compiling and minifying Javascript anyway.

Michael Feathers gave the other keynote talk. It was focused on dealing with legacy code. While it is necessary, I didn’t find much in his talk compelling. I did like his advice to “cut your losses”. I agree that often rewriting code can be a better solution than fixing something that is fundamentally flawed.

Builing API’s with Rails

This talk was on building an API for your Rails application. It was a panel format with Joe Ferris (thoughtbot), Jeremy Kemper (37signals), Marcel Molina (Twitter), Rick Olson (GitHub), and Derek Willis (NY Times). Most people seemed disappointed by this session and I would agree. Some of the stuff was pretty obvious to anyone who has built an API. It wasn’t very deep technically. All the panelists emphasized using OAuth. The other takeaway was that versioning is pointless and you should support multiple versions only long enough to get your clients off the old API and onto a new one.

Don’t Repeat Yourself, Repeat Others

John Nunemaker presented a lessons learned talk from his experience building MongoMapper. If anything, it was an enjoyable talk (although John should slow down a bit - he really goes fast). He made some great points about the value of just creating. Reinventing the wheel can be ok if it provides insight you would not otherwise have. The rest of it was pretty standard stuff - apply patterns, understand how dynamic Ruby is, steal from others.

The Present Future of OAuth

Michael Bleigh’s talk was a nice survey of the state of OAuth. OAuth has been on my list of things to review for a long time. It seems like now is the right time to get on board. The most useful metaphor was Michael’s desription of OAuth tokens being like hotel keys. That’s a great analogy. It gets to the heart of what OAuth does - provide limited access for limited time.

I would have like him to touch on OpenID as well. I know they aren’t directly related (OAuth is service to service, OpenID is user identity) but it is interesting to think about a user on your site logging in with his Twitter OpenID and then accessing Twitter via your site via OAuth.

Consuming OAuth seems very easy given there is a gem for it. Acting as a provider is a bit more complicated in that you have to write it yourself. My largest concern is with the flows. These allow for different ways of accessing the site (web server, mobile, device, password, etc). Something about all the flows seem poised to be a problem (6 different flows in the spec).

Bundler

This was the most useful talk of the day for me. I admit I have ignored Bundler for the most part. I have had bundling fatigue after using config.gem and the merb bundler. However, the Bundler gem surprised me. Every question I would ask was answered. It clearly is going to solve our deployment issues. It is also now compatible with RVM which means you can pair the two for creating just the right gems and Ruby interpreter.

Here’s the short list of why I’m excited about bundler:

  • Gemfile as a single manifest (and can be versioned)
  • Dependency resolution before install (so no more conflicting gem versions)
  • Lock version at install time (even if you don’t provide a version)
  • Allow gems to be used directly from git repos (local and remote)
  • bundle install vendor eliminates the need for RPM’s for native gems
  • Multiplatform support (MacOSX for dev and Linux for deploy)
  • Can be used for Rails 2.x

I see no critical downsides in going with Bundler. I’ll be looking to get it in place for our existing 2.3.5 apps soon.

Ruby Tips

Evan Phoenix and Charles Nutter were the presenters in the last session I attended. The talk was fun but honestly not that useful. It dove into some metaprogramming concepts that I haven’t seen the need to use. The threading advice was solid but anyone who’s written threaded programs (Ruby or otherwise) probably knew these tips. I am confused though on how good Ruby 1.9.x (MRI) is at running threads.

Closing Thoughts

As usual, RailsConf was an exciting torrent of information. I’m very experienced now in Ruby and Rails so I don’t get overwhelmed like when I first started with it. Now my brain goes into overdrive as I think about all the ways to leverage the new ideas.

There is certainly a different vibe to this conference. Maybe it is being in Baltimore instead of the west. But it does feel a little more like the rebel is giving way to the pragmatic. I sense more people are more interested in getting things done with Rails and less about changing the world. It’s a natural progression. In many ways Rails 3 reflects this new maturity. It’s still the toolset to beat. I think the second decade of Rails will see many more good things.

Jun 08 » permalink
RailsConf 2010

I’m off to RailsConf in Baltimore. This should be a great conference. Rails 3 will be a centerpiece. I’m particularly looking forward to learing about all the great scalability solutions including Redis and the various No-SQL storage solutions.

I’m going to go to more UI and Javascript talks this year. I’m very experienced on the back end solutions so I want to look at things I don’t know as well. Also plan to explore the test driven talks. I’ve been at odds with both RSpec and Cucumber and would like to overcome that.

I’m going to try out Tumblr for quick posts I come across during the conference. I also plan to do a daily write up.

Jun 07 » permalink

Recent Posts

Archive