In one of his amazing screenplays, Glengarry Glen Ross, David Mamet sends in a rock star salesman (played by Alec Baldwin) to antagonize an office of poorly performing salesmen. He reminds them of a core tenet of sales: “A-B-C: Always Be Closing”. Otherwise, First prize is a Cadillac El Dorado; Second Prize is a set of steak knives; Third prize is you’re fired.
Glengarry Glen Ross (warning: NSFW - language)
Steve Jobs says, “real artists ship.” Now, I’m no artist, but code undoubtedly contains structure and style. When we developers care enough about our craft to consider this structure and style during the course of development, I don’t think it’d be too far off to consider ourselves an artist of sorts. Or, if you want to sound more original (or pretentious) you might call us “Artisans”.
Of course, Steve Jobs built a booming hardware and software empire on the motto of “real artists ship,” so I don’t think it’s too far of a stretch to embrace and extend—er, I mean paraphrase Steve’s great line into, “real software artisans ship.” Agile methodologies preach similarly: “A-B-S: Always Be Shipping.” If you’re practicing Agile properly, you are constantly shipping; you are shipping something at the end of every iteration. Even if your customers/clients aren’t actually getting their hands on it and using it, you should still be “shipping” it. You should strive to constantly and consistently have something that works. Test-Driven Development helps a great deal with this because, as Uncle Bob says, if you’re practicing it zealously you never go more than a few minutes without everything working.
Ok, so what about the real world? I know, I know – there are plenty of Agile shops and TDD zealots working in the “real world”, but even the Agilists will (regretfully) admit that a majority of the software development industry is simply not following these practices (and some aren’t following any practices at all!). But, does not being an active Agile practitioner preclude you from constantly and consistently shipping?
There is obviously a vast difference between the quick iterations preached by Agile methodologies and a Death March, I’d like to think that even if you or your team are following a Waterfall or SCRUM-fall or even a Free-fall approach that there is still some room for “constantly shipping”. Sure, you might have to loosen the definition of “constantly” to fit your reality… but it’s doable! Following – or better yet, adapting – even some of the Agile methodologies is a great first step (for more on that, check out my follow-up post Some Tips on How to Ship Better Code). More importantly, just keeping the goal of a shipping product instead of that next big feature in mind will probably help more than anything.
What do you think? Have you been able to effectively employ any techniques in a Waterfall-ish environment to help improve your ability to ship regularly? Is this entire post just full of hot air?
Note: This post was heavily influenced by Giles Bowkett’s incredibly awesome presentation at RubyFringe. You must, must, must watch it!!