Working Remotely? Thinking about it?

Are you a member of a geographically dispersed team? Are you thinking of working remotely, or hiring remote developers? Wide Teams is my new blog and podcast for distributed teams. Check it out for getting started guides, tips and best practices, news, interviews, screencasts, and more all about working remotely and collaborating with wide-spread teams.

Open for business!

2010 June 11
by avdi

I am pleased to announce that ShipRise LLC, my consulting company, is now accepting work effective immediately. I am available for services including:

  • Ruby on Rails Application Development. I’ve been writing Ruby code for almost ten years, and Rails applications since 2007. Whether it’s a building a green-field app or evolving an existing application, I can add value quickly, pragmatically, and sustainably.
  • Hard Problems. Do you have a problem that goes beyond the typical web application stack? Need to build a distributed service, or interface with legacy systems? Talk to me. I have experience with everything from resource-constrained embedded systems, to high performance IP networking middleware, to cloud-based distributed processing and more.
  • Dispersed team facilitation. I’ve been managing and working with widely distributed teams for years. And I’ve talked with numerous distributed teams about how they do remote work effectively. If you have a distributed team or are thinking of creating one, I can help you make it work.

If you’ve ever benefited from my writing, Open Source work, or talks I’d really appreciate it if you’d help me out by by telling your friends, retweeting this post, etc. Thanks!

UPDATE: For anyone who is wondering, yes, I am still working with We Are Titans as well.

Bookmark and Share

Announcing Wide Teams

2010 June 7
by avdi

Just in time for RailsConf 2010, I’m very pleased to introduce my new project: Wide Teams – the blog for geographically dispersed organizations.

This site has been a dream of mine for a long time. I’ve worked with geographically distributed teams for a few years now, and this what I’ve observed: more and more software companies are embracing remote work, but there is no dedicated space for sharing stories, best practices, and lessons learned. Wide teams is an effort to fill this gap. I’ll be sharing what I’ve learned, but more importantly I’ll be gathering and sharing the experiences of other remote workers and leaders of distributed teams.

To kick off the knowledge sharing, I’ll be wandering the halls of RailsConf all week, microphone in hand and silly hat on my head, collecting stories from anyone who will talk to me. I’ll be looking for any and all experiences with remote work – successes, failures, and everything in between. These interviews will be published over the coming months in the form of a podcast.

If you are interested in the world of dispersed teams, I hope you’ll visit the blog, subscribe to the RSS feed, and follow the @wideteams account on Twitter. And if you’re at RailsConf and see me, please do introduce yourself!

Bookmark and Share

YAGNI: Answers to some common objections to dropping out

2010 May 27
tags:
by avdi

As a follow-up to this post, here are some common objections to the argument that a young software developer is better off dropping out. (For the uninitiated, YAGNI is short for You Aren’t Gonna Need It. It is one of the core principles of the eXtreme Programming methodology)

First, some numbers: $28,080 (or the price of a brand-new top-of-the-line Prius) is the average four-year tuition at a state school as of 2010. $105,092 (or the price of owning a starter home free and clear) is the average cost of tuition at a private university. Let’s split the difference and say $67,000 is the monetary cost of a four-year degree.

EDIT: One commenter objects to the use of the median number $67,700 in this article. If you have the same problem, I invite you to replace every instance of “$67,000″ with either of the numbers cited above, or simply with the phrase “a metric fuckload of moolah”. My arguments stand regardless of which figure you use.
Now, on to the objections.

Most people won’t get the educational equivalent of four years of concentrated focus on algorithms, OO design, performance analysis, compiler design, etc. while on the job.

There are a few fallacies going into this argument.

First, I’ve spoken to dozens of developers about their college educations, and the universal consensus has been that once in the working world, they only used a fraction of what they learned in college – and then needed to learn many more things that hadn’t been on the curriculum. Let’s be charitable and say that you’ll use 10% of what you learned in school on the job. 10% of four years, that’s, let’s see, 21 weeks worth of schooling.

So what we’re really asking is whether it’s possible to get the equivalent of five months of higher education on the job. It starts to seem a little more reasonable, doesn’t it?

