Pivotal Labs

Main menu

Skip to primary content
Skip to secondary content
  • About
  • Case Studies
  • Team
    • Executives
    • Locations
      • San Francisco (HQ)
      • Boston
      • Boulder
      • Denver
      • London
      • Los Angeles
      • New York
  • Community
    • Blogs
    • Tech Talks
    • Events
  • Careers
    • Lifestyle
    • Principles & Practices
    • Benefits
    • FAQ
    • Apply
  • Contact
    • Press Room
    • Press Releases
    • In The News
    • Press Kit
  • All
  • Labs
  • Standup
  • Tracker

Monthly Archives: October 2012

Robbie Clutton

Building Confidence

Robbie Clutton
Wednesday, October 31, 2012

A build script and associated process of continuous integration (CI) combined are the heartbeat of an application. The build script provides a repeatable way of proving confidence in an application and the continuous integration maintains that confidence over time. The continuous and repeatable nature of these two essential practices enable a highly sought after skill for a software developer: laziness.

Over time the duration of a build script increases as more tests are added or validations are run over the source code. When this happens although a build can have run successfully confidence can be diminished through sidestepping the build. Here I will describe some practices I have found to work for projects I’ve been involved in.

In the following sections, each build is triggered by a successful build of the previous in order to create a pipeline.

Kicking things off

A CI server will usually poll a source control management (SCM) application to see if there are any changes on it and then retrieve the latest code and than run a build script. Some new CI servers can receive a web hook from the SCM to be notified when a repository has changed. The affect is the same in that both should trigger the first build.

Notifications and stopping the line

The strength of CI is enhanced if the team know when something has gone wrong. There are many forms of notifications including email, RSS, custom desktop applications and information radiators like Project Monitor. Whatever you choose, make sure it’s sufficiently annoying as your team should know when something has broken the build. If the team have a ‘stop the line’ mentality, this will also help keep the build going strong and giving confidence back to the team.

The Data Validation build

Applications generally allow validations to be placed within a database or within code, and when the occasion arises when data is changed without going through those validations, the data can be left in an invalid state, e.g. if a migration were run that didn’t go through the validation layer. The data validation build can take a copy of a production dataset (usually cleaned of sensitive data) and for each validation that it cares about, can run that against the dataset. This will show where a fracture has occurred between what the application thinks the data looks like and what the data actually is.

Tests and validations

Source code validations such as code quality metrics and static code analysis usually are quick to run and can be run alongside the tests which generally are hopefully also quick to run. Depending on the size of a test suite, a separate build may be considered for the journey tests. These are the ones that open a browser and generally test drive an application from the very outside of its edges. Everything that runs here should be green all the time, there should be no flakey/flickering tests here. These tests can pollute the confidence of a build by introducing too much noise into the signal that the CI servers are there to give to their teams.

Flakey tests

Flakey tests should be quarantined. These tests are noisy and if left in the main pipeline can diminish the confidence of the build. On a recent project the build took over an hour and would regularly fail due to one or two tests that had issues that we difficult to replicate on our developer machines. These tests would fail the whole build and it got to the point where someone would just trigger a build, or run multiple builds against the same revision to get at least one good build. This was not the intention of the of build. By separating those tests out the majority of the build would go through and then trigger the quarantined tests build. This build had an additional trigger where it would rebuild itself if it failed. This build took minutes instead of an hour to run, so would repeat a few times and then go green. This restored confidence in our build and enabled us to progress quicker.

Having a quarantined test build does not mean these tests are ignored. They are still part of the build pipeline and the final step in the pipeline will not be triggered until this build has gone green. Ultimately, this should not become a dumping ground and a team might even consider some trigger to fail the build automatically if there were over a given number of flakey tests within a run. This could enforce fixing, rewriting or finally deleting these tests if they are truly not giving the project any value.

Deployment

The final steps in the build pipeline is deployment to a staging server and the subject of automation is divided ground. With automation, deploy scripts become hardened and robust as they are tested again and again. Those deploy scripts may also include some sanity checks like loading the homepage and logging into the application to further enhance the feeling that when this build is green, things are good. However, with automation, there is no pair of eyes to make sure it looks good and to ensure that the small part of the application that has been changed is working as expected.

I believe the more automation the better. I want to know that when I make a checkin and that goes all the way through, then I want confidence that it’s done and ready to roll out.

