<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en-US">
  <title>Relevance - Relevance Weblog</title>
  <id>tag:blog.thinkrelevance.com,2009:mephisto/</id>
  <generator version="0.8.0" uri="http://mephistoblog.com">Mephisto Drax</generator>
  
  <link href="http://blog.thinkrelevance.com/" rel="alternate" type="text/html" />
  <updated>2009-07-07T16:04:12Z</updated>
  <link rel="self" href="http://feeds.feedburner.com/relevance-llc" type="application/atom+xml" /><entry xml:base="http://blog.thinkrelevance.com/">
    <author>
      <name>glenn</name>
    </author>
    <id>tag:blog.thinkrelevance.com,2009-07-07:11058</id>
    <published>2009-07-07T14:41:00Z</published>
    <updated>2009-07-07T16:04:12Z</updated>
    <category term="Book Reviews" />
    <category term="agile" />
    <category term="bibliography" />
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/xA576cGM0zU/relevance-agile-bibliography" rel="alternate" type="text/html" />
    <title>Relevance Agile Bibliography</title>
<content type="html">
            &lt;p&gt;You can’t learn agile development by reading a book.
But reading a &lt;em&gt;few&lt;/em&gt; books, in parallel with training and trying out the techniques, helps a lot.
These references constitute Relevance’s recommended reading list for doing Agile development.&lt;/p&gt;

&lt;p&gt;Our &lt;a href="http://thinkrelevance.com/clients"&gt;customers&lt;/a&gt; and &lt;a href="http://thinkrelevance.com/tracks/agile"&gt;students&lt;/a&gt; frequently ask us how they can learn more about how we work.
We believe that Agile is not a process or method, but rather an attitude of constant reflection and improvement.
Our favorite books and papers are about how to see, understand, and react to what’s happening on our projects.&lt;/p&gt;

&lt;h2&gt;Three Essentials&lt;/h2&gt;

&lt;p&gt;Almost all technical books are about particulars: particular processes, platforms, techniques, or tools. 
These three books, though, are about the &lt;em&gt;essence&lt;/em&gt;: the essence of programming, projects, and people.
Other books may offer more immediate, concrete recommendations for your current situation.
However, these books are the foundation. 
If you understand them, everything else will make more sense, and you will be able to make more effective use of more specific recommendations.
We don’t see these three books becoming dated anytime soon.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.pragprog.com/titles/tpp/the-pragmatic-programmer"&gt;&lt;cite&gt;The Pragmatic Programmer: From Journeyman to Master&lt;/cite&gt;&lt;/a&gt;, by Andrew Hunt and David Thomas.
If there’s only one book that every working programmer should read, this is it.
“PragProg,” as it’s known, is about the essence of programming: what programmers really do, and how to get better at it.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.amazon.com/dp/0321482751"&gt;&lt;cite&gt;Agile Software Development: The Cooperative Game (Second Edition)&lt;/cite&gt;&lt;/a&gt; by Alistair Cockburn.
This book is an awesome exploration of how to think about process and software, and how to adapt your process to the needs of your organization and project.
This book attempts to get to the bottom of how software projects work and the factors that make them succeed or fail.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.amazon.com/dp/0932633439"&gt;&lt;cite&gt;Peopleware: Productive Projects and Teams (Second Edition)&lt;/cite&gt;&lt;/a&gt; by Tom DeMarco and Timothy Lister.
This book is aimed at software projects, but the focus is the human element: people and teams. 
Just as good and relevant today as when it was first published in 1987.&lt;/p&gt;

&lt;h2&gt;Software Development&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://www.amazon.com/dp/0201835959"&gt;&lt;cite&gt;The Mythical Man-Month: Essays on Software Engineering (Anniversary Edition)&lt;/cite&gt;&lt;/a&gt;, by Fred Brooks.
This is the all-time classic about software project management.
It predates Agile methods by a long time, but it’s still packed with wisdom and insight,
including compelling analyses of some of the problems with traditional development processes.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.amazon.com/dp/0321127420"&gt;&lt;cite&gt;Patterns of Enterprise Application Architecture&lt;/cite&gt;&lt;/a&gt; by Martin Fowler.
Yes, it’s a patterns book, but don’t let that scare you away.
It discusses the patterns in use by Rails, Django, JEE, and the tradeoffs and reasoning behind them.
Whatever architectural style you usually prefer, this book provides a valuable dose of context by explaining the situations where that style may not be appropriate, and showing you a number of useful alternatives.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.amazon.com/dp/0932633609"&gt;&lt;cite&gt;Waltzing with Bears: Managing Risk on Software Projects&lt;/cite&gt;&lt;/a&gt; by Tom DeMarco and Timothy Lister.
Methodology failure is just one of many kinds of risk your projects face.
Unfortunately, most Agile books don’t give risk management the attention it deserves.
This book explains how and why to take risk seriously and manage it carefully.
It’s an excellent primer on risk analysis and how to plan for failure.
(It also includes one of our favorite quotes: “Risk management is project management for grownups.”)&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.amazon.com/dp/0321125215"&gt;&lt;cite&gt;Domain-Driven Design: Tackling Complexity in the Heart of Software&lt;/cite&gt;&lt;/a&gt; by Eric Evans.
We’ve known for years that a clean, expressive domain model that reflects the terminology of the problem domain makes every part of the development process easier.
Eric Evans’ book does a great job of explaining &lt;em&gt;why&lt;/em&gt; that’s true, and how to achieve a good domain model.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.amazon.com/dp/0932633390"&gt;&lt;cite&gt;The Deadline: A Novel About Project Management&lt;/cite&gt;&lt;/a&gt; by Tom DeMarco.
Politics, intrigue, risk management, romance, kidnapping, schedule chicken, and spies.
What more do you need to know?&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.amazon.com/dp/0735624356"&gt;&lt;cite&gt;I.M. Wright’s Hard Code&lt;/cite&gt;&lt;/a&gt; by Eric Brechner.
This book deals specifically with the agile project manager role.
Most importantly, it describes how to be a better manager in the “servant/master” model;
rather than dictating to the team what to do, the manager sets direction and removes obstacles.
That style works well in general, and especially well on an agile project.
(Also, it has valuable tips on how to interact with other teams that are working on your project.)&lt;/p&gt;

&lt;h2&gt;Agile Methods&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://www.amazon.com/dp/0321278658"&gt;&lt;cite&gt;Extreme Programming Explained: Embrace Change (Second Edition)&lt;/cite&gt;&lt;/a&gt; by Kent Beck.
A concise and clear explanation of traditional software methodologies and why they are broken, and why XP works and is better.
The first edition is rather detailed and prescriptive, focused on developers.
The second edition has a higher-level viewpoint and is a bit more relaxed.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.amazon.com/dp/3540787275"&gt;&lt;cite&gt;The Buzz About Bees: Biology of a Superorganism&lt;/cite&gt;&lt;/a&gt; by Jürgen Tautz.
Some people are unsure about agile methods because they don’t feel comfortable with the idea of emergent behavior (i.e., simple, localized rules that result in complex, apparently organized large-scale effects).
This book is an excellent explanation of that idea, with many insights that apply to human organizations.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://vanderburg.org/Writing/xpannealed.pdf"&gt;&lt;cite&gt;A Simple Model of Agile Software Processes –or– Extreme Programming Annealed&lt;/cite&gt;&lt;/a&gt; by Glenn Vanderburg.
This paper explains how a collection of focused practices, with very little overall coordination or up-front planning, can reliably lead to good results.
Although the paper deals explicitly with Extreme Programming, the core idea—that agile processes consist of nested, optimized feedback loops at various scales—applies to other agile processes as well.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.amazon.com/dp/0131479415"&gt;&lt;cite&gt;Agile Estimating and Planning&lt;/cite&gt;&lt;/a&gt; by Mike Cohn.
Agile teams still estimate costs, make plans, and set schedules.
But we do it a bit differently.
This book by Mike Cohn explains how an agile team sets plans, and how to change your thinking about plans and the ways that they help you.&lt;/p&gt;

&lt;h2&gt;Reflection and Responsiveness&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://www.pragprog.com/titles/dlret/agile-retrospectives"&gt;&lt;cite&gt;Agile Retrospectives: Making Good Teams Great&lt;/cite&gt;&lt;/a&gt; by Esther Derby and Diana Larsen.
Kevlin Henney likes to say that some programmers with ten years of experience seem to have had the same year ten times.
Some teams are like that, too.
Experience isn’t very valuable if you don’t learn from it, and we’ve found that you can’t just take that for granted.
Retrospectives are wonderful for making sure you learn the right lessons from both your mistakes and your successes.
This book can show you how.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.amazon.com/dp/0932633013"&gt;&lt;cite&gt;Secrets of Consulting: A Guide to Giving and Getting Advice Successfully&lt;/cite&gt;&lt;/a&gt; by Gerald Weinberg.
Even if you’re not a consultant, this book is well worth reading.
It’s all about how to see problems, identify solutions, and &lt;em&gt;communicate&lt;/em&gt; successfully within an organization.
It’s about effecting change from a position of very little power.
Who hasn’t needed to do that?&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.amazon.com/dp/1591841992"&gt;&lt;cite&gt;The Back of the Napkin: Solving Problems and Selling Ideas with Pictures&lt;/cite&gt;&lt;/a&gt; by Dan Roam.
This book is about thinking visually about processes and problems. 
It’s also a great way to learn about low-cost, high impact techniques like paper-prototyping and &lt;em&gt;ad hoc&lt;/em&gt; data visualization.&lt;/p&gt;