Second is a fallacy that I run into constantly in education discussions. It’s the idea that the time it takes to learn a new skill is constant, regardless of context. It’s exemplified by the argument “that took me six months to learn when I was in school, so if you haven’t spent six months on it, you haven’t really learned it”.

But this simply isn’t true. Graduates can (and do) come out of school with a still-hazy understanding of how Object-Oriented design applies to real-world problems. But give them three months with a team of more experienced developers writing software to manage a nationwide logistics system, and they’ll know the subject backwards and forwards. You can learn more in a week of watching an expert engineer dissect and address a problem than you can in a whole semester of lecture and canned exercises.

Finally, the implication with this objection is that while it may be possible to get educated on the job, most developers simply won’t avail themselves of the opportunity and will remain at a disorganized code-monkey state of ability.

My answer to this is simple: such developers probably wouldn’t have integrated more knowledge if they had finished a four-year program, and they don’t belong on my team or any team that wants to ship quality software. Period.

Ask any senior developer what they look for in a job candidate, and I guarantee that one of their top three attributes will be “a fast learner”. The nature of this industry is that if you want to stay on the cutting edge, you have to effectively re-learn everything you know every five years. If you can’t or won’t learn the ropes on your own initiative, chances are you’re not going to keep up when the game changes in five years. Better to get out of the game now.

Maybe you can learn most skills on the job, but what about the fundamentals of computing? A great professor can give you a solid foundation that you might miss in haphazard just-in-time learning.

The one course that I’ve seen consistently remembered as a important or even life-changing by CS grads is the introductory course based on Structure and Interpretation of Computer Programs, aka the Wizard Book. As it happens, both the book and video of the lectures by the authors are available online for free, along with much of MIT’s other courseware. Problem solved.

Which reminds me, I really need to pick up watching those videos again…

Even if it doesn’t do much for your career, college is a unique experience which grows your perspectives and knowledge of yourself.

There are any number of things you could choose to do upon graduating high school. Here are a few ideas:

  • Join the Peace Corp, and do humanitarian work overseas.
  • Hitchhike around the country, couch-surfing and busking on street corners with a guitar and a harmonica.
  • Take a job on a farm. Sling hay bales, deliver calves, and go line-dancing on the weekends.
  • Backpack across Europe.
  • Go to college.

Any of these choices will expand your horizons, introduce you to new people, and teach you more about yourself. Only one of them will cost you $67,000.

The notion that college is a way to broaden your perspective early in life is absolutely true. The idea that it’s the only way is silly. It’s certainly not the cheapest way.

College is an important social experience.

We’re a little off-track now, since the question at hand is whether college is a worthwhile preparation for a programming career, not whether it will get you laid. But it’s true that this is my biggest regret in not going to a four-year school. I’m frankly envious of the college social experiences a lot of my peers had while I was working.

But if you’re making this argument, it behooves you to at least be honest about it: you’re telling a student to spend $67,000 over four years in order to socialize. Is it worth it?

Conclusion

What I hope you take away from these articles is that the decision to go to college, like any other major life decision, should be subject to a cost/benefit analysis. I’ve done the math for my particular industry, and found the argument for getting a degree wanting. On the benefit side you have a marginal amount of work preparedness, all of which could be gathered in other ways; and an increasingly irrelevant piece of paper. On the cost side you have tens of thousands either in out-of-pocket cost or student loan debt, plus four years time, salary, networking, and vital hands-on experience lost. It just doesn’t add up.

Bookmark and Share

Turn on, tune in, drop out

2010 May 24
by avdi

Turn On Tune In Drop Out

Seth Godin:

Why do colleges send millions (!) of undifferentiated pieces of junk mail to high school students [...]? Biggest reason: So the schools can reject more applicants. The more applicants they reject, the higher they rank in US News and other rankings. [...] Why bother making your education more useful if you can more easily make it appearto be more useful?[...] a degree (from one of those famous schools, with or without a football team) doesn’t translate into significantly better career opportunities, a better job or more happiness than a degree from a cheaper institution.[...] A lot of these ills are the result of uniform accreditation programs that have pushed high-cost, low-reward policies on institutions and rewarded schools that churn out young wanna-be professors instead of experiences that turn out leaders and problem-solvers.