Extra builds for extra confidence

[This section added November 1st, 2012]

The sections above describe a workflow triggered by a change in an applications source code but many applications depend on infrastructure or third party services. An application my be deployed on a given hardware infrastructure which itself is backed by a SCM for it’s configuration. The build pipeline could be triggered when the environment changes to make sure it’s still valid against the changes. It is also likely that at some point the code will change less frequently but still rely on integrations. This is why it is also important to consider having a ‘nightly build’ which tests these integrations. These will ensure the application behaves as expected against software as a service integrations. This build would be triggered at the same time every night, or once a week, just to ensure the stability of the maintained application.

Summary

Being able to trust the build is essential to a healthy project. That is the core reason for the build. The examples above may provide a framework to create or rebuild confidence in a build but these are not the only ways of doing so.

  • 0 Shares
  • Share on Facebook
  • Share on Twitter
Davis W. Frank

Getting Involved with Movember

Davis W. Frank
Tuesday, October 30, 2012

How do you jump on the Movember ‘stache wagon?

You start by singing up at Movember’s site. The fundraising platform is easy to use to gather donations and to promote your upper lip’s “progress” over the month.

Once you’re in, it’s time to promote. Take a picture of yourself and give a motivation. Download the iOS or Android apps for your phone and take pictures of your mo each day.

Spreading awareness is marketing – so work it! Let the world know how the mo’ effort is going. Use the Facebook and Twitter links to start the campaign in your feeds. Or send out emails – Movember gives you a custom URL for your page. Point all your friends, family and coworkers to your Mo Home Page so they can find out more and donate easily.

(Make sure they know that donations are tax deductible and that they’ll get a handy tax receipt.)

Remember that each time you’re asked about the dusting of fur on your face that you’re raising money for prostate and testicular cancer research and awareness. Expect to have lots of conversations like this over the month:

Person: Nice mustache!
You: Thanks! I’m growing it for the entire month of Movember. Care to donate to support testicular and prostate cancer?

Some Guy: What is that thing on your face?
You: It’s my mustache and it’s here to remind you to get your prostate checked. Did you know that 1 in 6 men will be diagnosed with prostate cancer in their life?

Best Friend Ever: Hey! Even better looking than last Movember! Where do I donate again?
You: You’re the best friend ever.

Get ready to shave on Thursday. And then don’t stop talking all month long.

  • 0 Shares
  • Share on Facebook
  • Share on Twitter
Davis W. Frank

Movember is here! Movember is here!

Davis W. Frank
Monday, October 29, 2012

Leaves have started to turn, Baseball has wound down, and my upper lip has started to twitch. Movember first is right around the corner.

What started as a bit of a joke has become a worldwide effort to teach everyone about “dude cancer.” Guys grow, friends and family donate, and we all talk a bit about men’s health issues, specifically prostate and testicular cancer.

So how, exactly, does this work?

Once you’re in, you…

  1. Wake up on Movember 1st and shave clean
  2. Don’t shave the mustache, don’t grow a beard, and don’t connect to the ‘burns
  3. Tell everyone who asks that you’re doing this for the dudes

Last year the 1.9M “Mo Bros and Mo Sistas” around the world collected over $126M (USD). Pivotal along with a group of clients and friends, raised over $40,000 of that.

Things are just getting ramped up and already the leaderboard has crossed $3.5M.

So it’s time for all of us to get growing!

  • 0 Shares
  • Share on Facebook
  • Share on Twitter
Aaron VonderHaar

Standup: 10/29/12: Underscore is sane again

Aaron VonderHaar
Monday, October 29, 2012

Interestings

  • Underscore 1.4.0 and 1.4.1 helpfully blow up when passed nil. Underscore 1.4.2 is sane again.
  • 0 Shares
  • Share on Facebook
  • Share on Twitter
Ben Moss

Means, Ends, Mocks, Stubs

Ben Moss
Saturday, October 27, 2012

When I was first learning Test Driven Development, I recall being pretty confused by the distinction between mocks and stubs. I remember reading explanations that were basically saying that stubs allow you to override the way an object handles a message, while mocks are basically the same thing but which also set an expectation that the overridden message is actually received in the course of the test.

