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
  • Tools
  • Contact
    • Press Room
    • Press Releases
    • In The News
    • Press Kit
  • All
  • Labs
  • Standup
  • Tracker

Monthly Archives: March 2011

Pivotal Labs

Pivotal Labs, the Balanced Team and Adaptive Path welcome SXSW Attendees this Saturday for deLUX REdux

Pivotal Labs
Thursday, March 10, 2011

Last month at IxDA Interaction 11, we hosted an evening in our office in Boulder full of food, drink and discussion, to bring some of our learnings around Lean User Experience to the larger design community, and in particular to attendees of the annual international IxDA conference.

We had such a great time with it, and started so many great conversations, that we decided we had to do it again at SXSW. This Saturday, at Adaptive Path Austin, from 6-9pm, we’re hosting deLUX REdux, and you’re all invited. (Register at Eventbrite.)

Since we’ve been working with Eric Ries on his Lean Startup track this Saturday, we thought an event Saturday evening was a great way to share what we’ve learned with a wider community. And since we’re on the topic, why don’t you come see our own Parker Thompson on a panel with Eric at 9:30a, and join Janice Fraser from LUXr and myself on a panel at 12:30p with Dave McClure and Laura Klein.

So what is the event all about?

For the past year, we’ve been sharing ideas and discussing new ways to approach design and product development, to create better products, make happier customers, and reduce waste. We’ve been doing this while creating better integrated, more collaborative, more responsive teams. In that time, a number of us have been getting together on a regular basis to really sit down and discuss what works and what doesn’t, and to try to distill these ideas into principles and techniques that are repeatable and practical.

We’ve been itching to engage with the larger design community to start to break down the culture of Big Upfront Design, the Cult of the Rockstar Designer, and the culture of necessary infallability; to fight the blind application of Waterfall and to disrupt the antipatterns we’ve found so antithetical to effective collaboration with agile development teams; to encourage patterns that allow designers to embrace early customer feedback, and to test hypotheses quickly; and most importantly, to foster a deeper collaboration with the very folks who have the biggest impact on what we build. We’ve seen over and over that, when done correctly, a light-weight process gives designers more control, not less.

It’s out of this series of discussions that I first arrived at a framing of the problem space that I talk about in Enough Design, and it’s also through these sessions that we’ve found a growing community of designers, product people, enterprises and other developers who are working to develop better techniques for integrated product development. We’ve found the conversation immensely valuable in our practice, and we hope to learn and share with more of you.

So if you’re a designer in Austin for SXSW, or just someone who cares about usable techniques for bringing Lean principles into the development of compelling User Experience, come join us on Saturday for deLUX REdux. This is a free event, but space is limited, so please RSVP through Eventbrite.

Thanks so much to Adaptive Path for sharing their Austin office with us, and to everyone at LUXr, Hot Studio, Sidereel, Cooper, IDEO and the Balanaced Team for their help making this happen.

  • 0 Shares
  • Share on Facebook
  • Share on Twitter
Pivotal Labs

DRY Design Documentation

Pivotal Labs
Thursday, March 10, 2011

I believe it was in a conversation with Janice Fraser that I first started talking about DRY Documentation. It was certainly she (among others) who goaded me into actually writing this blog post. So I’m taking a moment on my WiFi-free (and generally amenity-free) United Airlines flight to SXSW to put pixel to screen.

DRYness is an age-old concept in the Agile space (to the extent that that’s possible in a space that’s only 10 years old itself) and it’s elegant in its simplicity. DRY simply stands for Don’t Repeat Yourself. The idea is that you should only do any one thing in code in only one place. If, for example, you are doing an interest rate calculation, don’t copy and paste the code from one place where you need it to another: instead, move that responsibility to an object that reasonably should be responsible for such things, and do that interest rate calculation only in that one place. The reasons for this being important are manifold, but perhaps the canonical reason is so that it’s easy to change: When the interest rate calculation changes, you don’t have to go digging through your code to find all the places you do it, and make sure you change them all consistently. Instead, you change the code in only one place.