[...]there are tons of ways to get a cheap, liberal education, one that exposes you to the world, permits you to have significant interactions with people who matter and to learn to make a difference (start here). Most of these ways, though, aren’t heavily marketed nor do they involve going to a tradition-steeped two-hundred-year old institution with a wrestling team.

Tim Cavanaugh:

Student borrowing has more than doubled since the end of the 20th century, according to the College Board, with $85 billion in loans in 2008, up from $41 billion in 1998. And as the rising rate of defaults indicates, borrowers in aggregate are not making the kind of mone–i.e. twice as much as a decade ago–they would need to pay those loans back [....] we have too much money going into an asset, not enough value coming out, a massive increase in leverage, and a large taxpayer liability for the difference. [...]The traditional university of ivied walls, lecture halls, and full-dress balls is heading for a crisis. [...] If diplomas are going to continue costing more and losing value, then at least the customers should have more choice when shopping around for them.

Giles Bowkett:

Wages have not risen since the 1970s for workers with college degrees. Wages have diminished since the 70s for workers without college degrees. However, in that same period of time, CEO pay has gone from 40 times worker pay to 500 times worker pay. What’s happening here is class distinctions growing tremendously, and in a society where class distinctions matter a great deal, the perceived value of a college degree skyrockets, even as the economic advantage that it used to give you deteriorates into nothing. In a society where social class and family background can profoundly distort economic achievement, a mark of prestige like a college degree goes way up in price, because without it, you’re just a member of the working class. (Oh noez!) Colleges are selling liferafts on a sinking ship, and that gives them a license to print money.

Dave Troy:

The unrelenting message is, “If you don’t go to college, you won’t be successful.” [...]

There’s no doubt that everyone is different; not everyone is suited for the same kind of work — thankfully. But western society has perverted that simple beautiful fact — and the questions it prompts about college education — into “Not everyone is cut out for college,” as though college was the pinnacle of achievement, and everybody else has to work on Diesel engines or be a blacksmith. Because mechanics and artists are valuable too.

That line of thinking is the most cynical, evil load of horse-shit to ever fall out of our educational system. Real-life learning is not linear. It can be cyclical and progressive and it takes side-trips, U-turns, mistakes, and apprenticeships to experience everything our humanity offers us.

The notion that a college education is a safety net that people must have in order to avoid a life of destitution, that “it makes it more likely that you will always have a job” is also utterly cynical, and uses fear to scare people into not relying on themselves. Young people should be confident and self-reliant, not told that they will fail.

I have a an admitted bias in this discussion. My only higher education experience was a few part-time semesters of community college. I started writing software full-time at age 18, when most of my peers were entering college.

For years I felt guilty about that. Everyone advised me to get back into school at my earliest opportunity. My bosses freely admitted that while I was working above my grade, they were unable to promote me because I didn’t have a degree. At one point I even enrolled in a continuing education school, and almost immediately got a massive pay raise on the mere prospect that I was going to go “legitimate” and get the piece of paper stating that I knew how to do the job I’d been performing for years. Meanwhile, I learned more about the practice of software development from books, free online resources, and hands-on experience than the college fresh-outs had learned in four years of school.

All this time my advice to aspiring developers was still to ignore my example and finish school.

Then one day I took a good long look at my career and realized that while I had an immense amount of respect for the people who were telling me to get my degree, I didn’t envy their careers in the slightest. I realized that the one thing a degree would buy me was a management-track career in the sort of organization that discriminates against employees because of a piece of paper. I also noticed that the kids who were going to school were coming out saddled with student loans that they would spend the next couple decades repaying. With the economy going down the tubes as a result of a credit crisis, this started to seem like less and less of an auspicious way to start out a career.

I realized, too, that my time was limited, and that any after-hours time I spent in classes and on homework was time I wasn’t going to be spending attending users groups, writing Open Source software, and networking. And that it was those latter activities that were measurably more likely to move my career forward in the direction I wanted it to take.