While this made sense on a basic level, I struggled with understanding why you would use one versus the other. Mostly I failed to understand why you would use a stub when mocks can act as this “super stub” that not only gives you control over the executing code, but also act as verification that things are working as you’re expecting them to.

I can’t recall what I read, heard, or saw that finally made this make sense for me, but I wanted to try and explain my thinking as it stands now for others who may be struggling with the distinction.

One metaphor that occurred to me today is of the difference between means and ends. If we step away from worrying about code for a minute and think in terms of normal human interactions, this difference is pretty easy to explain.

When I am at the bar, and I say to the bartender “I’ll have a Manhattan,” the purpose of my statement is to get the bartender to make me a Manhattan. So, simple enough, we would say that the ends of my statement are to request that to the bartender.

What does that leave for the means? Well, the fact that I used my vocal chords instead of a sign language would be one, or choice of words that I used to express myself. These facts are incidental to me getting my drink, they belong to the context (belonging to a species and culture that communicates vocally, having a certain vocabulary and mannerisms in a certain language) I find myself in, but we can draw a distinction between my desire for a drink and the things I have to do to get one. Put me in a jungle in Mozambique and you’d probably observe quite a different range of behaviors in order for me to accomplish the same goals.

What does any of this have to do with mocking and stubbing, you may be wondering? Well, if we were to model the way I behave in this interaction in RSpec, we might come up with something like this:

it "can order a drink from a bartender" do
  speech = MeansOfCommunication[:speech]
  manhattan = Cocktails[:manhattan]

  ben = Human.new
  ben.desires << manhattan
  ben.primary_means_of_communication = speech

  bartender = Bartender.new
  speech.stub(:phrase_search).with(bartender, manhattan).
    and_return("I'll have a Manhattan")

  bartender.should_receive(:order).with("I'll have a Manhattan")

  ben.order_from(bartender)
end

A slightly complicated example, but I wanted to illustrate how the various incidental concerns we identified above are translated as distinct from the essential ones. The essential part of the interaction, that an order was placed expressing my desire, is set up with a mock expectation. The merely incidental part, the means by which I expressed my desire to the bartender, is represented with the stub on the speech object. We don’t really care in this situation how I was able to translate my desire through the medium of speech, what we care about is that expressed my desire to the bartender.

Another way I like to think of the difference between mocks and stubs is something called the Command-Query separation. The rule of thumb is that you should mock commands, while stubbing queries. If we think of this in relation to the example above, it maps directly to our distinction between means and ends. When we think of how we’re going to order the Manhattan, we query our brain, thinking to ourselves “what do I have to say to get this jerk to make me a decent Manhattan?”, and we come up with the right phrase. We use that phrase to make our command to the bartender, which is the essential part of the interaction.

We can understand the prohibition against mocking queries by trying to imagine what it would mean if we wanted to test how we interact with our speech center. Just thinking of phrases all day without saying them to anyone would be purposeless, precisely because it lacks any outward goal. Once we attach a goal to the querying, like coming up with our drink order, we end up implicitly testing our speech abilities through the ends that they are used for.

  • 0 Shares
  • Share on Facebook
  • Share on Twitter
Ash Hogan

Bedrocket Media Ventures is hiring for developers!

Ash Hogan
Friday, October 26, 2012

At Pivotal Labs, one of the services we provide our clients is helping them interview and hire. Pivotal Labs and our clients place a strong emphasis on Agile development and its many aspects: Pair Programming, Test-Driven Development, rapid iterations, and frequent refactoring.

Below are two job descriptions for Lead Software Developer and Front End Developer at Bedrocket Media Ventures. They are a disruptive media company looking to change the way people discover and consume great entertainment in the cloud. Their platforms are not only revolutionizing the way entertainment is created and distributed, they’re also inventing new forms of interactive programming that will drive the future of video storytelling. They’re a fast-growing, venture backed company that was founded by the co-founder of Huffington Post and the founder of multiple successful cable networks, and they’re building a radical team of creative thinkers and expert doers who are passionate about pioneering a truly new model for media.

Bedrocket Media Ventures is hiring – here’s why you want to work there:

Jobs at Bedrocket Media Ventures

Are you an amazing developer of web products? Do you love making beautiful, responsive applications? Are you a hacker that gets excited about finding the most elegant solutions to complicated problems? If you are a developer who thrives in a collaborative atmosphere, enjoys dynamic and evolving environments, knows how to handle an occasional curveball, and gets excited about building a new product, we want to hear from you!