Hopefully this is old hat for most coders now, and hopefully you, gentle reader, will forgive me my oversimplifcations and conflations. The point is one of simplicity.

So now, let’s shift focus to design documentation. The idea I’m trying to express when I talk about DRY documentation is one again of simplicity, though the drivers are perhaps a little different.

The mental model for truly DRY documentation is one in which every pixel on the page tells you something you didn’t know before. Of course, like DRY code, it’s worth being pragmatic. There are times when greater clarity can be gained by a certain amount of contextual restatement. But as a theoretical goal state, it’s still quite useful to picture a body of documentation in which every last line tells you something you needed to know about what you’re trying to build, and something you didn’t know from looking at any other line in the documentation.

What would we notice about a set of documentation that adhered to these principles? Well, first, and most obviously, it would probably be a lot shorter than the documentation we’re used to seeing. And that in itself is a benefit. Why? For a number of reasons. First, shorter documentation is in general easier to digest, and it’s generally easier to find the relevant bit of documentation in a shorter corpus, all else being equal. (And of course, document structure and readability play just as big a role in a short document as they do in a longer one.)

Shorter documents are also easier to revise and maintain. And it’s easier to find changes between versions, all else being equal. I talk sometimes about the 500 page PRD we got when we were developing one product, complete with two sets of revisions, also 500 pages each. Guess how easy it was for the developer to find the 2% of information that changed in each revision, and understand its implications to for the site? Guess how easy it was for the designer to be sure she’d changed everything consistently? In a DRY design doc, changes are more obvious, and more meaningful. Things jump out when they’re inconsistent. And they tend to be more consistent, because the designs implied are applied more consistently across the product in question.

This brings me to another favorite topic: Principled design. DRY documentation is a lot easier to develop (and it’s a lot easier to tell when your documentation is DRY) when your design is motivated by specific principles. For instance, when you decide, in the banking app you’re designing, that all checking account features will use Cerulean Blue for their accent color, and all savings account features will use Prussian Blue, a lot of nice things happen. First, design questions become much easier to answer. The new Maximizer Account we’ve just added is a kind of savings account. Great! We know it’s going to be Prussian Blue. (Or we can make a better informed decision that there should be a new point in the color family.) Second, it suddenly becomes a lot easier to document this fact. A one page style bible can capture this information, and when some new feature is implemented, it doesn’t take any intervention from the VxD to make sure the new bits have the right color choices. Third, when some new feature comes along, developers roughing it out can come up with a reasonable early approximation of what it should look like, because they have principles to apply, instead of PSDs to pore over, looking for a non-existent visual treatment for the new thing they’re just embarking on. This lets said VxD (and the IA) spend time tuning something that’s close, rather than restating the design principles they’ve got in their heads, in the form of some new PSD file.

A fourth virtue is that suddenly all these color choices (or typography choices, or IxD choices,) have consistency, a consistency that our dear End User can actually pick up on. They don’t end up feeling lost in a jumble of pretty colors, but start to associate the Prussian Blue with savings accounts, the Cerulean Blue with checking accounts, and, assuming the designer goes in this direction, that blue in general means cash accounts; green, stock and security accounts; reds and oranges, loans and credit accounts, or similar.

They may not be able to articulate why they know this, but they will perceive a solidity and purpose in the VxD, one that makes them feel safe and comfortable, and one that helps them use the application more effectively.

When coupled with a good domain model and a good information architecture, it suddenly gets a lot easier for the whole team to keep the design princples top of mind, and answer basic questions without having to consult a 500 page document, or even a 20-30 page set of wireframes and interaction designs. Hopefully they can answer most questions from a one or two page style bible, and by consulting the wireframe describing their grid system, and the one for the kind of module they’re working on.

Again, the point is not to pursue this ideal to an absurdist end, but rather to continually ask oneself: Could this documentation be simpler? Did I cover this already? Could an existing design concept apply to the new area I’m covering? Restatement in the service of clarity is always to be lauded. Unfortunately, in practice, most restatement in the form of long design documents is just waste: Waste in that the documentation must be produced; that it must be maintained; that it must be read; that it must be understood; and waste in that it tends to obscure the princples of the design in favor of the surface of the design.

