Meet David Allen at BizConf 2010

Just a quick update to my readers who might have been on the fence about attending this year's BizConf, coming up August 4th. We're pleased to announce the addition of David Allen (of GTD fame) to our lineup of provocative and educational presenters.

http://www.bizconf.org/presenters/david-allen

David will be presenting a special three-hour workshop to a very small audience in an intimate setting. Chances like this don't come along very often, certainly not at this price.

Registrations have been coming in slowly, but surely. As I write this we're over 60 registrations. Since I'm confident we're going to sell out soon, the time to commit and register is now. Click here to use the coupon code OBIE40 when you register to get a huge $771 discount. Believe me, I know that even with a 40% discount we're still an expensive event, but I promise you it's worth it. Our lineup is superb and the Ritz-Carlton Amelia Island is the nicest conference venue I've ever been to and worth every penny.

Incidentally, some of you might be wondering why we're giving such steep discounts late in the game. The first iteration of our budget was overly optimistic and planned for a healthy profit. As a still young conference, we've lowered our sights to breaking even. Last year we lost a lot of money (more than $40k) on BizConf, but conventional wisdom is that you always lose money in the first year of an ambitious event. Profit should help us get ahead in the years to come, as our reputation solidifies and we build a base of loyal repeat attendees.

July 12, 2010

What Is the Rails Way (To You)?

Back in 2007 as I was finishing the first edition of The Rails Way, I asked you to send me your thoughts on the meaning of the "rails way." I incorporated most of your responses into the book's Afterword, introducing it with the following paragraph:

I love the Ruby community. It’s vibrant, witty, and smart. Truly, our community is one of the best aspects of working with Rails and no small part of its success. As I was nearing completion of this book, I felt a strong urge to include the community in whatever way possible, to give readers a taste of what it’s like, and then it hit me. We all know that there is a Rails way, and yet it is an intensely personal experience, subject to interpretation and joyful exposition. What better way to end the book than with a collection of your thoughts!

Well, it's that time again. The Rails 3 Way is almost finished and I'd like to update the Afterword with new content culled from a much larger and diverse generation of Rails fanatics. Send me your thoughts, poetry, quips... whatever gets the idea across:

What Is the Rails Way (To You)?

Please make sure to get your submission in before July 31 to ensure consideration for the new edition. Thanks!

May 09, 2010

The Self-Destruct File

One of my most important possessions was stolen last night when the Hashrocket office was burglarized: my 17" MacBook Pro, which has had a permanent home on my desk since I got a MacBook Air about a year ago. The thieves also got some of our iMac workstations and a couple of 30" monitors. Today has not been a happy afternoon for me.