I dropped all pretense of “going back to school someday”. Instead I focused on contributing the software community, building my network of contacts, and becoming the best at my craft. The results of this strategy speak for themselves: for the past several years I have enjoyed steadily increasing job satisfaction, worked with amazing people, enjoyed community recognition, and realized my dreams of working from home, surrounded by my family.

Today my advice to a young developer who is passionate about building great software is to drop out. Spend your time learning by doing, attending your local users groups, participating in mailing lists, contributing patches to Open Source software. Don’t learn to write software and work in teams; write software, and build teams. The paid work will come to you.

Of course, this only applies if you want a career like mine. If you want to do pure CS research, stay in school. If you want to work for a larger, older organization (including Google), get that degree. And if you’re only in a CS program because you heard there’s good money in software, well, frankly you should get the hell out of this industry and find something you genuinely enjoy. There are plenty of software wage-slaves in the developing world who would be happy to do a mediocre job at a fraction of the salary you’re expecting to earn.

Of course, YMMV. Results are not guaranteed. Consult your doctor, therapist, or priest to determine if this path is right for you. Just remember that your elders are coming from a time when having a degree was actually correlated with having a better life.

On the larger question of how to improve the education situation, I agree with Dave Troy and Seth Godin that we need new models of education, not simply reform of colleges. Toward that end, signs point to apprenticeship as the most promising model to build on. I’ve been hearing of more and more forward-thinking software companies embracing apprenticeship, and I think it’s a move in the right direction.

I don’t know how applicable my path or the apprenticeship model is to fields outside of software development. Giles Bowkett is right that the accredited college system isn’t just going to fade away into irrelevance. But in true Internet fashion, I look forward to seeing alternative approaches route around the establishment entirely.

UPDATE: John Trupiano points me to a related post about the sense of entitlement that often comes along with a CS degree. I think what we’re seeing here is a generational clash: the old rules about greater education automatically conferring an elevated position simply don’t apply to this industry. Unfortunately, like light from a dead star the messages young developers get are still coming from that old, vanished world. One of my motivations in writing this article is that I’ve noticed while most people in the industry recognize this shift, few will come right out and tell aspiring programmers that they’d be better off dropping out.


Bookmark and Share

Ruby Tempfiles in Depth

2010 May 20
by avdi

I have an article about using temp files in Ruby up at the brand spanking new We Are Titans website. I cover some features of the Tempfile class that you may not know about.

In other news, there is still time to submit an entry to my Ruby Challenge! You know you’ve always wanted to implement your very own Interactive Fiction engine, and now’s your chance! All the instructions are on Github.

Bookmark and Share

Quickie Objects in Ruby

2010 May 12
by avdi

Sometimes you need a quick object one-off object. Maybe you’re writing a Fake Object that needs to mimic a subset of a real library’s functionality. Ruby provides several facilities which make it easy to throw together objects without the ceremony of writing a dedicated class.

OpenStruct

If all you need is an object which responds to certain accessor calls with known values, OpenStruct may be the way to go:

require 'ostruct'
photo = OpenStruct.new(:title => "Bad Wolf Bay")
photo.title                     # => "Bad Wolf Bay"

Just be aware that OpenStruct objects are so forgiving they may not flag a typo the way you might expect:

photo.tiitle                    # => nil

Object

If all you need is an object with a few custom methods, you can use plain old Object. You can then adorn the blank object with singleton methods until it has the desired behavior:

flickr = Object.new
def flickr.people() {'rosetyler' => OpenStruct.new(:nsid => 123)} end
flickr.people                   # => {"rosetyler"=>#}

If you are using ActiveSupport, you may find it convenient to use #returning to build your quickie objects:

flickr = returning(Object.new) do |f|
  def f.people() {'rosetyler' => OpenStruct.new(:nsid => 123)} end
end
flickr.people['rosetyler'].nsid # => 123

Singleton Classes

If you want to do more extensive customization of your one-shot object, an alternative to singleton method definition is to use a singleton class definition:

people = returning(Object.new) do |p|
  class < < p
    attr_accessor :by_name
    def find_by_username(name) @by_name[name] end
  end
  p.by_name = {'rosetyler' => OpenStruct.new(:nsid => 123)}