Front End Software Developer

Job Requirements

  • Self motivation and the capability to operate independently
  • Work closely with designers to efficiently plan, implement, and test new features with minimal supervision
  • Optimize front end for existing and new features and work with back end developer to evolve the product
  • Work well in a modern agile software engineering environment (with source code control, dev/stage/prod release cycle, continuous deployment), as well as extensive testing
  • Responsible for being involved in overall end-to-end application development
  • Passionate about end-to-end and user experience design
  • Serve as the lead for all implementation, customization, and integration efforts
  • Identify and define integration points with third party solutions
  • Take pride in writing well maintained, tested, reusable code

Desired Experience

  • You have 2+ years experience building and shipping consumer or enterprise products for the web
  • Experienced with the Ruby language and the Rails framework, be proficient with the entire Ruby on Rails stack
  • Deep expertise with JavaScript, jQuery, Ajax, and HTML/CSS
  • You have a working knowledge and comfort developing UI and UX using Photoshop
  • You also have a working knowledge of test-driven development and related frameworks
  • Experience building native Android or iOS applications a plus
  • Qualifications B.A or B.S or relevant experience

Lead Software Engineer

All of the above, plus:

  • Oversee optimization of back end architecture for existing and new features and work with front end developer to evolve the product
  • Sound object oriented design skills and knowledge of application architecture patterns
  • Responsible for managing overall, end-to-end application development, including the API
  • You have 4+ years experience building and shipping consumer or enterprise products for the web

Bedrocket Media Ventures is an equal opportunity employer. Click here to apply, and include your resume and cover letter.

  • 0 Shares
  • Share on Facebook
  • Share on Twitter
Jonathan Berger

Remembering Common Biases in Customer Research

Jonathan Berger
Thursday, October 25, 2012

Recently, @seriouslynow pointed me to a nice primer on user research by @semanticwill. My favorite slide lists five common biases,

5 Common Biases in Customer Research

which are:

  • Confirmation bias (favoring data that supports your position)
  • Framing effect (asking questions in a way that influences the answers)
  • Observer-expectancy effect (influencing answers by the very act of posing the questions as a study)
  • Recency bias (overly weighing more recent data over less recent data)
  • False consensus (assuming everyone shares your point of view)

or “CFORF” for short. With a little rejiggering, we get a nice pneumonic:

  • False consensus (assuming everyone shares your point of view)
  • Framing effect (asking questions in a way that influences the answers)
  • Observer-expectancy effect (influencing answers by the very act of posing the questions as a study)
  • Recency bias (overly weighing more recent data over less recent data)
  • Confirmation bias (favoring data that supports your position)

as in, “Stick a FFORC in it!”

</ rimshot> :-P

  • 0 Shares
  • Share on Facebook
  • Share on Twitter
Ash Hogan

Routehappy is looking for a Ruby developer!

Ash Hogan
Wednesday, October 24, 2012

At Pivotal Labs, one of the services we provide our clients is helping them interview and hire. Pivotal Labs and our clients place a strong emphasis on Agile development and its many aspects: Pair Programming, Test-Driven Development, rapid iterations, and frequent refactoring.

Below is the job description for a Ruby Developer with routehappy. If you’re an airline geek and love to code, this is the ultimate job for you. routehappy is looking to make a huge impact on an industry badly in need of innovation. You can join the team of travel industry veterans and help make air travel fun again.

routehappy is hiring – here’s why you want to work there:

Hey Ruby developer!

We are looking for a passionate and dedicated Ruby developer to join our tech team in NYC. You’ll have the opportunity to improve and expand your skills while working alongside our lead developer. You’ll make an immediate impact building major features on Routehappy.com as well as API’s for our mobile apps and 3rd parties.

We prefer candidates with prior RoR experience, but would consider anyone with a strong grasp of programming principles and experience with an MVC framework such as PHP/Zend, Django, etc. Strong front end skills in HTML/CSS/JS are also a big plus.

You may be a good fit if you…

  • Have experience with Ruby on Rails
  • Have strong grounding in OOP and SOA principles
  • Don’t frighten at the site of an outer join.
  • Know what a closure is
  • “git checkout -b” your eggs in the morning.
  • Understand that hard work is a prerequisite for success
  • Love learning new things