And of course, another agile principle comes into play: Refactoring. Often a second use of a given design treatment exposes new boundary cases and new pressures on the design, and the initial design needs to be modified slightly to accommodate both the new and the old use case. This is usually a simplfying force, and one not to be resisted. Let the documentation live, and reflect the deeper underlying principles of the design you’re trying to express. Applied well, this rigor will help you to simplify and clarify your designs, and expose their essence.

When practiced well, DRY documentation will set you free, give you control and clarity, and communicate your design vision efficiently and clearly. It will also free your development team to do things more or less right the first time, and give them more time to work on the bits that need more love and attention.

Style Bible Example
An example of a one-page style bible, describing text treatments, spacing, backgrounds and grid structure in one digestible page.

  • 0 Shares
  • Share on Facebook
  • Share on Twitter
Sean Beckett

New Tech Talk: Artful Personalization

Sean Beckett
Thursday, March 10, 2011

RapLeaf is an aggregation service for personalization data. Their goal is to help companies gain insight into their customers, engage them more meaningfully, and deliver the right message at the right time. At the same time they want to help consumers understand their online footprint. Manish Shah of Rapleaf describes their offering.

See all our talks at http://pivotallabs.com/talks

  • 0 Shares
  • Share on Facebook
  • Share on Twitter
Sean Beckett

RPX Seeks Rails Developers in San Francisco

Sean Beckett
Wednesday, March 9, 2011

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.

RPX Corporation is looking for Rails developers to join their team in San Francisco. The full job posting follows

Founded in 2008, RPX Corporation created the first defensive patent aggregation service for operating companies tackling the growing problem of patent litigation asserted by non-practicing entities (NPEs). NPEs acquire patents solely for the purpose of licensing and infringement litigation, as opposed to originating them through research and development. RPX pre-emptively counters the NPE problem by acquiring patent rights in the open market, and provides them as a defensive aggregation for its members, who benefit from a license to the patents in the RPX portfolio. RPX members include some of the world’s best-known technology companies. RPX is a privately-held, venture-funded company located in downtown San Francisco near mass transit.

You will be responsible for designing and implementing systems including but not limited to web applications: both internal tools and customer-facing features. You will work with product management to evaluate requirements and deliver in an agile manner according to schedule. You will be responsible for the full lifecycle from design and coding through testing and deployment, working with other developers and the chief architect to follow and help evolve RPX’s development practices. We practice XP-style development, including pair programming, test-driven development, and continuous integration.

The ideal candidate is an experienced developer who enjoys working with business owners to discuss their needs, and strives to deliver a system that people love to use. You’re always interested in new technology that can help solve problems, and you keep up with what’s happening. Working at RPX, you’ll be with other very experienced developers, with access to tools and knowledge to help get the job done. We’re already using things like Rspec, Resque, EC2, Nokogiri, and more. You’ll get to work on a new MacBook in addition to the pairing station iMac, and our kitchen is well-stocked too.

Qualifications/Experience:

  • 3 or more years of software development experience
  • 1 year or more of Ruby on Rails experience
  • Strong experience working with databases such as PostgreSQL, MySQL
  • Comfortable doing front end (JQuery, Javascript, CSS) and back end development
  • Comfortable running applications in Linux environments
  • Believer in writing good and useful tests

Useful experience to have, but not required:

  • Experience and interest in analytics, reporting, and statistics
  • Source code control using git
  • Running applications on Amazon EC2
  • Passenger, Nginx
  • Ruby fun like Bundler, RVM, Resque, Nokogiri and the like
  • Linux system administration

If this sounds like you, email your resume to jobs-eng@rpxcorp.com.

  • 0 Shares
  • Share on Facebook
  • Share on Twitter
Danny Burkes

Standup 3/9/2011

Danny Burkes
Wednesday, March 9, 2011

Interesting

SFRuby Hack Nights