The incident (and the subsequent trouble I'm going through pulling SSH keys and changing passwords on everything) has me thinking that perhaps there should be a sort of "self-destruct" file on the desktop. It would have to be named in a honeypot fashion that would seem irresistible to thieves and anyone nosing around your system without your permission. So maybe it would be named "account_numbers.txt" or something like that. When they double clicked it, a series of events would happen. First the computer should turn on the camera and snap a photograph and send it along with IP address and any other information that could be gleaned from the local network. (If the computer was offline, maybe it would wait until it got connectivity?)

Finally, if not disabled within a few seconds in some way that the thief would not be aware of, the computer would delete everything sensitive as well as disabling itself for future use - "bricking itself."

I can't be the first to have had these kinds of thoughts. It sucks big time to get your stuff stolen.

The sad part of this whole affair is that we've normally been very happy-go-lucky and easygoing about guests and even strangers visiting the office. Not to mention all the photos and videos online of us in our offices showing tons of nice equipment. The list of potential suspects is huge and we know we were targeted in particular. This world seems perfectly designed to kill idealism and make you cynical as you grow older.

May 07, 2010

Hashrocket Named One of Top Employers in North Florida

JBJ-Best-Places-to-work-2010-Hashrocket-1

I'll update this post with a link to the JBJ site article once it's available publicly in about 30 days.

Some additional information not included in the article:

  • We actually have about 25 employees based in Jacksonville. If you count everyone involved on a day-to-day basis including contractors at all locations the number is over 40.
  • We offer full match on 401k contributions up to IRS limits, with no vesting period
  • We reimburse monthly gym membership dues
  • We pick up the tab for our weekly happy hour on Wednesdays
  • High-end Apple workstations for everyone

Most importantly, but difficult to state concisely: We have fun on a daily basis because we work on cool projects with awesome clients. Most of our clients are startups and 100% success-focused. They encourage us to work the way we know will bring them the most success, which is why we're able to push the envelope on continuous process improvement. Progressive testing/spec'ing practices, pair programming, agile design, all these are possible because I actively avoid trying to work with clients that have legacy issues, corporate politics, non-cooperative stakeholders, saboteurs, etc.

We should have a real job listings page on our site soon. For the moment, if you're a great web designer or developer and feel like you would fit in at Hashrocket, contact jobs@hashrocket.com - We're hiring!

May 05, 2010

Excellence Is In the Details: GMail EOM

It always gives me such great pleasure when I notice excellent attention to detail in software that I use on a daily basis. In this case, it's a detail that I've noticed before, but never have heard anyone talk about.

Every once in awhile I send someone an email with just a subject line. If you enter a subject in GMail and hit send, you'll get a warning dialog asking if you really want to send without a body.

Gmailalert-1

However, if you follow the convention of suffixing your body-less subject line with the string [eom] and hit send, then GMail doesn't bother prompting you with the warning dialog, because someone on that team knew that EOM stands for "end of message".

Excellence is in the details. They don't always have to be visible or even talked about. In fact, when you discover those great little details in practice it can really be a really delightful and loyalty-building experience.

April 11, 2010

The Rails 3 Way Highlights: ActiveSupport's Class.class_attribute

As I'm wrapping up work on The Rails 3 Way, I'm coming across little nuggets of interesting content suitable for blogging. Time permitting, I'll publish them here over the course of the next few months.


In this case, I cover a new ActiveSupport core extension to Ruby's Class object. It allows creation of class-level attributes in a simple and powerful manner that I think is a lot clearer than the mess of cattr_ and class_inheritable_ methods that precede it.

class_attribute(*attrs)

The class_attribute method declaratively defines one or more class-level attributes whose value is inheritable and overwritable by subclasses and instances, like so:

class Base
  class_attribute :setting
end


class Subclass < Base
end


>> Base.setting = "foo"
=> "foo"


>> Subclass.setting
=> "foo"


>> Subclass.setting = "bar"
=> "bar"


>> Subclass.setting
=> "bar"


>> Base.setting
=> "foo"


This behavior matches normal Ruby method inheritance: think of writing an attribute on a subclass as overriding the parent's reader method. Instances may overwrite the class value in the same way. (Note that the following code samples create anonymous classes to illustrate usage in a more concise fashion.)

klass = Class.new { class_attribute :setting }
object = klass.new


>> klass.setting = "foo
=> "foo"


>> object.setting = "bar"
=> "bar"


>> klass.setting
=> "foo"


To opt out of the instance writer method, pass :instance_writer => false.

klass = Class.new { class_attribute :setting, :instance_writer => false }


>> klass.new.setting
=> NoMethodError


The class_attribute method also works with singleton classes, as can be seen in the following example.

klass = Class.new { class_attribute :setting }


>> klass.singleton_class.setting = "foo"
=> "foo"


For convenience, a query method is defined as well, which allows you to see if an attribute has been set on a particular class instance. 

klass = Class.new { class_attribute :setting }


>> klass.setting?
=> false


>> klass.setting = "foo"
=> "foo"


>> klass.setting?
=> true

March 21, 2010

My RubyConf India 2010 Talk Highlights

Blood-sweat-rails-2010

Hashrocket sponsored the inaugural RubyConf India event primarily to support the nascent, yet growing community of Rubyists here, but also due to my personal love of Indian people and culture. I've been eager to get back to Bangalore for the last couple of years and this was the perfect excuse. I deliberated about what talk to deliver to this audience. At all costs I wanted it to be entertaining and provocative. In my opinion, too many Indian service companies are "doing it wrong" -- they stick to the stereotypical modus operandi of offshore providers, with waterfall processes and fixed bid. I wanted to impress on the audience that there is a better, more fun way to run your business. After opening comments by the organizers and Roy Singham, Chairman of ThoughtWorks, I delivered the second general audience talk.

I was charged up with the right kind of anxious energy and this being material that I know inside and out, it came straight from the heart. The talk was not entirely new, previous versions of it had similar material. However, I did go through and restructure the outline significantly as well as adding new material based on the last 12 months of operations at Hashrocket. Luckily I also added some elements that I knew would appeal to my audience -- slides based on the blockbuster Indian movie "3 Idiots". Little that I know how important the concept of "All Izz Well" would prove to be to myself!

Blood-sweat-rails-2010-1
On a scale of 1 to 10, I would rate myself a 9 on delivery. I was funny and engaging, making eye contact with the audience members and spending much time in storytelling mode. Unfortunately, I would have to deduct points for making the mistake of dropping the "F-bomb" too many times and as a result getting interrupted and vocally dressed-down by Tina Vinod halfway through! Somehow, although nervousness infected my voice and I started forgetting to breathe, I did pat my heart and tell myself audibly "all izz well, all izz well" and charged ahead with my talk -- the audience got a good laugh at that. Other challenges included the organizer mistakenly telling me I was out of time when I actually had at least 15 minutes left! Luckily my Keynote display presenter mode with its timer saved me. I did pick up the pace a bit, but finished in 48 minutes, just 3 minutes over my alloted time.

Reading List

In the section of the talk about Process and Practices, I mentioned that it is necessary to go "by the book" when starting out. Too many people criticize practices that they haven't properly implemented. You must learn to crawl (so-to-speak) before you can evolve your own practices. 

Blood-sweat-rails-2010.005
The list of books I recommended constitute a large part of the orthodoxy of progressive software development nowadays. I asked the audience, how many of you have read at least half of these books. Sadly, only a dozen or so hands (out of 400) shot up. I truly believe that you cannot be effective nowadays without studying these books and applying them to your day to day.

Agile Software Development, Principles, Patterns, and Practices

Agile Retrospectives: Making Good Teams Great

Apprenticeship Patterns: Guidance for the Aspiring Software Craftsman

Design Patterns: Elements of Reusable Object-Oriented Software

Domain-Driven Design: Tackling Complexity in the Heart of Software

Extreme Programming Explained: Embrace Change (2nd Edition)

Refactoring: Improving the Design of Existing Code

Secrets of Consulting: A Guide to Giving and Getting Advice Successfully

Software Craftsmanship: The New Imperative

Test Driven Development: By Example

The Principles of Product Development Flow: Second Generation Lean Product Development

User Stories Applied: For Agile Software Development

Working Effectively with Legacy Code

Blood-sweat-rails-2010.006 After you've mastered the fundamentals, then you can begin to evolve your process and practices to actually achieve the best results for your context. I must have said 20 times during my talk that "context is king."

Blood-sweat-rails-2010.009 

One of my favorite and most controversial pieces of advice, at least based on the feedback and comments that it generated:

"I don't defend breathing... I don't defend Agile. It just is."

I believe unequivocally that the time to be evangelizing and advocating proven Agile techniques is over. It's been at least 10 years since Extreme Programming hit the scene. We know that TDD yields excellent results. We know that pair programming yields excellent results. We won. To continue being in defensive mode against stupidly obstinate management is a waste of time. It may take a long time from now, but eventually people that don't work in smart Agile ways will fail and go away. As for you, concentrate on being excellent, perfecting your craft and building a loyal and devoted group of clients that will provide you with strong references and testimonials.

If you want to put into practice my advice, refuse to work for clients for whom success is not 100% important. This will necessarily exclude most large enterprise clients, where politics and status quo are as important as results. Those types of clients will drag you down and make you compromise your values. Startups and entrepreneurs usually are 100% focused on successful results. These stakeholders will not be worried about your technology choices or whether you want to pair program and do test-first. They will let you do your job, and the way that you sell them on using you is with successful track record, demonstrated by copious amounts of testimonials from previous clients. I stressed the importance of photos and videos to capture the spirit of your success in a vivid and emotional way. We have the technology -- use it!

Blood-sweat-rails-2010.029 

My advice to fire clients if they need to be fired was perhaps shocking. It shouldn't be. I've only had to fire a client a few times in the history of Hashrocket. That's considering a list of now almost 60 happy clients of all shapes and sizes. The key to not having to fire clients, is to not get the wrong clients to begin with. This is known as being able to "choose your clients." It's not as hard at it seems. Sure, when you're starting out it is somewhat difficult to put this advice into effect and you will make mistakes. That's when it's important to have the confidence to cut ties and look for greener pastures.

"Never allow your clients to corrupt your values or integrity."

The worst thing that can possibly happen, more than having money difficulties, is to corrupt yourself by compromising on your values and integrity due to pressure from a bad client. I'm not saying to be inflexible! I'm saying that there are core values that will allow you to reach for excellence and achieve it. You won't know what those values are when you're starting out, but you can be informed by studying the successful results of others and internalizing that knowledge. Then when you're on a roll and doing great work for your clients, you will realize what those core values are. From that moment on, no matter how big the pressure is, you should not compromise. The more confident you are about your way of working, the easier it will be for you to sell your services and acquire quality clients. The last thing you ever want to do is to appear desperate -- at that point great clients will go away running and bad clients, those that will take the worst advantage of you will become very friendly! Never allow your clients to compromise you. Stick to your values and focus on success.

Blood-sweat-rails-2010.076

When I'm evaluating software developers to hire, I don't give much credence to resumes, cover letters, referrals or work history. The only things I care about are work ethic and cultural fit. And there's only one way to determine whether a candidate satisfies my criteria for success -- actually see them in action over the course of a week or more. Since we always pair program, it is trivial to do short contract gigs with qualified candidates and bring them in putting them on multiple real projects. Seeing them working on real code in real situations is very instructional. Again, context is king. Over the course of time, we've created a very desirable work environment at Hashrocket, which means that there is a strong demand for people to come work with us. That means I can diverge easily from traditional hiring models.

Conclusion

Indian business culture, at least the stereotypes that are propagated to the west, doesn't strike me as particularly fun. But if you're doing great work for your clients and sticking to your core values, then you're going to have a lot of success and be able to enjoy it by building a very fun work environment. My final series of slides was a photo set of various fun activities that Hashrocket folks engage in on a regular basis, from participating in user groups, to music and sporting events, games, having parties, drinking and dancing and doing crazy stunts like all jumping into a swimming pool at the same time.

I truly believe that if you're not having fun at work, you're doing it wrong. A happy, healthy environment is one that leads to the best results. However, you can't impose fun on a group by fiat, just like you can't create culture. It has to emerge from hiring happy, progressive folks that want to do the best work possible while sticking to strong core values. This is the final message of my talk and I hope that the audience found it inspiring and worth passing on...

Blood-sweat-rails-2010-2
 

March 02, 2010

2010 Conference and Event Calendar

Despite my honest intention to travel less this year, I still have a particularly long list of conferences and events that I'm attending, sponsoring or otherwise involved with. Will keep this blog entry as up to date as possible as changes occur.

SpeakerConf in Aruba (February 9-11)

Had an awesome time hanging with folks way smarter than me, learned a lot, drank way too much and came back with a tan. Please don't hate me.

Hashrocket Chicago Grand Opening Party (March 5)

Meet a bunch of Hashrocket folks and a good chunk of the local Ruby community for a cocktail party to celebrate the opening of our Chicago branch office. Details and RSVP

NoSQL Live in Boston (March 11)

In support of our growing reputation in MongoDB circles, we've decided to sponsor this promising event and are sending a couple of Rocketeers to present: Les Hill creator of MongoDoc and Durran Jordan creator of Mongoid. The conference is sold out, but you should be able to catch a live simulcast.

SXSW Interactive in Austin (March 11-16)

I've been attending SXSW for the last couple years and always learn a ton and enjoy the great networking opportunities. This year I'm excited to participate in the program as a panelist on the What Guys are Doing to Get More Girls Into Tech panel.

Together with our design team, I'll also be premiering our the results of our rebranding effort and the relaunch of hashrocket.com. Special limited-edition prints to honor the occasion will be available to select friends of Hashrocket in attendance at SXSW.

RubyConf India in Bangalore (March 17-21)

I'll finally put my Indian visa back to work when I travel back to Bangalore to speak at the inaugural RubyConf India, which we are sponsoring as Hashrocket. If you've been following my blog for awhile or know me personally, you know that in 2006 I lived in Bangalore for three months as a ThoughtWorks University trainer and loved it! I have a special fondness for my friends and associates in India, so this trip is particularly near and dear to my heart. I can't wait to reconnect with everyone and make new friends.

I still haven't decided what my talk will be, but I'm leaning towards an updated version of The Hashrocket Way. Let me know what you think about that via twitter.

Pune Visit (March 22-24)

Before leaving the subcontinent, I'm hoping to visit old friends at the ThoughtWorks India office in Pune, as well as meeting with other folks from the thriving Ruby on Rails scene in that city.

Scottish Ruby Conf (March 25-28)

On my way back from India, I'm spending a few days in Scotland for what's quickly becoming a yearly Hashrocket tradition. Jon Larkowski, Robert Pitts and Jim "Big Tiger" Remsik are representing us on the speaker list.

Palmetto Open Source Software Conference in Columbia, SC (April 15-17)

Speaking at this interesting conference catering to developers, educators and businesspeople involved in open source. Maybe I'll get to meet Cringely.

Hashrocket University in Baltimore (June 6)

Your very exclusive opportunity to study the tools and processes behind Hashrocket's success, hands-on and directly from actual Rocketeers, pairing on our equipment. Presented in partnership with the excellent folks at JumpstartLab. Plus, you're going to be in Baltimore for RailsConf 2010 already!

Ignite RailsConf in Baltimore (June 6)

Ignite events are lightning talks, where 16 speakers each get 5 minutes to talk about a subject they are passionate about, but with a twist: the speaker's slides are automatically advanced every 15 seconds. At Hashrocket, we think Ignite events are fucking awesome. That's why we're sponsoring this one, which promises to be an awesome pre-party kickoff for...

RailsConf 2010 in Baltimore (June 7-10)

I'll be part of a contingent of at least 10-15 people from Hashrocket, many of us speaking (hopefully). I've proposed several talks including a great new experience report called "Million Dollar Mongo" about our work on a large and successful production deployment of a MongoDB/Mongoid/Rails app.

July

Planning to spend most of middle and late July working out of our Chile office.

BizConf 2010  in Amelia Island (August 4-6)

My own conference promises to be one of the greatest learning events of 2010 for people that run software operations. Registration is now open and seats will go fast due to limited capacity. Seriously, what are you waiting for? (Okay, maybe you're waiting for me to post the program - I promise to do it soon.)

Burning Man in Black Rock City (September 1-5)

Oh man, I can't wait for this. Been trying to go for at least 5 years and I lost count. I think I'll be able to go this year, in fact have promised special friends that I will do so.

GoGaRuCo 2010 in San Francisco (September 10-11)

Probably moderating a panel discussion. More details as they become available.

AYE Conference in Phoenix (November 7-11)

Haven't bought tickets yet, but learned so much at last year's event and enjoyed it so much that I doubt I'll be able to resist this year. A conference of legendary reputation, which you should really check out and consider. If I could only attend one learning event this year, it would probably be this one.

Rails Summit 2010 in Sao Paolo (October ?)

More details as they become available.

Conferencia Rails 2010 in Madrid (November ?)

More details as they become available.

YOW! 2010 in Melbourne (December 2-3) and Brisbane (December 6-7)

Presenting on Rails 3. More details as they become available.

February 26, 2010

Great CS Program for Girls Needs Funding

Started in 1996, Artemis is a nationally recognized outreach program to encourage girls from local public schools to pursue careers in Computer Science, and more broadly in science and engineering.

From their website description:

The Artemis Project is a free, five-week summer day camp for rising 9th grade girls in the Providence area who are interested in learning about science and technology. Traditionally, it has been run by four undergraduate women from Brown University in connection with Brown's Computer Science Department. This year, Artemis is pleased to announce that we will additionally have a coordinator from Boston University.

By teaching students computer skills, programming, and computer science concepts through engaging activities, the Artemis Project encourages young women to join the field of computer science. According to my friends in DevChix, early experience in computer programming is essential to stemming attrition rates among women in CS programs at the university level.

So here's a great opportunity to help sustain a program that has been getting girls excited about CS for 15 years. Artemis needs to raise $25,000 to keep the program going this year. My company, Hashrocket, will be making a sizable donation. If you or your company also is able to donate, you can do one of the following things...

1. Send a check made out to "Department of Computer Science, Brown University, Artemis Program" to:

Amy Tarbox
Department of Computer Science, Brown University
Box 1910, 115 Waterman St.
Providence, RI 02912


2. Donate online by going to https://gifts.development.brown.edu/Brown/ChooseGifts.aspx and under the "Other Current-Use Priorities" section, fill in "Artemis Program"

For more information on potential sponsorship arrangements, contact Amy Tarbox: abt@cs.brown.edu

December 13, 2009

What does Quality mean to you?

Quality-tag-map 

The tag map above is an artifact of a discussion about quality that we had internally at Hashrocket last Friday. The question was: "How do we measure Quality on our projects?"

Many of us felt that money (budget) or rather, adherence to the client's budget was the best way to judge quality. I took that to indicate awareness and constant refinement of the quality/speed ratio.

Interestingly, lifestyle (pace) ranked highly, which I think is a reflection of our core values. A comfortable, stress-free environment and sustainable pace is an essential factor in production of quality software. However, I don't know if you can use lifestyle indicators as a quality measurement.

Customer satisfaction ranked highly as well, but perhaps not as high as the others because customers are not always clued in to the real level of quality in their application? Hopefully some of my rocketeers will chime in with their opinions about that.

The answer with the most votes by far was craftmanship, which itself needs further discussion to define well and understand. As a group, we brainstormed ways to measure craftsmanship and ended up with the following ideas, not weighted:

What-is-craftsmanship 

How do you define quality and craftsmanship? Tell me in the comments.

By the way...

I absolutely have to tell you about a great consultant that we retained at Hashrocket to spend a couple days with us discussing quality and helping our management team to figure out growth plans for 2010. His name is Steven M. Smith and I met him at the AYE Conference in Phoenix last month. Besides being a great management consultant, Steve specializes in experiential workshops. You should definitely consider hiring Steve to help you with your software development company or department.

November 24, 2009

Professional Ruby Series Rough Cuts Available

My series has three exciting titles coming in 2010 that I wanted to share with you, since they're now available in preview form.

The Rough Cuts service from Safari Books Online gives you exclusive access to an evolving manuscript that you can read online or download as a PDF and print. A Rough Cuts book is not fully edited or completely formatted, but you'll get access to new versions as they are created.

Service-Oriented Design with Ruby and Rails
By Paul Dix
Published August 28, 2009
Read a free sample chapter: Chapter 2: An Introduction to Service Oriented Design; Overview
Buy Now

This book covers the tools and techniques for building service architectures in Ruby that are designed to scale and operate in the cloud or with legacy enterprise systems.

Rails AntiPatterns
By Chad Pytel, Tammer Saleh
Published Jan 5, 2009
Read a free sample chapter: Chapter 3: Excess Ruby in the Views: Learn the View Helpers That Come With Rails
Buy Now

In Rails AntiPatterns, the authors provide many real world antipatterns examples along with practical advice for how to avoid them in the first place. Each AntiPattern is demonstrated with real world code, and solutions for refactoring are presented that are based on sound Object Oriented principles and established Ruby on Rails best practices.

Reporting and Dimensional Modeling with Ruby
By Matthew Bauer
Published Jan 5, 2009
Buy Now

Both a reference and tutorial, this book shows how to implement the reporting and dimensional modeling concepts using a variety of tools in Ruby.

My Company

My Conference

Bizconf is the only training event specifically crafted for owners and managers of small to mid-sized web design and development firms.

August 4-6, 2010 at the Ritz-Carlton Amelia Island Resort in Florida

My Book Series
Click here to view all titles in my series.