What Routehappy offers…

  • Laid back environment
  • Casual dress
  • Flexible hours
  • Competitive salary + Equity
  • Free cupcakes (um…sometimes)

At Routehappy we know that to do their best work, developers need the best equipment. That’s why you’ll also receive a Macbook pro and thunderbolt display. There’s just no such thing as too many toys.

Our office is conveniently located at the WeWork startup co-working space in Soho – a short walk to tasty lunch spots and convenient to the 1 and A/C/E trains. We strongly prefer a developer that can work on-site at our NYC office, but would consider remote work for the right candidate.

Compensation is flexible. So show us you’ve got what it takes, and we’ll get you what you deserve.

Reply with a resume or LinkedIn profile.

  • 0 Shares
  • Share on Facebook
  • Share on Twitter
Charles Hansen

Hunting Memory Leaks in Backbone

Charles Hansen
Tuesday, October 23, 2012

Ever notice your backbone app slows down considerably after using it for a few minutes? Or maybe your event callbacks are called more than once each time the event fires? Or my favorite, Chrome runs out of memory if you have a few tabs open that have run your entire Jasmine suite? This means you have backbone leaks.

I just spent the last week hunting these down in a very large app. It turns out the problem is tractable with a few guidelines. None of this is ground-breaking, but I wanted to put it all in one place.

1) The object retaining tree in the Chrome heap profiler is amazing. Use it.

2) Restrict use of views in closures, or as contexts to callbacks in event bindings. This is explained in much more detail here. I’ve also personally found nothing but trouble with _.bind for similar reasons.

More specifically, never use model.bind or model.on in a view without keeping track of that binding and remembering to unbind it when you want to tear down the view. This is the motivation for coccyx

3) ParentViews with childViews need to keep track of their children. When you tear down the parent view, you also tear down the child views. Before implementing this step, the object retaining tree for my zombie views was shockingly large. Afterwards, it was a manageable ~4 retainers for the zombies.

Parents keeping track of their children seems simple enough, but it is easy to lose track of the little devils.

For example:

ParentView = Backbone.View.extend({
    render: {
        //render the rest of the view first

        this.collection.each(function(model){
            var childView = new ChildView({model: model});
            this.$("ul").append(childView.render().$el);
        });
    }
});

loses any reference to the child views, and they will almost certainly leak (assuming the child views bind events to their models that need to be cleaned up).

Using the principles names from coccyx, the same code needed to be rewritten as

ParentView = Backbone.View.extend({
    render: {
        //render the rest of the view first

        this.tearDownRegisteredSubviews();

        this.collection.each(function(model){
            var childView = new ChildView({model: model});
            this.$("ul").append(liView.render().$el);

            this.registerSubView(childView);

        });
    }
});

where tearDownRegisteredSubviews calls tearDown on any registered subviews. This way, the only child views still in memory are those initialized in the most recent call to render. Those remaining views should be torn down when the parent is torn down.

View.tearDown itself can be a bit sticky because you still have to worry about event bindings from global objects and other difficult-to-clean sources, but those solutions are more project-specific.

Hope that points you in the right direction.

  • 0 Shares
  • Share on Facebook
  • Share on Twitter
Jonathan Berger

Spike Driven Design

Jonathan Berger
Saturday, October 20, 2012

I’m really excited about a collection of new techniques I’ve been experimenting with over the past few weeks. They’re an evolution of the in-browser design approaches I’ve been using for the past few years, and taken together they help my team build better designs with less waste in a tactic I’ve taken to calling Spike Driven Design.

UPDATE: This is a blog-post version of the talk I gave last week at the Agile Experience Design / NYC SASS & Compass co-meetup. You can find the slides on my Talks page.

The Problem:

Traditional, Adobe-app-based design is great for designing before any software is built, for quickly iterating on user flows, and for experimenting with new high-level concepts. On the other hand, it suffers a heavy tax once working software exists and mockups have to play catchup with reality, and it does little to aid in designing interactions (Fireworks and Flash have an advantage over Photoshop and Illustrator in this regard, though they’re far from ideal).