The San Francisco Ruby Meetup Group is hosting a hack night tonight. See the website for details.

Named scopes and includes

A pivot noted that, after an association was loaded via :include, application of a named scope to the association will result in a new query.

The moral- sometimes an :include is less efficient than loading the association separately. Mind your logs.

WADL

A pivot remarked on the existence of WADL, a sort-of SOAP-less version of WSDL, where you can describe a REST API in XML for machine consumption.

It’s 100% less SOAPy, but still just as <tag>gy.

  • 0 Shares
  • Share on Facebook
  • Share on Twitter
Pivotal Labs

New York City Standup Blogging Part 1

Pivotal Labs
Wednesday, March 9, 2011

And we’re only a few days behind! We’ll start it out with some helps on browser integration tests (everyone’s favorite topic).

Helps

“jQuery drag and drop browser integration test?”

There is a
drag_to
method which may be useful.

“jQuery file uploader bowser integration test?”

The jQuery file uploader seems to be so clever that a Pivot was having trouble testing it with Selenium. Suggestions?

Interesting Things

“will_not_paginate”

Kamanari is a new awesome-er pagination doohickey for Rails 3. Apparently it is making developers’ lives more awesome especially in regards to Ajax-y type things. Check it out!

“HTML is the new assembly”

Knowlesdog mentioned Slim as your new Haml alternative. For some reasons why it’s awesome, check out the github page linked above.

  • 0 Shares
  • Share on Facebook
  • Share on Twitter
Danny Burkes

Standup 3/8/2011

Danny Burkes
Tuesday, March 8, 2011

Interesting

RVM local/server version mismatch

A pivot noted that if you are using RVM in both your development and production environments, and you are using Capistrano for deployment, that you could encounter weird errors at deploy time like:

99: rvm_error: command not found
 ** [out :: app_user] /home/app_user/.rvm/scripts/rvm: line
121: __rvm_conditionally_add_bin_path: command not found
 ** [out :: example.com] /home/app_user/.rvm/bin/rvm-shell: line
26: rvm: command not found

These errors occur even after you follow the instructions at http://rvm.beginrescueend.com/integration/capistrano/.

The moral- make sure your RVM version numbers match in development and production.

  • 0 Shares
  • Share on Facebook
  • Share on Twitter
Pivotal Labs

Standup 2011-03-04: Beter Later Than Neverer

Pivotal Labs
Sunday, March 6, 2011

Ask for Help

“window.onhashchange doesn’t work in Android’s version of WebKit?”

The event exists, but it doesn’t ever get fired. Apparently this also happens in Mobile Safari. Does anyone know how to get it to work?

“What’s the latest and greatest replacement for acts_as_list?”

Apparently there’s no fabulous replacement for acts_as_list.

Interesting Things

  • Apigee to-go will make an API console for your site.
  • Ruby Gems 1.6.1 is out.
  • 0 Shares
  • Share on Facebook
  • Share on Twitter
Mike Barinek

Avro's Reflect Datum Writer

Mike Barinek
Sunday, March 6, 2011

As some of you may know, I’ve been writing a bit of Java in Boulder recently. Overall, it’s pretty exciting and a nice change from Ruby.

That being said, I’ve somewhat isolated our Java development to server-side components. I still consider Ruby/Rails to be the best solution for web application development, although recently had a need for Java.

Anyway, I’ve been playing around with Avro and I thought I’d share a small example that marshals a domain object to bytes. The bytes are later passed around several queues within application.


package com.barinek.devourer.avro;

import com.barinek.devourer.rest.resources.Activity;
import org.apache.avro.Schema;
import org.apache.avro.file.DataFileWriter;
import org.apache.avro.reflect.ReflectData;
import org.apache.avro.reflect.ReflectDatumWriter;

import java.io.ByteArrayOutputStream;
import java.io.IOException;

public class ReflectMarshaller {

    private final Schema schema = ReflectData.get().getSchema(Activity.class);