end
people.find_by_username('rosetyler') # => #

Here we’re customizing the singleton class (or “eigenclass”) associated with an individual object.

All together now

Here’s some code I wrote yesterday which uses all three of these techniques to fake out a small subset of the FlickrFu library API:

  def make_fake_flickr
    returning(Object.new) do |f|
      def f.people() @people ||= {'rosetyler' => OpenStruct.new(:nsid => 123)} end
      def f.photosets() @photosets ||= {123 => [OpenStruct.new(:title => "Bad Wolf Bay")]} end
      class < < f.people
        def find_by_username(name) self[name] end
      end
      class << f.photosets
        def get_list(attrs) self[attrs[:user_id]] end
      end
    end
  end

Note how in this example I'm tacking extra methods onto Hashes as well as plain Objects.

Conclusion

While not quite as easy as building literal arrays and hashes, Ruby lets you create quick single-use objects with little hassle. If you are only going to use an object in one place, consider eschewing a class definition and just instantiating a singleton.

Bookmark and Share

Thoughts on the Dell Studio XPS 16

2010 May 10
by avdi

Rails Camp New England - Winter 2010

Soon after starting work with We Are Titans it became clear that my much-loved but aging Inspiron 9300 (seen above) wasn’t up to the task of modern distributed Rails development. There’s just so much a single core and 2GB of RAM can do, and running parallelized tests while remote-pairing over VNC and Skype was too much to ask of it. So Evan asked me to spec out a new workstation and after some research I settled on the Dell Studio XPS 16.

Dell Studio XPS 16

At Devver I had been working on a Dell Latitude E6500, a rock-steady workhorse of a machine that I can unreservedly recommend. I considered going with the updated E6510, but ultimately the XPS 16 hit a bang-for-the-buck sweet spot that I couldn’t turn down. After a month of use I thought I’d jot down a few notes.

First Impressions

This is a gorgeous machine, by Dell standards. By PC standards, for that matter. Dell has historically been one to take essentially solid hardware and wrap it in an eye-searingly ugly, low-quality skin. Case in point the Inspiron 9300 pictured above; there’s a reason I covered it in stickers. Even the aforementioned E6500, despite being from their higher-end business line, had a foil Dell logo which snagged, peeled, and gouged a bloody gash on my hand after the first day of use.

The XPS 16, by contrast, is, dare I say, practically stylish. It’s still not MacBook-pretty, but it’s far closer to Apple levels of hardware beauty than anything Dell I’ve owned previously. The glossy skin is sleek and unmarred by any trashy HP-style graffiti. And the brushed aluminum highlights are a nice but not overdone touch. No silver-painted plastic or instantly-scratched logos to be seen on this machine.

It also feels quite solid, as solid as the E6500. My basic test of laptop quality is screen hinge stiffness, and the hinge on this machine has very little give and easily lifts the keyboard up when the screen is pushed back. The only questionable aspect of the physical design is the lack of a screen latch. Instead, the screen is closed through hinge friction alone. In practice this seems to work well; it just takes a little getting used to, not having to slide or press a latch to open it.

The display is a work of art; more on that later. And the keyboard is one of the new-style thin-key jobs, similar to newer Apple keyboards. I like the feel of it almost as much as my old Apple wireless keyboard; which is to say I like it very much. The keyboard is also backlit, which ever since I used a MacBook is one of my basic requirements in a laptop.

Linux Compatibility

Like most Dell hardware – and this is why I buy Dell almost exclusively these days – Ubuntu Lucid Lynx took to this machine with very few problems. I had to use a development version of the sound drivers to get the headphone jack to work. And I needed to run an xinput script to make two-finger scrolling work on the trackpad. I’m still having some occasional issues with drive errors, and sometimes the wi-fi fails to start until I reboot; but for the most part it’s been smooth sailing. Even the ATI graphics, something I had initially been worried about, is supported flawlessly. It’s been fun checking out the state of 3D-accelerated gaming on Linux with a machine that can actually handle it.

Vs. a MacBook Pro