Designing in the browser is great for working out low-level tactics, quickly iterating on interface and small interactions, and suffers almost zero set-up cost: install Firebug or tick the “Show the Develop menu” box in Safari’s prefs (or just install Chrome!) and you’re good to go. On the other hand, the toolset and techniques are immature, there’s a reasonably high learning curve, and the tools are tantalizingly close to the real app, but not quite there. Saving your work is difficult (to say nothing of iterating over a few ideas), and replacing text by hunting and pecking into Firebug fields gets old fast. For quick-and-dirty mocks, some light Firebug hacking, a screenshot, and a trip to Photoshop may suffice, but this workflow doesn’t hold up for prolonged investigations into a new user flow or feature track.

Enter Spike Driven Design. Rather than design in an Adobe app or even in the browser, I’ve taken to designing in Rails itself, using mostly SASS and HAML and little bits of Ruby. Whereas designing in the browser helped fake the front-end for mockups, it could never help with data. Now I can fake the back-end too! I’m not bothering with tests, and like any true Spike (in the Agile sense), this is code that is written to be thrown away. That gives me the freedom to move fast, focus on the UX and visual design problems without worrying about much else, and design using the actual medium the user will end up with: working software.

What’s a spike?

Plenty of ink has been spilled on the topic, but at heart, an Agile “spike” is a short investigation into a technique or a problem. For instance, when it comes time to build our Recommendations feature into my sample e-commerce site Hamazon, we might put a time-boxed chore into the backlog: “spike on recommendation algorithms and choose one”. By nature it’s explicitly exploratory and limited, and the goal is learning (rather than working software, the sine non qua of Agile development). After a spike is completed, the code must be thrown away. This is important: the imperatives to learn fast and to write healthy code are necessarily opposed, and the temptation to keep the code is always present. Resist it. Chuck the code. Now that you know the approach you want to take, write it again and write it right.

What’s SDD?

To start Spike Driving your design, branch the project, and begin to gleefully and recklessly hack around. For instance, if I were SDD’ing a new Order History feature for Hamazon, I’d want to have a bunch of orders to play with in my design. Instead of mucking around with a database and orders, I might just write a method called “orders” that returned a pre-canned list.

def order_history
        [
            {order_id: 102173, order_date: "8/1/2012", price_in_cents: 1799, item_name: "Snout T-Shirt", item_id: 1  },
            {order_id: 102384, order_date: "8/1/2012", price_in_cents: 3699, item_name: "Berkshire Ham", item_id: 2  },
            {order_id: 102930, order_date: "9/1/2012", price_in_cents: 1599, item_name: "Piggy Mug", item_id: 3  },
            {order_id: 103151, order_date: "9/14/2012", price_in_cents: 3699, item_name: "Berkshire Ham", item  _id: 2  }
            {order_id: 103944, order_date: "9/15/2012", price_in_cents: 2299, item_name: "Tactical Bacon", item _id: 6  }
        ]
end

Obviously this doesn’t get us closer to anything that helps a user, but it lets me start designing with real(ish) data, real quick. I’ll call #order_history in a view somewhere, get the list of orders on the page, and start marking up and styling them. I also might put a comment at the top of this message: # TODO: make this real. It’s kind of a shady move to push all the real work onto “someone will take care of this later”, but running a quick grep todo lets us see all real dev work that needs to be done.

While I’m playing around in the Orders History page, I notice that the navigation is going to need a link to the Order History for the User Flow to make any sense, so I’ll throw that in now. (An aside: it may be a little premature to commit any of this to git, but when you do start checking in your work, take care to keep your commits small and atomic.)

Ugh, now that we need secondary navigation, that bloated 60px header bar really needs to be trimmed down.

Let’s deal with that right now, hop into the appropriate stylesheet, and bring it down to 30px. As I work, I’ll play around with the interaction, navigating through a normal user flow, jumping into the Order History, and then back.

Hm, these order line items are starting to look ok, but they could use something a little more visual; how about some icons? Which, now that I look at it, should really light up on hover, so let’s create some assets. Oh, also, we’re probably going to want to be able to perform bulk actions on this list.

I don’t need to write a working form, I can just throw in the checkboxes and select lists in the appropriate places—they don’t have to be wired up to anything. Ok, this looks pretty good; the PM (who sits right next to me, and has been chiming in along the way) and I pull a dev over to run through this with him and make sure nothing sounds too crazy. Once we’ve got the rough ‘ok’ we can start writing well-formed stories in Tracker and take screenshots of the SDD site and attach them as mock ups. I’ll also create an epic called “SDD-order_history”, and attach a note mentioning where the branch lives and what I’ve done in it.