    public byte[] marshal(Activity activity) throws IOException {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        ReflectDatumWriter< Activity > reflectDatumWriter = new ReflectDatumWriter< Activity >(schema);
        DataFileWriter< Activity > writer = new DataFileWriter< Activity >(reflectDatumWriter).create(schema, outputStream);
        writer.append(activity);
        writer.close();
        return outputStream.toByteArray();
    }
}

The interesting bit is that I don’t have a .proto file or .json representation of the type. The Activity class is a Plain Old Java Object.

The above snippet is a candidate to replace some proto files, assuming the MicroBenchmark test suite passes.

Look for more Java posts in the near future.

Here’s an update with unmarshal and T params.


package com.barinek.devourer.avro;

import org.apache.avro.Schema;
import org.apache.avro.file.DataFileStream;
import org.apache.avro.file.DataFileWriter;
import org.apache.avro.reflect.ReflectData;
import org.apache.avro.reflect.ReflectDatumReader;
import org.apache.avro.reflect.ReflectDatumWriter;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

public class ReflectMarshaller {

    public byte[] marshal(Object activity) throws IOException {
        Schema schema = ReflectData.get().getSchema(activity.getClass());
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        ReflectDatumWriter< Object > reflectDatumWriter = new ReflectDatumWriter< Object >(schema);
        DataFileWriter< Object > writer = new DataFileWriter< Object >(reflectDatumWriter).create(schema, outputStream);
        writer.append(activity);
        writer.close();
        return outputStream.toByteArray();
    }

    public < T > T unmarshal(Class< T > returnType, byte[] bytes) throws IOException {
        Schema schema = ReflectData.get().getSchema(returnType);
        ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
        ReflectDatumReader< T > reflectDatumReader = new ReflectDatumReader< T >(schema);
        DataFileStream< T > reader = new DataFileStream< T >(inputStream, reflectDatumReader);
        Object activity = reader.next();
        reader.close();
        inputStream.close();
        return ( T ) activity;
    }
}

  • 0 Shares
  • Share on Facebook
  • Share on Twitter
Pivotal Labs

Standup 2011-03-02: Better Late Than Never

Pivotal Labs
Sunday, March 6, 2011

Ask for Help

“‘Teamcity formatter missing’ error?”

Any ideas how to work around a “Teamcity formatter error” message when running specs (using RSpec 2) in RubyMine?

” Paperclip breaks when a filename contains a ‘#’ character”

Apparently this has been fixed but not released?

Interesting Things

  • Selenium Conference is taking place in San Francisco on April 4-6.

  • MongoDB apparently stores pre-epoch dates as far-future dates and converts them back from future to past dates automatically. However, it does not convert them when searching or sorting.

  • 0 Shares
  • Share on Facebook
  • Share on Twitter

Topics

  • agile (783)
  • rails (117)
  • testing (90)
  • ruby (86)
  • ruby on rails (71)
  • jobs (62)
  • javascript (59)
  • techtalk (44)
  • ironblogger (42)
  • rspec (39)
  • bloggerdome (34)
  • productivity (34)
  • activerecord (30)
  • rubymine (30)
  • git (29)
  • gogaruco (29)
  • nyc (27)
  • design (24)
  • mobile (23)
  • pivotal tracker (22)
  • process (21)
  • cucumber (21)
  • jasmine (19)
  • ios (18)
  • tracker ecosystem (17)
  • webos (17)
  • objective-c (17)
  • fun (16)
  • android (16)
  • palm (16)
  • ci (16)
  • "soft" ware (16)
  • bdd (15)
  • tdd (15)
  • cedar (15)
  • rails3 (14)
  • performance (14)
  • css (14)
  • gem (13)
  • mouse-free development (12)
  • selenium (12)
  • goruco (12)
  • bundler (12)
  • api (12)
  • keyboard (11)
  • meetup (11)
  • railsconf (11)
  • nyc-standup (11)
  • capybara (10)
  • mac (10)
Subscribe to Community Feed
  1. ←
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. →
  • About
  • Case Studies
  • Team
  • Community
  • Careers
  • Tools
  • 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 >