&lt;h2&gt;Personal Development&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://www.pragprog.com/titles/cfcar2/the-passionate-programmer"&gt;&lt;cite&gt;The Passionate Programmer: Creating a Remarkable Career in Software Development&lt;/cite&gt;&lt;/a&gt; by Chad Fowler.
There’s debate about whether agile development &lt;em&gt;requires&lt;/em&gt; exceptional developers.
But it’s absolutely clear that having good developers helps a lot.
Chad has written a wonderful book that can inspire you and others on your team to improve your craft and polish your skills.
The entire team will benefit.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.amazon.com/dp/0965043002"&gt;&lt;cite&gt;What Did You Say?: The Art of Giving and Receiving Feedback&lt;/cite&gt;&lt;/a&gt; by Charles N. Seashore, Edith Whitfield Seashore, and Gerald M. Weinberg.
Agile processes are all about efficient feedback, and feedback between and about people is an important part of that.
But giving personal feedback is hard, and receiving it is even harder. 
This book can help you get better at giving feedback constructively and reacting to it positively.
Unfortunately it’s out of print, but of course used copies are available on Amazon or Alibris.&lt;/p&gt;

&lt;h2&gt;Beyond This List&lt;/h2&gt;

&lt;p&gt;The resources listed here are great places to start.
We also offer &lt;a href="http://thinkrelevance.com/tracks/agile"&gt;training&lt;/a&gt; on agile practices.
But there’s a lot of other relevant literature.
In fact, as a couple of the examples here demonstrate, there’s a lot we can learn about software development by reading about other fields, and even about other species.
(Our friends the &lt;a href="http://pragprog.com/"&gt;Pragmatic Programmers&lt;/a&gt; once gained valuable insights about software development by reading about &lt;a href="http://www.amazon.com/dp/0130325228"&gt;training in the nursing profession&lt;/a&gt; and &lt;a href="http://www.dtic.mil/doctrine/jel/service_pubs/mcdp1.pdf"&gt;U.S. Marine Corps warfare doctrine&lt;/a&gt;.
And we’ve been learning a lot lately by reading about &lt;a href="http://www.amazon.com/dp/0312427719"&gt;music theory&lt;/a&gt;, &lt;a href="http://www.amazon.com/dp/0262581469"&gt;cognition&lt;/a&gt;, &lt;a href="http://www.amazon.com/dp/0312427654"&gt;the practice of medicine&lt;/a&gt;, and the &lt;a href="http://www.amazon.com/dp/0679760210"&gt;history of bridge engineering&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;Furthermore, things are still changing.
This bibliography will probably look very different in five years or so.
(In fact, you can probably think of good resources we’ve missed.
Tell us in the comments!)
We learn new things about programming, and about software teams, every year.
Sometimes it may seem like we have it all figured out, but more often we suspect that our whole industry is still fumbling in the dark, only gradually coming to understand the fundamentals of software development.&lt;/p&gt;

&lt;p&gt;We intend to keep reading and discovering, and you should too.
It takes a &lt;a href="http://norvig.com/21-days.html"&gt;long time&lt;/a&gt; to get really good at software development, and there’s always room to improve.
Read at least a few books on software development each year.
Also, seek out some good blogs or online magazines that discuss these topics.
There is a rich and fascinating dialogue happening all the time in the community of software developers.
You owe it to yourself—and your team, and your employer—to be a part of it!&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/xA576cGM0zU" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.thinkrelevance.com/2009/7/7/relevance-agile-bibliography</feedburner:origLink></entry>
  <entry xml:base="http://blog.thinkrelevance.com/">
    <author>
      <name>jgehtland</name>
    </author>
    <id>tag:blog.thinkrelevance.com,2009-06-17:11054</id>
    <published>2009-06-17T17:37:00Z</published>
    <updated>2009-06-17T17:39:26Z</updated>
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/3zibHtdQMN8/focus-focus-focus" rel="alternate" type="text/html" />
    <title>Focus, focus, focus</title>
<content type="html">
            &lt;p&gt;We’ve been doing technical training a long time, and we’ve discovered a general rule of thumb: the fifth day of a five-day class is generally worthless.  Students are burned out, concentration has waned, and that is coupled with the fact that the last day is usually the most complex topics.  All of which, taken together, means that information is just not usefully transmitted on the final day.&lt;/p&gt;


	&lt;p&gt;The other major issue is the length-of-course to primariness-of-focus ratio.  Some technologies are complex enough to warrant long courses on the merits of the technology alone, but are not the main job of anybody on the team.  &lt;a href="http://memeagora.blogspot.com/"&gt;Neal Ford&lt;/a&gt; once described these as “condiment technologies”.  Maybe Ruby, or Java, or C#, or Clojure is your hotdog; these technologies are the mustard.  Even if the mustard is really really really good, nobody wants to spend a week eating just that.&lt;/p&gt;


	&lt;p&gt;We’re trying to address this through the introduction of our new one-day training classes.  The idea is to harness the power of programmers to focus insanely well for a short period of time.  Instead of fighting against &lt;span class="caps"&gt;ADD&lt;/span&gt; all week, let’s harness the obsessive power of the programmer’s mind and hit one topic, really hard, for one day.  We think that the energy expanded will have a higher return for the students, and the information will be retained and &lt;strong&gt;used&lt;/strong&gt;.&lt;/p&gt;


	&lt;p&gt;Our first offering in this space is our &lt;a href="http://thinkrelevance.com/training/jquery"&gt;jQuery course&lt;/a&gt;.  &lt;a href="http://jQuery.com"&gt;jQuery&lt;/a&gt; is a perfect candidate due to its nature:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;it’s a library, not a language.  While it has general purpose features, the programmer will be presumed to understand them before attending the class.&lt;/li&gt;
		&lt;li&gt;it has a limited application scope.  It is used to build interactive web pages (DOM interaction, Ajax, general JavaScript extenstions)&lt;/li&gt;
		&lt;li&gt;it has some deeply interesting technical aspects.  Is it a monad? How does it embody the ideas of functional programming? Is it different from raw JavaScript?&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;We think training courses like this are going to be more effective for a variety of technologies that programmers are being exposed to these days.  Instead of making one massive course that programmers will have a hard time sitting through and concentrating during, pick one interesting topic and hammer it mercilessly for 8 hours. Sound familiar? That’s pretty much how we work around here. And it plays into our other belief about technology training: it should be about inspiration and getting launched, not about exhaustive minutia.  One day on jQuery is plenty to get productive and be inspired.&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/3zibHtdQMN8" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.thinkrelevance.com/2009/6/17/focus-focus-focus</feedburner:origLink></entry>
  <entry xml:base="http://blog.thinkrelevance.com/">
    <author>
      <name>stu</name>
    </author>
    <id>tag:blog.thinkrelevance.com,2009-06-05:11048</id>
    <published>2009-06-05T11:24:00Z</published>
    <updated>2009-06-17T17:44:19Z</updated>
    <category term="dallas" />
    <category term="javascript" />
    <category term="nfjs" />
    <category term="refactoring" />
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/BsPyY_mNocc/refactoring-javascript-2009-edition" rel="alternate" type="text/html" />
    <title>Refactoring JavaScript, 2009 Edition</title>
<content type="html">
            &lt;p&gt;I am off to &lt;a href="http://www.nofluffjuststuff.com/conference/dallas/2009/06/schedule.html"&gt;Dallas&lt;/a&gt; this morning to give an all-new version of the &lt;a href="http://www.nofluffjuststuff.com/conference/speaker/topic_view?topicId=1424"&gt;Refactoring JavaScript talk&lt;/a&gt;. This year, we will be looking at testing and refactoring jQuery plugins, using Screw.Unit, Smoke, and blue-ridge.&lt;/p&gt;

&lt;p&gt;You can grab the slides &lt;a href="http://github.com/stuarthalloway/refactoring-javascript/"&gt;here&lt;/a&gt;, but as usual the slides tell only a little of the story. Instead, grab the &lt;a href="http://github.com/stuarthalloway/refactoring-number-formatter"&gt;project&lt;/a&gt; itself, and use git’s local history to start at the beginning and watch the refactorings step-by-step.&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/BsPyY_mNocc" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.thinkrelevance.com/2009/6/5/refactoring-javascript-2009-edition</feedburner:origLink></entry>
  <entry xml:base="http://blog.thinkrelevance.com/">
    <author>
      <name>stu</name>
    </author>
    <id>tag:blog.thinkrelevance.com,2009-05-27:11033</id>
    <published>2009-05-27T13:53:00Z</published>
    <updated>2009-05-27T13:54:39Z</updated>
    <category term="Clojure" />
    <category term="clojure" />
    <category term="nfjs" />
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/Bo_xrwgiMcA/rifle-oriented-programming-with-clojure" rel="alternate" type="text/html" />
    <title>Rifle-Oriented Programming with Clojure</title>
<content type="html">
            &lt;p&gt;If you come to Clojure from an object-oriented background, you may not know where to start. It is sort of like looking at a rifle for the first time and asking "But where do I put the arrows?"&lt;/p&gt;

&lt;p&gt;Clojure solves the traditional problems of OO (and then some!) but it does it in different ways. To learn how to translate your arrows (encapsulation, polymorphism, and inheritance) into bullets, check out my new article in the May issue of &lt;a href="http://www.nofluffjuststuff.com/magazine_subscribe.jsp"&gt;NFJS, the Magazine&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Also: I'll be spending the summer on the &lt;a href="http://www.nofluffjuststuff.com/home.jsp"&gt;NFJS circuit&lt;/a&gt;, talking about Clojure, Git, and &lt;a href="http://blog.thinkrelevance.com/talks"&gt;other good things&lt;/a&gt;. Come see us.&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/Bo_xrwgiMcA" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.thinkrelevance.com/2009/5/27/rifle-oriented-programming-with-clojure</feedburner:origLink></entry>
  <entry xml:base="http://blog.thinkrelevance.com/">
    <author>
      <name>jason</name>
    </author>
    <id>tag:blog.thinkrelevance.com,2009-05-12:11011</id>
    <published>2009-05-12T10:30:00Z</published>
    <updated>2009-06-29T20:44:09Z</updated>
    <category term="Rails" />
    <category term="blue-ridge" />
    <category term="javascript" />
    <category term="rails" />
    <category term="testing" />
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/xUjMj7ihSUc/blue-ridge-1-0-javascript-unit-testing-for-rails-scandalous" rel="alternate" type="text/html" />
    <title>Blue Ridge 1.0: JavaScript Unit Testing for Rails. Scandalous!</title>
<content type="html">
            &lt;p&gt;You wouldn’t consider developing a Rails application without having a solid test suite for your Ruby code, but you’ve somehow convinced yourself to cross your fingers and look the other way when it comes to JavaScript. It doesn’t have to be that way. &lt;/p&gt;

&lt;p&gt;Meet &lt;a href="http://github.com/relevance/blue-ridge" title="github.com/relevance/blue-ridge - JavaScript BDD Rails Plugin"&gt;Blue Ridge&lt;/a&gt;, a Rails plugin that brings the goodness of test-driven and behavior-driven development to your unobtrusive JavaScript code in a Rails-friendly manner.  &lt;/p&gt;

&lt;p&gt;&lt;a href="http://github.com/relevance/blue-ridge" title="github.com/relevance/blue-ridge - JavaScript BDD Rails Plugin"&gt;&lt;img title="" src="http://blog.thinkrelevance.com/assets/2009/6/29/blueridge.png" alt="Blue Ridge"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Historically, when selecting a JavaScript testing solution, you were forced to choose whether you wanted a framework that could run your tests in the browser or one that could only run your tests in a headless fashion.  By providing a friendly convention-over-configuration wrapper around a collection of &lt;a href="http://github.com/nkallen/screw-unit" title="Screw.Unit - a behavior-driven development syntax for JavaScript similar to RSpec"&gt;open&lt;/a&gt; &lt;a href="http://github.com/thatcher/env-js" title="env.js - a DOM implementation written entirely in JavaScript"&gt;source&lt;/a&gt; &lt;a href="http://github.com/andykent/smoke" title="Smoke - a JavaScript mocking &amp;amp;amp; stubbing library similar to Mocha"&gt;tools&lt;/a&gt;, Blue Ridge gives us the best of both worlds: fast, automation-friendly, and headless testing plus the ability to run your tests in whichever browser is acting up on any given day.&lt;/p&gt;

&lt;p&gt;Last summer, Blue Ridge was &lt;a href="http://blog.thinkrelevance.com/2008/7/31/fully-headless-jsspec" title="Relevance Blog : Fully Headless JSSpec"&gt;just a twinkle in our eye&lt;/a&gt;.  Last week, Blue Ridge made its &lt;a href="http://en.oreilly.com/rails2009/public/schedule/detail/8013" title="RailsConf 2009 - JavaScript Testing in Rails: Fast, Headless, In-Browser. Pick Any Three."&gt;public debut at RailsConf&lt;/a&gt;. Today, we’re pleased to announce version 1.0.&lt;/p&gt;

&lt;h2&gt;Getting Started&lt;/h2&gt;

&lt;p&gt;First, install Blue Ridge into your Rails app:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;./script/plugin install git://github.com/relevance/blue-ridge.git
./script/generate blue_ridge
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Blue Ridge creates a small example spec to get you started.  Run your JavaScript specs to make sure that all is well so far:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rake test:javascripts
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;(Hint: You can also use the &lt;code&gt;spec:javascripts&lt;/code&gt; or &lt;code&gt;examples:javascripts&lt;/code&gt; aliases.  Blue Ridge is compatible with your testing framework of choice, be it test/unit, RSpec, Micronaut, Shoulda, test-spec, etc.).&lt;/p&gt;

&lt;p&gt;Next, try running an individual spec. When you installed Blue Ridge, it created a spec file named “application_spec.js”.  You can run it like so:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rake test:javascripts TEST=application
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Of course, you really want to generate a spec that’s specific to &lt;em&gt;your&lt;/em&gt; app. Let’s say you want to write some tests for a JavaScript file called “public/javascripts/graphics.js”. Run:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;./script/generate javascript_spec graphics
rake test:javascripts TEST=graphics
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Cool.  We can run our JavaScript specs from the command line, and they’re &lt;em&gt;fast&lt;/em&gt;!  But you just got a bug report regarding JavaScript errors in IE6 (die already!), and you want to write some tests to prove (and then resolve) the bug.  To run your spec inside a web browser, simply load the HTML fixture associated with the spec (e.g., “test/javascripts/fixtures/graphics.html” for the tests in “graphics_spec.js”) and see the results of running the tests in that specific browser.  &lt;/p&gt;

&lt;p&gt;Check out the &lt;a href="http://github.com/relevance/blue-ridge/tree/master/README.markdown" title="Blue Ridge README on GitHub"&gt;README&lt;/a&gt; for more information on the directory layout and a detailed description of the various Blue Ridge components.&lt;/p&gt;

&lt;h2&gt;jQuery-Opinionated&lt;/h2&gt;

&lt;p&gt;Blue Ridge wouldn’t quite fit into the Rails ecosystem if it didn’t come equipped with a few opinions.  So by default, it assumes you’re using jQuery.  “application_spec.js”, which was generated when you installed the plugin, includes an example of calling jQuery functions inside a test.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require("spec_helper.js");
require("../../public/javascripts/application.js");

Screw.Unit(function() {
  describe("Your application javascript", function() {
    it("provides cliché example", function() {
      expect("hello").to(equal, "hello");
    });

    it("accesses the DOM from fixtures/application.html", function() {
      expect($('.select_me').length).to(equal, 2);
    });
  });
});
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And, no, we don’t actually encourage you to write tests for standard libraries like JQuery and Prototype; it just makes for an easy demo.&lt;/p&gt;

&lt;h2&gt;Prototype-Friendly&lt;/h2&gt;

&lt;p&gt;If you prefer Prototype, no problem: “Have it your way.”&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;jQuery.noConflict();

require("spec_helper.js");
require("../../public/javascripts/prototype.js", {onload: function() {
    require("../../public/javascripts/application.js");
}});

Screw.Unit(function() {
    describe("Your application javascript", function() {
        it("accesses the DOM from fixtures/application.html", function() {
            expect($$('.select_me').length).to(equal, 2);
        });
    });
});
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Put jQuery into “no conflict” mode to give the &lt;code&gt;$&lt;/code&gt; function back to Prototype, require &lt;code&gt;prototype.js&lt;/code&gt;, and chain any files that are dependent on &lt;code&gt;prototype.js&lt;/code&gt; in the &lt;code&gt;onload&lt;/code&gt; callback.  Done.  Your Prototype-based tests await you.&lt;/p&gt;

&lt;h2&gt;Act Now, and We’ll Throw in Mocking Support&lt;/h2&gt;

&lt;p&gt;Blue Ridge includes &lt;a href="http://github.com/andykent/smoke"&gt;Smoke&lt;/a&gt;, a JavaScript mocking and stubbing toolkit somewhat similar to Mocha.  Assume we’re testing a function called &lt;code&gt;calculateTotalCost&lt;/code&gt;, and you want to ensure that it calls &lt;code&gt;calculateComponentPrice&lt;/code&gt; for each given component.  That test might look something like so:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;it("calculates the total cost of a contract by adding the prices of each component", function() {
  var componentX = {}, componentY = {};
  mock(SalesContract).should_receive("calculateComponentPrice")
    .with_arguments(componentX).exactly(1, "time").and_return(42);
  mock(SalesContract).should_receive("calculateComponentPrice")
    .with_arguments(componentY).exactly(1, "time").and_return(24);
  expect(SalesContract.calculateTotalCost([componentX, componentY])).to(equal, 66);
});
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Fun with TextMate&lt;/h2&gt;

&lt;p&gt;Running individual specs from the command line is an essential feature, but if you use TextMate like we do, you’d rather not have to leave your editor in order to run a spec. If this describes your development style, take the &lt;a href="http://github.com/karnowski/blue-ridge-tmbundle"&gt;Blue Ridge TextMate Bundle&lt;/a&gt; for a spin.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cd ~/Library/Application Support/TextMate/Bundles/
git clone git://github.com/karnowski/blue-ridge-tmbundle.git Blue\ Ridge.tmbundle
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Once you reload your bundles (or restart TextMate), just hit Command-R to run the currently-open spec directly from TextMate.  &lt;/p&gt;

&lt;p&gt;And be sure to check out the snippets as well. Type &lt;code&gt;it&lt;/code&gt;, &lt;code&gt;des&lt;/code&gt;, &lt;code&gt;bef&lt;/code&gt;, or &lt;code&gt;aft&lt;/code&gt;, and then press the tab key to expand into full &lt;code&gt;it&lt;/code&gt; blocks, &lt;code&gt;describe&lt;/code&gt; blocks, etc.&lt;/p&gt;

&lt;h2&gt;But Wait, There’s More&lt;/h2&gt;

&lt;p&gt;Want more examples?  To see Blue Ridge in action inside a working Rails app, check out the &lt;a href="http://github.com/relevance/blue-ridge-sample-app"&gt;Blue Ridge sample application&lt;/a&gt;.  Among other things, the sample app includes examples of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;using nested &lt;code&gt;describe&lt;/code&gt; functions&lt;/li&gt;
&lt;li&gt;setting up per-spec HTML “fixtures”&lt;/li&gt;
&lt;li&gt;stubbing and mocking functions&lt;/li&gt;
&lt;li&gt;running the Blue Ridge specs as part of your default Rake task&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Money Back Guarantee&lt;/h2&gt;

&lt;p&gt;Blue Ridge is guaranteed to be bug free and fulfill your every need, or your money back!  Of course, in lieu of a full refund, you’re welcome to hop over to the project’s &lt;a href="http://github.com/relevance/blue-ridge/issues"&gt;GitHub issue tracker&lt;/a&gt; to let us know about any issues or ideas for possible improvements. Even better, fork the &lt;a href="http://www.github.com/relevance/blue-ridge"&gt;repo&lt;/a&gt; and start hacking!  If you have patches, send us pull requests.&lt;/p&gt;

&lt;p&gt;Now, go forth and give your JavaScript code the testing love it deserves!&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/xUjMj7ihSUc" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.thinkrelevance.com/2009/5/12/blue-ridge-1-0-javascript-unit-testing-for-rails-scandalous</feedburner:origLink></entry>
  <entry xml:base="http://blog.thinkrelevance.com/">
    <author>
      <name>jgehtland</name>
    </author>
    <id>tag:blog.thinkrelevance.com,2009-05-07:11006</id>
    <published>2009-05-07T13:26:00Z</published>
    <updated>2009-06-13T18:41:55Z</updated>
    <category term="Relevance News" />
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/gnX11gqrx90/some-more-details-on-the-new-space" rel="alternate" type="text/html" />
    <title>Some More Details on the New Space</title>
<content type="html">
            &lt;p&gt;We decided to move when we realized that our dev room was too cramped, and people were being forced to work in conference rooms, the hallway or out of the office.  We colocate our team precisely to avoid situations where people aren’t in the same room, and our old space was actively hindering that.  So, we decided to seek out something a bit more spacious.  Here is our new dev room….&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.flickr.com/photos/jessmartin/3504966809/" title="Pairing Stations and a Napping Station by jessmartin, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3654/3504966809_fc0b86d1f1.jpg" height="333" alt="Pairing Stations and a Napping Station" width="500" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Everybody loves the new space, precisely because we have enough room to spread out but stay together.  And, you can’t see it very well, but if you look over Rob’s shoulder in this next picture, you can see the kitchen behind the dev room, with the conference room to the right. The conference room is big, located at the far end of the space from the dev room, and easily closed off, which means we can have meetings and still have all the chaos of our dev room going at the same time.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.flickr.com/photos/jessmartin/3505778232/" title="Wah? by jessmartin, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3645/3505778232_caacd1f72d.jpg" height="333" alt="Wah?" width="500" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;The other major benefit of the new space is light; sweet, sweet sunlight. Every window in the space is enormous, and they all open.  To the outside.  In this picture, you can also see two doors on the right, leading to the library and the phone room.  The new space is a great mix of public and private space that suits us down to the bone.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.flickr.com/photos/jessmartin/3504970961/" title="Milling About by jessmartin, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3556/3504970961_e895491205.jpg" height="333" alt="Milling About" width="500" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;On top of all this, the space is in the heart of downtown Durham, meaning we have tons of restaurants and shops in walking distance. I just found out yesterday that there’s a &lt;a href="http://movies.apunkachoice.com/names/chr/chris_hall/cid_35739/videos/ceytid/D4fTMqPqHlE/ujamaa-boardhouse-team-video-1.html"&gt;skateboard shop across the street&lt;/a&gt;.  We’ve been walking to lunch every day, and all around enjoying being out of the suburbs.&lt;/p&gt;


	&lt;p&gt;Special thanks to Jess Martin for taking these photos.&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/gnX11gqrx90" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.thinkrelevance.com/2009/5/7/some-more-details-on-the-new-space</feedburner:origLink></entry>
  <entry xml:base="http://blog.thinkrelevance.com/">
    <author>
      <name>jgehtland</name>
    </author>
    <id>tag:blog.thinkrelevance.com,2009-05-05:11003</id>
    <published>2009-05-05T18:14:00Z</published>
    <updated>2009-06-05T11:14:42Z</updated>
    <category term="Relevance News" />
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/1Ph7CH-CbKQ/relevance-has-moved" rel="alternate" type="text/html" />
    <title>Relevance Has Moved</title>
<content type="html">
            &lt;p&gt;We are happy to announce that Relevance has completed its long-awaited move to downtown Durham, NC.  A year after signing the lease and riding herd over the buildout, we moved in over the weekend.  We are all thrilled to be in the new space: more room, more light, more fun things to do within walking distance.  When the apartments are finished, we’ll even have team member sitting atop our office like hens to eggs.&lt;/p&gt;


	&lt;p&gt;While I’m writing this, we’re sitting here on a rainy spring afternoon listening to jazz quietly playing in the new dev room, windows open to the rain and sound of cars and foot traffic outside.  If it wasn’t for the damn crosswalk alert about three feet from the window, it would be perfect.&lt;/p&gt;


	&lt;p&gt;Hope to see some of you here soon.  The new address is:&lt;/p&gt;


	&lt;p&gt;&lt;span&gt;200 North  Mangum Street&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;Suite 204&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;Durham, &lt;span class="caps"&gt;NC  27701&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;


&amp;lt;iframe src="http://maps.google.com/maps?f=q&amp;amp;amp;source=s_q&amp;amp;amp;hl=en&amp;amp;amp;geocode=&amp;amp;amp;q=200+North+Mangum+Street,+27701&amp;amp;amp;sll=37.0625,-95.677068&amp;amp;amp;sspn=45.957536,92.373047&amp;amp;amp;ie=UTF8&amp;amp;amp;z=14&amp;amp;amp;iwloc=A&amp;amp;amp;ll=36.005784,-78.895655&amp;amp;amp;output=embed" height="350" width="425"&gt;&amp;lt;/iframe&gt;&lt;br /&gt;&lt;small&gt;&lt;a href="http://maps.google.com/maps?f=q&amp;amp;amp;source=embed&amp;amp;amp;hl=en&amp;amp;amp;geocode=&amp;amp;amp;q=200+North+Mangum+Street,+27701&amp;amp;amp;sll=37.0625,-95.677068&amp;amp;amp;sspn=45.957536,92.373047&amp;amp;amp;ie=UTF8&amp;amp;amp;z=14&amp;amp;amp;iwloc=A&amp;amp;amp;ll=36.005784,-78.895655"&gt;View Larger Map&lt;/a&gt;&lt;/small&gt;
          &lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/1Ph7CH-CbKQ" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.thinkrelevance.com/2009/5/5/relevance-has-moved</feedburner:origLink></entry>
  <entry xml:base="http://blog.thinkrelevance.com/">
    <author>
      <name>larry</name>
    </author>
    <id>tag:blog.thinkrelevance.com,2009-04-30:10996</id>
    <published>2009-04-30T13:23:00Z</published>
    <updated>2009-04-30T13:27:04Z</updated>
    <category term="Ajax" />
    <category term="Events" />
    <category term="Rails" />
    <category term="Relevance News" />
    <category term="Ruby" />
    <category term="bdd" />
    <category term="blue-ridge" />
    <category term="javascript" />
    <category term="railsconf" />
    <category term="screw.unit" />
    <category term="smoke" />
    <category term="tdd" />
    <category term="testing" />
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/2EY2irC1LyI/javascript-testing-at-railsconf" rel="alternate" type="text/html" />
    <title>JavaScript Testing at RailsConf</title>
<content type="html">
            &lt;p&gt;Jason and I will be at &lt;a href="http://en.oreilly.com/rails2009/public/schedule/detail/8013" title="JavaScript Testing in Rails: Fast, Headless, In-Browser. Pick Any Three."&gt;RailsConf next week&lt;/a&gt; speaking about &lt;a href="http://github.com/relevance/blue-ridge"&gt;Blue-Ridge&lt;/a&gt;, our Rails plugin that makes test-driven JavaScript development easy and natural!&lt;/p&gt;

&lt;p&gt;Here's our abstract:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;Learn how to enjoy the benefits of test-driven development beyond just your Ruby on Rails code.  &amp;nbsp;JavaScript is code too, and it deserves tests! With the help of some handy plugins, Rails lets you test your unobtrusive JavaScript using tools such as Screw.Unit and Smoke. The tools and approach are library-agnostic; they work well with jQuery, Prototype, and others.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The talk is at 1:50 PM on Tuesday, May 5.  Come check it out, and give your JavaScript code the testing love it deserves.&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/2EY2irC1LyI" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.thinkrelevance.com/2009/4/30/javascript-testing-at-railsconf</feedburner:origLink></entry>
  <entry xml:base="http://blog.thinkrelevance.com/">
    <author>
      <name>glenn</name>
    </author>
    <id>tag:blog.thinkrelevance.com,2009-04-09:10982</id>
    <published>2009-04-09T13:55:00Z</published>
    <updated>2009-07-08T14:18:52Z</updated>
    <category term="agility" />
    <category term="codeswarm" />
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/vGq42t31nfI/making-a-lasting-impact" rel="alternate" type="text/html" />
    <title>Making a Lasting Impact</title>
<content type="html">
            &lt;p&gt;
At Relevance, we pride ourselves on having happy customers.  We are
constantly striving to ensure that, from the very start of a project,
we will exceed our customers' expectations.  Recently one of our
customers made our day by coming to us with concrete evidence of
the positive impact we'd made---in the form of a video!
&lt;/p&gt;

&lt;p&gt;
The project was one where the system already existed, and the
customer had a small team of two developers at work on it.  Three
of us from Relevance joined the project part-time for about three
months, helping them complete a new release.
&lt;/p&gt;

&lt;p&gt;
When the project manager learned about the &lt;a href="http://vis.cs.ucdavis.edu/~ogawa/codeswarm/"&gt;Codeswarm&lt;/a&gt; tool, he
thought it would be interesting to make a Codeswarm video of that
period of time.  He sent a copy of the video to us as a way of
thanking us for our contribution.  Here's an anonymized version of the video:
&lt;/p&gt;

&amp;lt;object height="390" width="520"&gt;&amp;lt;param /&gt;&amp;lt;param /&gt;&amp;lt;param /&gt;&amp;lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=4076162&amp;amp;amp;server=vimeo.com&amp;amp;amp;show_title=0&amp;amp;amp;show_byline=0&amp;amp;amp;show_portrait=0&amp;amp;amp;color=00ADEF&amp;amp;amp;fullscreen=1" height="390" width="520"&gt;&amp;lt;/embed&gt;&amp;lt;/object&gt;

&lt;p&gt;
The most interesting thing about that video is &lt;strong&gt;not&lt;/strong&gt; the most obvious
thing.  Yes, there's a big, clear flurry of activity when Relevance
joined the team.  But some of that is artificial: right at the start
we vendored Rails into the repository and added a bunch of useful
plugins.  Some of the big burst of activity is related to that
(although less than you might think).
&lt;/p&gt;

&lt;p&gt;
No, the thing that most pleased our customer (and us!) is what
happened &lt;strong&gt;after&lt;/strong&gt; that.  Watch just the first ten seconds of the
video again: just the two client developers, before we joined the
team.  Then start watching at about the 15-second mark, after we'd
been on the project for a little over a week.  Don't watch the three
Relevance developers; watch the two client developers.  Do you see
how their pattern of activity has changed?  They are each making
more frequent commits, and their commits involve more files.
&lt;/p&gt;

&lt;p&gt;
That's the impact that our customer wanted us to see: that our
involvement made his own developers more active, confident, and
productive.  That effect held on as our involvement in the project
diminished, and even after we were gone.  In his words, "You can
definitely tell the impact you had on our project!"
&lt;/p&gt;

&lt;p&gt;
Needless to say, we're thrilled.  That's the kind of impact we want
to have: knock it out of the park ourselves, and help the customer's
team grow in the process.  And to have the customer be so impressed
that they take this much trouble to &lt;strong&gt;show&lt;/strong&gt; us what they've seen---that's
just icing on the cake.
&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/vGq42t31nfI" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.thinkrelevance.com/2009/4/9/making-a-lasting-impact</feedburner:origLink></entry>
  <entry xml:base="http://blog.thinkrelevance.com/">
    <author>
      <name>jgehtland</name>
    </author>
    <id>tag:blog.thinkrelevance.com,2009-04-06:10975</id>
    <published>2009-04-06T13:31:00Z</published>
    <updated>2009-04-06T13:32:13Z</updated>
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/cBsXf_vzJLA/relevance-becomes-a-b-corporation" rel="alternate" type="text/html" />
    <title>Relevance Becomes a B Corporation</title>
<content type="html">
            &lt;p&gt;&lt;img src="http://blog.thinkrelevance.com/assets/2009/4/2/B_BCorp_logo_POS.jpg"&gt;As of March, 2009, Relevance is officially a &lt;a href="http://bcorporation.net" title="The Change We Seek"&gt;B Corporation&lt;/a&gt;.  Most people reading this are probably asking something like "What, you couldn't get an A?"  Or, "weren't S and C good enough?" The answers are: in this case, a B is better than an A, and no, they weren't.  Read on to find out what this all means, and what we're up to.&lt;/p&gt;

&lt;h2&gt;A Bit of History&lt;/h2&gt;

&lt;p&gt;Relevance was founded in 2003 by a couple of guys. We've been steadily building the company around some core principles, some of which are obvious to anybody who knows us or surfs our site: agile is better than not-agile, sharp tools are better than dull ones, communication is better than documentation and/or confrontation, and that a small team of dedicated people with passion about their work can create more value faster than 20 bored ones.  &lt;/p&gt;

&lt;p&gt;There are other principles that aren't so obvious, though. For example, Relevance only succeeds if we challenge our team, and we can only challenge them if we support them through the challenges.  So Relevance believes strongly in shared ownership and a good work/life balance.  We believe that open source is a vital cog in the machinery of the modern economy; cooperation around core ideas can lead to more innovation and better competition.  We donate 20% of our time to open source or pro bono work, both to benefit our team and our various communities.  &lt;/p&gt;

&lt;p&gt;Delve deeper, and there are even less obvious principles: businesses should be about the task of generating wealth, sustainably.  That means that the business shouldn't exhaust its resources -- long-term success depends on cultivating them instead. Further, it shouldn't externalize its costs, but account for them.  We want to be intimitely tied in to our local community, and we want to be responsible citizens.&lt;/p&gt;

&lt;h2&gt;Acceleration&lt;/h2&gt;

&lt;p&gt;Over the course of 2008 and early 2009, we began seeking out customers and projects that would allow us to express our values more directly.  We built &lt;a href="http://runcoderun.com" title="Instant CI for Ruby"&gt;RunCodeRun&lt;/a&gt; not only because we love testing so much, but because we love open source, too.  RunCodeRun provides free continuous integration to open source Ruby projects.  That's because we think they deserve this kind of support, too, and we know they can't pay for it.  We sought out customers who share our values and who like open, transparent communication as much as we do.  We built a team that cares deeply about these things.&lt;/p&gt;

&lt;p&gt;In early 2009, though, things really began to pick up.  We added a focus on sustainability and, for lack of a better word, "green" technologies.  As an Environmental Science and Policy major at Duke, I always thought I'd end up working at the EPA.  I ended up in the private sector, though, and I've come to realize that you can achieve sustainable value working in a for-profit organization. Profit is the fuel that keeps the engine revving.  I'd love to find a way to bring the way we work back to organizations like the EPA, though (anybody at the EPA listening?).&lt;/p&gt;

&lt;p&gt;After deciding internally on that direction, stuff started happening. We met Danvers Fleury of &lt;a href="http://converdant.com"&gt;Converdant&lt;/a&gt;, a consultancy helping companies achieve sustainability and community involvement goals while ensuring sound business practices.  We also began to work with a customer (who shall remain anonymous for now) whose entire business is built on these principles. Both of them, simultaneously, recommended we check out B Lab and the B Corporation site.  A few short weeks later, &lt;a href="http://www.bcorporation.net/relevance" title="Relevance's B Profile"&gt;we were certified&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;B Lab and Our Customers&lt;/h2&gt;

&lt;p&gt;The "B" in B Corporation stands for "beneficial" (or "benefit", depending on context).  Certified B Corporations:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
 &lt;li&gt;meet transparent and comprehensive standards of social
  and environmental performance;&lt;/li&gt;
 &lt;li&gt;legally expand their corporate responsibilities to
  include consideration of stakeholder interests; and&lt;/li&gt;
 &lt;li&gt;amplify the voice of sustainable business and for-profit
  social enterprise through the power of the unifying
  B Corporation brand.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;  

&lt;p&gt;The goal of B Lab (the non-profit behind the certification) is to one day create a nationwide legal designation to go along with the existing S and C Corporations.  In the meantime, certified B Corps have to amend their articles of incorporation to "&lt;a href="http://www.bcorporation.net/become/legal" title="Legal Process of Becoming B"&gt;redefine the best interests of the corporation to include the consideration of employees, consumers, the community and the environment&lt;/a&gt;."&lt;/p&gt;

&lt;p&gt;When I first started to look into &lt;a href="http://bcorporation.net"&gt;B&lt;/a&gt;, I didn't think we had what it took to get certified.  The survey is very broad, and the scoring is unforgiving.  Without a processing or manufacturing arm, would we have enough to score well on the environmenal and sustainability scale?  Since we don't have a supply chain, could we do well enough on local sourcing? How would our software company compare to a community organizer, or financial institution, or organic soap manufacturer? &lt;/p&gt;

&lt;p&gt;As it turns out, pretty well.  Our focus on the well-being of our team, coupled with initiatives and partnerships we've entered into locally, combined to get us over the survey hurdle.  Then, in conversation with our customers and B Lab, it turns out that we are not only a match for the community based on our survey score, but that we also help fill an underserved niche in the B Community: software services. &lt;/p&gt;

&lt;p&gt;We believe strongly that software professionals have the most leverage to effect change in today's economy.  What industry do you know that doesn't use software?  What other services organizations can touch as many varied business processes and practices as software? Knowing that technologists have such wide reach, it felt really good to see how we might begin to use that reach in conjunction with a community of like-minded organizations.&lt;/p&gt;

&lt;h2&gt;What Next?&lt;/h2&gt;

&lt;p&gt;So what does it mean going forward?&lt;/p&gt;

&lt;p&gt;We are the same company we have always been. We chose to become a B Corporation because it represents the values we already hold. For those of you with whom we have worked in the past, nothing has changed. We build and audit applications for people and train developers; that's what we do, and if you need a kick-ass team who delivers value and believes in transparent business relationships, give us a &lt;a href="http://thinkrelevance.com/contact" title="919.442.3030"&gt;call&lt;/a&gt;.  &lt;/p&gt;

&lt;p&gt;We are going to continue to make Relevance the best company we can make it. That means acting on our values and using our success to provide value back to the community.  It means working with our customers to find hidden value in their data, or their processes, that might be being overlooked.  It means challenging ourselves to uphold our core principles, and seeking to apply them in each of our partnerships.  &lt;/p&gt;

&lt;p&gt;And it means challenging our friends and colleagues to think about whether they should be exploring what it means to be B.  &lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/cBsXf_vzJLA" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.thinkrelevance.com/2009/4/6/relevance-becomes-a-b-corporation</feedburner:origLink></entry>
  <entry xml:base="http://blog.thinkrelevance.com/">
    <author>
      <name>stu</name>
    </author>
    <id>tag:blog.thinkrelevance.com,2009-04-04:10979</id>
    <published>2009-04-04T15:05:00Z</published>
    <updated>2009-04-04T15:08:30Z</updated>
    <category term="Clojure" />
    <category term="clojure" />
    <category term="programming clojure" />
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/P_d9Kkt7_VA/programming-clojure-beta-9-is-out" rel="alternate" type="text/html" />
    <title>Programming Clojure Beta 9 Is Out</title>
<content type="html">
            &lt;p&gt;Programming Clojure Beta 9 is &lt;a href="http://www.pragprog.com/titles/shcloj/programming-clojure"&gt;now available&lt;/a&gt;. We are almost done, and most of the changes in this Beta are small.&lt;/p&gt;

&lt;p&gt;What's new:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the notation conventions have changed to make console output and REPL results more distinct                            &lt;/li&gt;
&lt;li&gt;a new subsection covering functions on vectors&lt;/li&gt;
&lt;li&gt;a new subsection on sort functions&lt;/li&gt;
&lt;li&gt;an example using map with more than one collection&lt;/li&gt;
&lt;li&gt;an example using the :while option to a sequence comprehension&lt;/li&gt;
&lt;li&gt;examples now use the new letfn form where appropriate&lt;/li&gt;
&lt;li&gt;replicate is gone -- use repeat instead&lt;/li&gt;
&lt;li&gt;an index!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I have also made the book more strict in discussions of laziness. Clojure sequences are lazy, but function evaluation is eager. In the Clojure community we often ignore this distinction, saying things like "iterate is lazy" when we really should say "iterate returns a lazy sequence." The book now uses the latter formulation.&lt;/p&gt;

&lt;p&gt;To make sure you have the latest, greatest version of the sample code from the book, go and grab the &lt;a href="http://github.com/stuarthalloway/programming-clojure"&gt;github repo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thanks again to everyone who has been offering feedback. Keep the &lt;a href="http://www.pragprog.com/titles/shcloj/errata"&gt;feedback coming&lt;/a&gt;!&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/P_d9Kkt7_VA" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.thinkrelevance.com/2009/4/4/programming-clojure-beta-9-is-out</feedburner:origLink></entry>
  <entry xml:base="http://blog.thinkrelevance.com/">
    <author>
      <name>rob</name>
    </author>
    <id>tag:blog.thinkrelevance.com,2009-04-02:10972</id>
    <published>2009-04-02T15:44:00Z</published>
    <updated>2009-04-02T15:45:39Z</updated>
    <category term="hiring" />
    <category term="jobs" />
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/JrMX2ZwnPMw/seeking-two-ruby-rails-experts-for-a-client" rel="alternate" type="text/html" />
    <title>Seeking Two Ruby on Rails Experts for a Client</title>
<content type="html">
            &lt;h2&gt;CollectiveX is Hiring, and we are Helping&lt;/h2&gt;

&lt;p&gt;One of our first Ruby on Rails clients, &lt;a href="http://www.collectivex.com/" title="CollectiveX - Create a Groupsite for Work, Life, Anything"&gt;CollectiveX&lt;/a&gt;, is looking to hire two Ruby/Rails experts in the Washington DC area.  CollectiveX is an established, funded startup providing a collaboration platform for companies and groups.  You can read more about their platform and success at &lt;a href="http://venturebeat.com/2008/09/08/collective-x-re-launches-groupsites-facebook-to-nings-myspace/" title="Groupsites, a white-label social network with a productivity bent &amp;amp;raquo; VentureBeat"&gt;VentureBeat&lt;/a&gt; and &lt;a href="http://www.techcrunch.com/2008/09/07/collectivex-groupsites-20-its-not-that-sexy-but-groups-and-organizations-will-love-it/" title="CollectiveX Groupsites 2.0 Makes Group Organization Sexy"&gt;TechCrunch&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We are handling the screening and interview process for these candidates.  Both positions require developers who have built &lt;em&gt;big&lt;/em&gt; apps in Rails before with established, active user communities.  The full job descriptions are below.  If you think you would be a good fit for either position, please email us a resume at &lt;a href="mailto:collectivex-jobs@thinkrelevance.com"&gt;collectivex-jobs@thinkrelevance.com&lt;/a&gt;.  Tell us why you would be a good fit, what big apps you've worked on, and what open source you have contributed to.  Expect to be interviewed as if you were you interviewing for a full time Relevance position, which includes a full day of pairing at our North Carolina office if you pass the initial screenings.&lt;/p&gt;

&lt;h2&gt;Two Rubyists Needed: Director of Software Engineering and Senior Rails Developer&lt;/h2&gt;

&lt;p&gt;Our team wants you if you are a passionate, motivated technical leader and Ruby developer ready to take things to the next level.  You should have exceptional communications skills including experience working with executives, engineers and users.  You must also know consumer web products and have a knack for improving existing web products.&lt;/p&gt;

&lt;p&gt;In the Director role, we will look to you to prioritize and lead software development based on business objectives and evolving user needs.  You must be an experienced lead developer or development manager with experience working in a fast paced, rapidly changing environment that demands focus and grace under pressure.  &lt;/p&gt;

&lt;p&gt;In the Developer role, you will collaborate with the technical team to develop software and applications to support the CollectiveX back-end technology.  &lt;/p&gt;

&lt;p&gt;These are hands-on roles for someone who wants a leadership role while remaining deeply technical day in and day out.  The existing application is a mature Rails code with a large active user base.  It needs technical leaders who can act decisively and quickly to learn the current code base, handle any critical business features or defects, all while planning and implementing future releases.&lt;/p&gt;

&lt;p&gt;CollectiveX is a profitable startup building a platform that sits at the intersection of online groups and listservs (Yahoo! Groups), collaboration software (MS Sharepoint) and social networks (LinkedIn, Facebook).  Our core application has been live and growing in users since 2006.  We pay great salaries (plus stock options), are led by a CEO who has founded previous successful startups, and have an established team and proven business model.&lt;/p&gt;

&lt;h3&gt;Key Responsibilities&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Maintain and monitor the production environment; troubleshoot and resolve issues&lt;/li&gt;
&lt;li&gt;Leading software teams for key projects, product development, testing and implementation&lt;/li&gt;
&lt;li&gt;Work with executive, marketing, design and engineering team members to define and prioritize new products and features and then lead the way in feature development&lt;/li&gt;
&lt;li&gt;Ensure the timely launch of features&lt;/li&gt;
&lt;li&gt;Coordinate code reviews with our development partner and team members&lt;/li&gt;
&lt;li&gt;Develop feature enhancements internally, including analysis, design, programming, QA, deployment, and support, in an iterative, pragmatic manner&lt;/li&gt;
&lt;li&gt;Translate product vision into technical reality&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Requirements&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;At least 8 years progressive development experience. 4 most recent in some sort of lead developer role (i.e. tech lead, chief architect, senior developer) &lt;/li&gt;
&lt;li&gt;A proven track record of implementing high-performance, high-traffic, high-availability, and highly-scalable systems for a consumer website&lt;/li&gt;
&lt;li&gt;Experience in a 24x7 e-commerce environment, including payment systems&lt;/li&gt;
&lt;li&gt;Advanced expertise in all things Ruby and Ruby on Rails - experience in releasing and/or maintaining open source code, deploying large applications, memcache, working/starling, and TDD/BDD are welcome&lt;/li&gt;
&lt;li&gt;Solid experience in the following skill areas: HTML, CSS, JavaScript (plus related frameworks), MySQL&lt;/li&gt;
&lt;li&gt;Experience building RESTful web services APIs for developers and integrating third-party web service APIs&lt;/li&gt;
&lt;li&gt;Extensive experience performance tuning web applications in a Linux environment&lt;/li&gt;
&lt;li&gt;Experience in C, Perl, Java, and other languages a plus&lt;/li&gt;
&lt;li&gt;Experience with project management tools and/or bug tracking tools&lt;/li&gt;
&lt;li&gt;Energized by the opportunities and challenges of a start-up&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Please Do Not Apply If&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Your largest web application was 5000 lines in Rails (or equivalent sizes in Java, Python, etc)&lt;/li&gt;
&lt;li&gt;You have never needed to use memcache (or similar tools) to scale an app&lt;/li&gt;
&lt;li&gt;Your only real world experience with Ruby or Rails includes demo apps and side projects&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Logistics&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;We are located in the Baltimore-DC area&lt;/li&gt;
&lt;li&gt;We want candidates who can be on-site and in our office, though we are very open to partial telecommuting once you are established&lt;/li&gt;
&lt;li&gt;Email &lt;a href="mailto:collectivex-jobs@thinkrelevance.com"&gt;collectivex-jobs@thinkrelevance.com&lt;/a&gt; with the role you are best suited for, and why you would rock at it.&lt;/li&gt;
&lt;/ul&gt;
          &lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/JrMX2ZwnPMw" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.thinkrelevance.com/2009/4/2/seeking-two-ruby-rails-experts-for-a-client</feedburner:origLink></entry>
  <entry xml:base="http://blog.thinkrelevance.com/">
    <author>
      <name>glenn</name>
    </author>
    <id>tag:blog.thinkrelevance.com,2009-04-01:10966</id>
    <published>2009-04-01T18:10:00Z</published>
    <updated>2009-04-01T18:10:51Z</updated>
    <category term="Ruby" />
    <category term="micronaut" />
    <category term="ruby" />
    <category term="tdd" />
    <category term="testing" />
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/epDApqNfWv4/micronaut-innovation-under-the-hood" rel="alternate" type="text/html" />
    <title>Micronaut: Innovation Under the Hood</title>
<content type="html">
            &lt;p&gt;Last week, &lt;a href="http://blog.thinkrelevance.com/2009/3/26/introducing-micronaut-a-lightweight-bdd-framework"&gt;Rob announced Micronaut&lt;/a&gt;, our new BDD framework written by &lt;a href="http://spicycode.com/"&gt;Chad Humphries&lt;/a&gt;. I’ve been itching to write about &lt;a href="http://github.com/spicycode/micronaut/"&gt;Micronaut&lt;/a&gt; as well, and my take on it is similar to Rob’s, although I start with a very different perspective.&lt;/p&gt;

&lt;p&gt;It’s a little surprising that I’m excited about Micronaut. I’m sort of a Ruby old-timer, and I’ve never been that excited about RSpec or any of the other Ruby test frameworks that have appeared over the last few years. Yes, they offer some advantages in some cases, but I’ve always seen the improvements as incremental rather than revolutionary. I like RSpec’s facilities for structuring tests, but &lt;code&gt;should&lt;/code&gt; never struck me as a radical improvement in expressiveness. In fact, I frequently run into situations where I think a well-crafted assertion is &lt;em&gt;much&lt;/em&gt; clearer than a &lt;code&gt;should&lt;/code&gt; expression.&lt;/p&gt;

&lt;p&gt;I just never got the BDD religion, in other words.&lt;/p&gt;

&lt;p&gt;What I like about Micronaut is that its innovation is mostly &lt;em&gt;under the hood&lt;/em&gt;, rather than on the surface. Rather than designing some new variation on how we express our tests, Chad opted for RSpec compatibility and built a really nice engine for loading and running RSpec-style tests. Architecture matters, and Micronaut’s architecture is a joy.&lt;/p&gt;

&lt;p&gt;First of all, as Rob noted, Micronaut is small, easy to understand, and &lt;em&gt;fast&lt;/em&gt;. That makes it fun to hack on, and great to use on projects. It also gives me confidence; simple tools tend to be more robust, and I want that in my testing tool.&lt;/p&gt;

&lt;p&gt;Second, Micronaut’s architecture provides a lot of flexibility. To illustrate that, while attending talks at &lt;a href="http://qconlondon.com/"&gt;QCon&lt;/a&gt; a couple weeks ago, I added test/unit compatibility to Micronaut. Here’s a short example that mirrors &lt;a href="http://blog.thinkrelevance.com/2009/3/26/introducing-micronaut-a-lightweight-bdd-framework"&gt;Rob’s example&lt;/a&gt; from last week, but in a test/unit style:&lt;/p&gt;

&lt;pre class="ruby"&gt;&lt;code class="ruby"&gt;require 'micronaut/unit'

Micronaut.configure do |config|
  config.filter_run :focused =&amp;gt; true
end

class MicronautMetadataTest &amp;lt; Micronaut::Unit::TestCase

  # 'testinfo' allows declaring metadata for a test, and works
  # like Rake's 'desc' method: it applies to the next test.

  testinfo :focused =&amp;gt; true
  def test_this_will_definitely_run    
    assert self.running_example.metadata[:focused]
  end

  def test_this_never_runs
    flunk &amp;quot;shouldn't run while other specs are focused&amp;quot;
  end

  testinfo :pending =&amp;gt; true
  def test_this_is_pending
  end

  testinfo :speed =&amp;gt; 'slow'
  def test_too_slow_to_run_all_the_time
    sleep(10000)
    assert_equal 4, 2+2
  end
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I don’t know how interesting test/unit compatibility is in its own right. I certainly wouldn’t claim that the example above is superior to the RSpec equivalent. But it was a fun exercise to really prove Micronaut’s design. It only took a few hours (of partial attention) and it clocks in at under 200 lines of code (plus &lt;code&gt;assertions.rb&lt;/code&gt; from the test/unit codebase). I love the idea of the testing API and the test execution engine not being so tightly coupled. And it might be very useful if you have existing tests written with test/unit and you’d like to gain the benefit of Micronaut’s metadata support.&lt;/p&gt;

&lt;p&gt;Which brings me to Micronaut’s best feature. Almost all unit-testing frameworks incorporate some support for &lt;em&gt;test suites&lt;/em&gt;, but suites have never lived up to their promise. It would be nice to have tests organized in suites for distinct purposes, but the setup and maintenance costs associated with suites have meant that very few teams make good use of them. Micronaut’s metadata is a different—and much better—solution to the same problem. As some have noted, the idea is similar to &lt;a href="http://cukes.info/"&gt;Cucumber’s&lt;/a&gt; support for tags. Just attach metadata of your choice to Micronaut tests or examples, and then you can use that metadata to select what tests are run in different situations.&lt;/p&gt;

&lt;p&gt;At the moment, test/unit compatibility is only available in &lt;a href="http://github.com/glv/micronaut/"&gt;my fork&lt;/a&gt; of Micronaut. It allows using RSpec-style &lt;code&gt;describe&lt;/code&gt; and &lt;code&gt;it&lt;/code&gt; blocks alongside test/unit-style test methods, and supports &lt;code&gt;test&lt;/code&gt; blocks à la &lt;a href="http://github.com/jeremymcanally/context/tree/master"&gt;Context&lt;/a&gt; and &lt;a href="http://api.rubyonrails.org/classes/ActiveSupport/Testing/Declarative.html"&gt;ActiveSupport&lt;/a&gt;. I don’t think we’ll pull this completely into Micronaut; I think it would work better as a separate gem. But I’d love to get your feedback about the whole idea.&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/epDApqNfWv4" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.thinkrelevance.com/2009/4/1/micronaut-innovation-under-the-hood</feedburner:origLink></entry>
  <entry xml:base="http://blog.thinkrelevance.com/">
    <author>
      <name>rob</name>
    </author>
    <id>tag:blog.thinkrelevance.com,2009-03-26:10957</id>
    <published>2009-03-26T19:00:00Z</published>
    <updated>2009-06-13T18:41:43Z</updated>
    <category term="Rails" />
    <category term="Ruby" />
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/Cb1kFCPGIlA/introducing-micronaut-a-lightweight-bdd-framework" rel="alternate" type="text/html" />
    <title>Introducing Micronaut, a Lightweight BDD Framework (Or, Reinventing the Bestest Wheel Yet)</title>
<content type="html">
            &lt;p&gt;Relevance is releasing a new Behaviour Driven Development (BDD) framework, even though the Ruby community already has great tools like RSpec, Shoulda, and Context.  Let me tell you why.&lt;/p&gt;

&lt;p&gt;When I joined Relevance in 2007, I led a conversion from test/unit to &lt;a href="http://test-spec.rubyforge.org/test-spec/" title="RDoc Documentation"&gt;test/spec&lt;/a&gt;.  It was an easy win - we could use &lt;code&gt;"expected.should == actual"&lt;/code&gt; syntax, which was nice, and using strings instead of &lt;code&gt;"test_foo_bar"&lt;/code&gt; methods is huge.  We wrote &lt;a href="http://github.com/relevance/spec_converter/tree/master" title="relevance's spec_converter at master - GitHub"&gt;spec-converter&lt;/a&gt; to ease the conversion, went from test/unit to test/spec, and everyone was happy.  &lt;/p&gt;

&lt;p&gt;Enter 2008: RSpec gains momentum and we see its API stabilize; meanwhile we continue making little tweaks and hacks to our fork of test/spec.  I added focused spec support, which basically means you change your "it" to a "fit", and that spec will run in isolation in your suite.  This was a major deal for staying in flow with large and/or slow suites - if you have 15 broken specs, focus on the simplest one and make it pass, pick the next failing spec, lather, rinse, repeat.  Once you are used to having focused specs, it becomes hard to go without them.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://spicycode.com/"&gt;Chad Humphries&lt;/a&gt; joined Relevance in mid-2008, and brought with him a passion for RSpec.  We had some "differences of opinion" when it came to RSpec vs. test/spec.  I wanted support for focused tests and a small codebase that lent itself to extension; Chad wanted things that "just worked" from RSpec and the community of tools and knowledge that exists for it.  At the time, test/spec also had some quirks that RSpec had already solved, like &lt;code&gt;before&lt;/code&gt; blocks not inherited for nested describes, and better Rails support.&lt;/p&gt;

&lt;p&gt;So Chad went off into a desert around Thanksgiving of last year and came back with Micronaut written on stone tablets in about a week.  It was lean, mean, API-compatible with RSpec, and well under 2000 lines of implementation code.  It can also be extended very easily to support focused specs, or slow specs, or ignored specs, or any other kind of metadata you would ever want in your suite.  Each example (an "it" block, aka a spec) and each behavior (a &lt;code&gt;describe&lt;/code&gt; block) accepts metadata as an options hash, which you can use to do just about anything you want -- filter what runs at runtime, tweak which modules get included/extended, or change the before/after blocks that evaluate.&lt;/p&gt;

&lt;p&gt;A short example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gem 'spicycode-micronaut'
require 'micronaut'

Micronaut.configure do |config|
  config.filter_run :focused =&amp;gt; true
  config.alias_example_to :fit, :focused =&amp;gt; true  
end

describe "Metadata support in Micronaut" do
    it "this will definitely run", :focused =&amp;gt; true do
      self.running_example.metadata[:focused].should == true
    end

    it "this never runs" do
      raise "shouldn't run while other specs are focused"
    end

    fit "this is also focused via the fit alias" do
      true.should_not == false
    end

    it "this won't run, its pending", :pending =&amp;gt; true do
    end

    it "this is also pending, with the no block style"

    it "this spec takes *real* long and should only run when we want to take the hit of slow specs", :speed =&amp;gt; "slow" do
      sleep(10000)
      2+2.should == 4
    end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Micronaut's metadata system is the next logical step in testing tools.  Focused specs in test/spec was a small, fairly ugly, pragmatic hack.  Micronaut makes metadata a first class citizen.  True metadata becomes really important when you get into more significant codebases.  You want this sort of power at the smallest level of granularity in your suite -- the individual example - as well as at higher levels.  In Micronaut, metadata at the higher level of a &lt;code&gt;describe&lt;/code&gt; block collapse down to nested &lt;code&gt;describe&lt;/code&gt;s and examples within &lt;code&gt;describe&lt;/code&gt;s, with lower level metadata always "winning" in the merge.&lt;/p&gt;

&lt;p&gt;Micronaut is designed to be easily hackable and extendable, while staying small enough that you can easily find the right extension points and modules you want to change.  It has made my day-to-day dev experience more effective and more enjoyable, because I really want to be able to &lt;strong&gt;own&lt;/strong&gt; a tool so fundamental to my daily work as my testing tool.  Although Micronaut is still pretty young and the internals are still evolving, the external API should remain fairly stable.  Micronaut has been in real-world, production use on at least three Relevance client applications, many of our open source tools, and on the RunCodeRun codebase.&lt;/p&gt;

&lt;p&gt;It is important to point out that we really like RSpec and continue to use it and support it.  The state of BDD tools in the Ruby world owes a lot to David Chelimsky and team for their work on RSpec, and we love seeing the RSpec codebase get leaner and meaner as &lt;a href="http://blog.davidchelimsky.net/2009/1/13/rspec-1-1-12-is-released" title="David Chelimsky - rspec-1.1.12 is released"&gt;components get extracted out&lt;/a&gt; and &lt;a href="http://blog.davidchelimsky.net/2009/3/14/rspec-rspec-rails-ruby-1-9" title="David Chelimsky - rspec/rspec-rails/ruby-1.9"&gt;Ruby 1.9 support matures&lt;/a&gt;.  We also think tools like Shoulda, Bacon, Context are all good, because choice is a "good thing" for the entire Ruby open source community.&lt;/p&gt;

&lt;p&gt;If you deal with larger codebases, or struggle with staying in flow in autotest, or just want to try a lean and mean BDD library, give Micronaut a try.  The quick and easy way to try it is via the GitHub gem:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gem install spicycode-micronaut --source http://gems.github.com
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then drop the above example into a file to start playing.  You can also &lt;a href="http://github.com/spicycode/micronaut/tree/master" title="spicycode's micronaut - GitHub"&gt;check out the codes&lt;/a&gt; on GitHub, &lt;a href="http://relevance.lighthouseapp.com/projects/22819-micronaut/overview"&gt;file feature ideas and bugs&lt;/a&gt; on Lighthouse, &lt;a href="http://runcoderun.com/spicycode/micronaut" title="micronaut - spicycode : RunCodeRun"&gt;verify the build passes&lt;/a&gt; on RunCodeRun, and above all let us know what you think!&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/Cb1kFCPGIlA" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.thinkrelevance.com/2009/3/26/introducing-micronaut-a-lightweight-bdd-framework</feedburner:origLink></entry>
  <entry xml:base="http://blog.thinkrelevance.com/">
    <author>
      <name>stu</name>
    </author>
    <id>tag:blog.thinkrelevance.com,2009-03-03:10941</id>
    <published>2009-03-03T23:10:00Z</published>
    <updated>2009-03-03T23:11:43Z</updated>
    <category term="agile" />
    <category term="continuous integration" />
    <category term="forking" />
    <category term="git" />
    <category term="github" />
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/dPDARbi1ka8/fork-everything" rel="alternate" type="text/html" />
    <title>Fork Everything!</title>
<content type="html">
            &lt;p&gt;It is now reasonable for some agile teams to fork most or all of their dependencies. Here's Why:&lt;/p&gt;

&lt;h1&gt;A Brief History of Forking&lt;/h1&gt;

&lt;p&gt;Traditionally, forking a software project was a big deal. You forked when you disagreed about direction and philosophy. Disagreed &lt;em&gt;a lot&lt;/em&gt;--so much that you have were willing to make a big effort to do things your own way. And while forking didn't have to imply bad blood between forkers and those getting forked, that was sometimes the case as well.&lt;/p&gt;

&lt;p&gt;So what is the big forking deal? Forking causes problems at several levels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API Compatibility: How does a prospective user of a library deal with multiple forks with differing APIs.&lt;/li&gt;
&lt;li&gt;Quality: If there are multiple forks of a project, how do you know which one is good?&lt;/li&gt;
&lt;li&gt;Configuration: How do you track dependencies when multiple forks of a project have the same name.&lt;/li&gt;
&lt;li&gt;Documentation: What's the difference between the forks?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And, of course, all of these problems increase for larger code bases--possibly faster than linearly with code size.&lt;/p&gt;

&lt;p&gt;So, for a long time, it was safe to assume that forking was a &lt;em&gt;big deal&lt;/em&gt;, and best employed rarely.&lt;/p&gt;

&lt;h1&gt;Forking Pain&lt;/h1&gt;

&lt;p&gt;To understand what changed, it is best to go back and revisit the problems of forking and ask how they might be exacerbated or mitigated:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API compatibility is a problem that grows if API differences are large, or expensive to discover. On the other hand, API changes are much less of a problem when they are small, or cheap to respond to.&lt;/li&gt;
&lt;li&gt;Evaluating code quality is a problem if QA is expensive, &lt;em&gt;either&lt;/em&gt; for a library itself, or for the integration between that library and your system. On the other hand, if there was a cheap test that said "This fork of X works correctly with my project," then forking X yourself looks more reasonable.&lt;/li&gt;
&lt;li&gt;Configuration is a problem to the extent that it is expensive to track and manage forks. On the other hand, if you can easily review your dependencies, and switch between forks of a project in a few seconds, then configuration becomes less of a problem.&lt;/li&gt;
&lt;li&gt;Documentation is a problem. What if a fork fixes a problem, or adds a feature, but the documentation is not up to date? On the other hand, if there is a cheap way to discover what a fork does, then a buffet of forks to choose from can be a good thing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So forking is more reasonable, to the extent that dealing with API compatibility, code quality, configuration, and documentation/discovery is cheap and fast. Different people can reasonably disagree about "how cheap" and "how fast," but everyone should be able to agree that there is a continuum, and that particular development practices could make forking easier or harder. &lt;/p&gt;

&lt;h1&gt;Reaching a Tipping Point&lt;/h1&gt;

&lt;p&gt;Over the last several years, we at Relevance have participated in several trends, each of which lowers the cost of forking.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Good unit tests help with several of the items above. A good unit test suite will document the API and demonstrate the code's quality.&lt;/li&gt;
&lt;li&gt;Good integration tests make it cheap to discover API compatibility issues. A good integration test makes it easy to evaluate alternative configurations that use different forks of dependent libraries. Finally, a good integration test can quickly prove that fork X works with your project. &lt;/li&gt;
&lt;li&gt;Continuous integration helps you keep on top of the code health of a large number of projects. We developed &lt;a href="http://runcoderun.com/"&gt;RunCodeRun&lt;/a&gt; in part to keep all of our forked projects building cleanly. &lt;/li&gt;
&lt;li&gt;Low-ceremony languages make &lt;em&gt;everything&lt;/em&gt; smaller. Code is smaller and the tests are smaller. Documentation can be done almost entirely in the code itself.&lt;/li&gt;
&lt;li&gt;Test-driven development helps produce good APIs between subsystems, by making bad ideas painful during development. Good APIs have a smaller surface area, and need to change less.&lt;/li&gt;
&lt;li&gt;Distributed version control systems such as &lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt; make forking itself cheap and easy. More importantly, you can quickly update your configuration to switch between different forks. Also, it is much easier to manage merges and maintain your own personal fork that pulls needful pieces from multiple other forks.&lt;/li&gt;
&lt;li&gt;Relentless refactoring keeps code readable, so the prospect of evaluating a fork by reading or diffing its source code is much more palatable.&lt;/li&gt;
&lt;li&gt;Open source libraries and a culture of source-code deployment make it easy to manage all your dependencies at the source code level. Most of our Ruby projects &lt;a href="http://errtheblog.com/posts/50-vendor-everything"&gt;vendor everything&lt;/a&gt;, so it is a simple Git operation to switch to a different commit (or a different fork!) of any dependency.&lt;/li&gt;
&lt;li&gt;Social sites like &lt;a href="http://github.com"&gt;GitHub&lt;/a&gt; make it easy to discover and track forks of a particular project, and for many different forks to pull from each other. Tools like the &lt;a href="http://github.com/blog/39-say-hello-to-the-network-graph-visualizer"&gt;Network Graph Visualizer&lt;/a&gt; show how your fork differs from other forks, and can help you quickly locate commits you may be interested in.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The combination of all these factors makes forking &lt;em&gt;way&lt;/em&gt; easier than I would have believed possible, even a few years ago.&lt;/p&gt;

&lt;h1&gt;Fork Your Dependencies!&lt;/h1&gt;

&lt;p&gt;As a result of all these trends, we now &lt;em&gt;regularly&lt;/em&gt; fork the third-party dependencies in our projects. Imagine the following scenario: You are nearing a project deadline, and you discover a bug in a third-party library. Here are some possible reactions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The closed-source way: Call a paid support line for your commercial software, explain your problem to a drone, and hope for a fix in the next release 18 months out.&lt;/li&gt;
&lt;li&gt;The open-source way: Contact the project maintainers and convince them of the justice of your cause. If that is taking too long, and you are in a language that enables it, monkey patch.&lt;/li&gt;
&lt;li&gt;The "Fork 'em!" way: Fork the project and fix it yourself. The original owners can debate your ideas in their own time (or not). Who cares? You are back up and running.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The cost of forking is now low, that it isn't even limited to fixing critical bugs. We fork to fix minor bugs, to add features, or to make usability improvements to APIs. In short, any kind of change we might make in our &lt;em&gt;own&lt;/em&gt; code, we might also be willing to fork and make in somebody else's.&lt;/p&gt;

&lt;p&gt;If you had asked me 18 months ago if the "fork 'em" approach would work, I would have said "no," and written you off as a crank. Luckily, nobody asked me! &lt;a href="http://robsanheim.com/"&gt;Rob&lt;/a&gt; just started doing it, and quickly showed that it &lt;em&gt;worked&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Will this work for everybody? Absolutely not. You need to have a lot of other practices in place first. Otherwise, casual forking will only lead to trouble. But if you are running agile the right way, producing and consuming clean, tight, tested code, you may discover forking around is downright healthy for your code.&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/dPDARbi1ka8" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.thinkrelevance.com/2009/3/3/fork-everything</feedburner:origLink></entry>
</feed>