So that’s the rough version of Phase One. Now the fun begins. If I haven’t done so already, I’ll go back through my work in git add -p or GitX and break all my changes down into small, atomic commits. Generally, I’ll have a few kinds of commits:

  • Changes that require functional code and tests, and
  • Styling changes that can go right into the app.

Now I hop onto the master branch and start cherry-picking those styling commits: BOOM! Free style tweaks and polish! All the design fit-and-finish that I meant to write stories for and get to at some point are now done and in production.

Phase Two is when the devs get to the SDD’d stories in the backlog (which ideally is within a few days). There’s a comment pointing them to the branch, which they can check out as a renamed repo and then run on another port:

git clone git@github.com:jonathanpberger/hamazon.git hamazon-sdd-order_history
cd hamazon-sdd-order_history
... (bundle, set up db's, etc)
rails server -p5555

During development they’ll run the real app on port 3000 and do everything normally, but living, functional mock-ups exist for reference on port 5555. Furthermore, they can take a look at the code for ideas on things like structuring the DOM, and can even harvest things like SASS and assets from the branch. This means that a lot of the work from the design phase can go directly into the finished project, without duplication of effort, and without sacrificing quality.

When / Where?

So what sorts of projects and teams are good candidates for SDD? On this project, we’ve established the basic design of the app and have a while to go before we’ll need to do the Big Design Refactor. We’re building a fair number of small or medium-sized features or feature tracks, and it’s important that we make sure our additions work well within the existing app and user flows. We’ve got two pairs of developers (one of whom is off-site), plus me (a design-developer hybrid). Naturally, the designer employing SDD needs to be fairly technically literate. Another nice side effect of SDD is that the team is almost never odd. SDD stories pull me into the pair rotation in a non-time-sensitive manner, which helps smooth out rough spots in the rotation if someone has a doctors appointment or is interviewing a candidate. All of which to say, SDD seems to work well on projects that’re past their initial design phase, and have small- to medium-sized teams with a technical designer.

Problems w/ SDD

So what problems exist? Because of the technical requirements, there’s a high learning curve for the designer. It feels a little risky (shady even?) to push real work into comments saying “make this real”. There’s a potential for non-production quality code to leak in when. The SDD branch tends to get stale quickly. If you try to go back to it two weeks later the main line will have moved on, and these merge conflicts tend to be especially thorny because they’re usually very similar to changes you since will have made.

Despite these shortcomings, SDD has proven to be an effective technique for our team. We look forward to continuing to explore this way of working, and especially to hearing if it works for others.

  • 0 Shares
  • Share on Facebook
  • Share on Twitter

Topics

  • agile (781)
  • rails (113)
  • testing (88)
  • ruby (83)
  • ruby on rails (70)
  • jobs (62)
  • javascript (55)
  • techtalk (44)
  • rspec (38)
  • ironblogger (32)
  • productivity (30)
  • activerecord (29)
  • gogaruco (29)
  • git (28)
  • nyc (27)
  • rubymine (26)
  • bloggerdome (23)
  • mobile (22)
  • process (21)
  • pivotal tracker (21)
  • cucumber (20)
  • design (19)
  • jasmine (19)
  • ios (18)
  • webos (17)
  • objective-c (17)
  • android (16)
  • tracker ecosystem (16)
  • palm (16)
  • "soft" ware (16)
  • fun (15)
  • ci (15)
  • cedar (15)
  • rails3 (14)
  • performance (14)
  • bdd (14)
  • gem (13)
  • css (13)
  • tdd (13)
  • selenium (12)
  • goruco (12)
  • bundler (12)
  • meetup (11)
  • railsconf (11)
  • nyc-standup (11)
  • capybara (10)
  • mac (10)
  • mojo (10)
  • chef (10)
  • api (10)
Subscribe to Community Feed
  1. 1
  2. 2
  3. 3
  4. →
  • About
  • Case Studies
  • Team
  • Community
  • Careers
  • Contact
  • Labs
  • Events

Contact Us

contact@pivotallabs.com
+1 415-77-PIVOT
TwitterLinkedInFacebook

Pivotal Tracker

Tracker is the award-winning agile project management tool that enables real-time collaboration around a shared, prioritized backlog.
Visit pivotaltracker.com >