I’m not going to do an exhaustive comparison here, nor is it my goal to convince anyone to buy this machine over a MacBook. There are lots of persuasive reasons to go with the MacBook, not the least of which that MacBooks come with Mac OS X and if that’s the OS you’re comfortable with that’s probably what you should stick with. That said, there are a couple of features which make this machine stand out when compared to the current crop of MacBooks.

  1. The display. My XPS 16 came with Dell’s 16″ full HD 1920×1080 RGBLED display. This display, unlike common WLED displays (including the ones found in MacBooks) can achieve 100% color reproduction. It’s also sharp as a tack and just generally looks terrific. If you care about that sort of thing, it’s probably the finest laptop display money can buy right now. A word of warning, though: Dell is experiencing supply problems on the RGBLED displays, and last I checked it was no longer available with i7 models of the XPS 16.
  2. The CPU.The XPS 16 is available with the Intel i7 720QM CPU. The 720QM has four cores and is can run a maximum of eight threads in parallel (with hyperthreading). The MacBook Pro’s 620QM, by contrast, is a two-core CPU which can achieve higher peak speeds in terms of MGHz, but only run four simultaneous threads. If you are doing work with a high degree of parallelization – if, for instance, you are running your test suite with Hydra – the 720 is the better CPU.

Conclusion

It’s a stylish, Linux-friendly laptop which at ~$1600 has better specs than a top-of-the-line MacBook. All in all, I’m very happy with the Studio XPS 16.

Bookmark and Share

There Ain’t No Such Thing As a Free Dinner

2010 May 4
by avdi

Recently I was contacted by a recruiter for a prominent West Coast startup. As I was scanning over the “about our company” blurb provided by the recruiter, my eyes stopped on the phrase “…free lunch and dinner“. I knew at that moment it was probably not a company I wanted to work for.

I’m sure they intended it as a perk. “We feed our employees, just like Google!”. But what “free dinner” says to me is “our employees are expected to work straight through dinner”. Which might sound fine if you’re fresh out of college and looking for experience. But to me and, I suspect, to a growing number of the developers I know, it sounds like a recipe for burnout.

I’m not willing to trade in my family life for a quick buck. And I’m not sure that the teams which have decided to make that trade-off are doing themselves any favors. Unless your plan is to be bought out quickly and leave someone else to pick up the pieces, a sustainable development pace will win every time.

Which brings me to We Are Titans, my new employer. I’ve known Evan Light, c-owner of WAT, for a few years now. We originally met and became friends at RubyFringe, where we were both powerfully moved by Damian Katz‘ talk about pursuing his dreams while also supporting a family. More than any other developer I know, Evan and I see eye-to-eye about the importance of making work one of the pillars supporting the realization of your higher goals, instead of of a competing interest. As a result, WAT gets the importance of family and community in fundamental ways: for instance, by not expecting talent to pick up and move to the other side of the country for the sake of their work.

This afternoon I was sitting in my back yard, cradling my newborn daughter in one arm while talking on the phone to Evan about company t-shirts. I asked for one for each member of the family – all six of us. In some companies this would be a loyalty stunt. But I wanted the shirts for a different reason. I wanted them because at WAT, for the first time, I feel like my whole family has a place at the table.

Bookmark and Share

Ruby Programming Challenge for Newbies

2010 April 28
tags: ,
by avdi

My challenge is up at the RubyLearning Blog. I chose Interactive Fiction as my theme. While the title says “for newbies”, I hope that Rubyists of any skill level will enjoy taking a crack at it; I certainly enjoyed writing my own solution. I’m looking forward to seeing the submissions!

Bookmark and Share

Pair Programming is like Having a Copilot

2010 April 27
by avdi

A common client objection to pair programming is that the project isn’t big enough for two people. The assumption being that more programmers means more work accomplished (at greater cost).

It occurred to me today that perhaps the best response to this is to make the comparison to the pilot/copilot system in aviation. It’s not that the extra pilot gets you to the destination any faster. It’s that the chances of crashing and burning along the way are drastically reduced.

Of course, in software, the presence of a pair partner generally does accelerate progress. But that’s not the purpose, it’s just a bonus.

Bookmark and Share