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
Jeff Hui

[SF] Standup 7/21/12

Jeff Hui
Tuesday, August 21, 2012

Interestings

  • Always call jasmine.Clock.useMock() after anything that uses setTimeout or setInterval (e.g. _.throttle)

This is smallest example that reproduces the problem we saw in our codebase:

describe(”underscore”, function() {
var foo, throttledFoo;

beforeEach(function() {
jasmine.Clock.useMock(); // bad!

var Mod = Backbone.RelationalModel.extend({});
var Col = Backbone.Collection.extend({model: Mod});
new Col([{selected: false, trashed: false}]);

foo = jasmine.createSpy();
throttledFoo = _.throttle(foo, 500);

// jasmine.Clock.useMock(); // good!
});

it(”should 1″, function() {
throttledFoo();
});

it(”should 2″, function() {
throttledFoo();
});

it(”should 3″, function() {
});

it(”should 4″, function() {
});

it(”should consistently pass but doesn’t”, function() {
expect(foo.calls.length).toEqual(0);
throttledFoo();

expect(foo.calls.length).toEqual(1);

throttledFoo();

expect(foo.calls.length).toEqual(1);

jasmine.Clock.tick(501);

expect(foo.calls.length).toEqual(2);

});
});

  • 0 Shares
  • Share on Facebook
  • Share on Twitter
Whitney Schaefer

[Standup][SF] 08/20/12

Whitney Schaefer
Monday, August 20, 2012

Interestings

  • Capybara/Selenium wait_for_ajax is your friend

A good generic wait until the last AJAX call has returned before moving on to your next assertion. Solved a lot of unstable-in-ci Capybara specs for us

http://agilesoftwaretesting.com/selenium-wait-for-ajax-the-right-way/

  • 0 Shares
  • Share on Facebook
  • Share on Twitter
Matt Royal

And that’s the week!

Matt Royal
Friday, August 17, 2012

Interestings

  • http://www.realtime.co

Cloud realtime messaging, simple javascript API.

Many fancy demos like realtime mouse [1]. 1 Dollar per 1 Million messages after surpassing the free 1 Million.

[1] http://www.realtime.co/business/demos/demo/mouselive

  • Factory Girl Traits

They are awesome, check them out.

  • 0 Shares
  • Share on Facebook
  • Share on Twitter
Ryan Spore

Please sir, I want some more pizza

Ryan Spore
Thursday, August 16, 2012

Interestings

  • Where’s my last bit?

    1.9.3p194 :019 > (2**62).class.name
    => “Bignum”
    1.9.3p194 :020 > (2**62 – 1).class.name
    => “Fixnum”

Q: Why is this not 2**63?
A: Fixnum object ids are the odd numbers, eg, 2.object_id = 5. This means you run out of bits one bit early.

  • 0 Shares
  • Share on Facebook
  • Share on Twitter
Matt Royal

He’s coming to the party?!

Matt Royal
Wednesday, August 15, 2012

Helps

  • Jasmine Gem HEAD and undefined JSON

We’re trying to use the latest jasmine with ci_reporter, and jasmine complains that json is undefined. We’re unclear why it would disappear with an additional task being loaded?

Anyone seen this before?

Running “rake && rake jasmine:ci” should fix this

  • Anyone have experience writing FFI in Ruby?

crickets

Interestings

  • Capybara Webkit on Lobot

If you’ve successfully installed Qt >= 4.6 on CI, Jenkins might fail because bundler is unable to build capybara-webkit, raising the following error in the log:

[code]
Installing capybara-webkit (0.12.1) with native extensions
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.
[/code]

If this happens, ensure that you have qmake in your PATH, since it is needed by the capybara-webkit build script.

  • Version 1.2.1 of the Jasmine gem is out
  • 0 Shares
  • Share on Facebook
  • Share on Twitter
Ryan Spore

Get your volunteering hand ready

Ryan Spore
Tuesday, August 14, 2012

Helps

  • Nesting separate rails apps

What’s the best way to do a request test against another rails app in a separate directory?

We want:

  • not to deal with separate processes
  • to be able to use nice capybara test matchers (i.e. visit “/other_service/foo” and page.should have_content(”other service title”) )
  • for it to work on CI well

Should we use a Rack middleware?

Capybara Servers and Pow seemed like good solutions, Engines not so much. Also trying to run integration tests with the adaptors and stub adaptors in other tests.

Events

  • Today’s Tech Talk: The Psychology Behind Pair Designing

Folks from the outside can register on EventBrite to come. Lunch is included.

There will be opportunities to get up on stage and pair live with Karl.

Summary:
More design clarity. Less redesign time. What if methods like Pair Design could increase the efficiency of your team and the quality of your products? Karl Dotter will explain his hypothesis on Pair Design, how he is helping teams practice pair design to build great products and what to do to start practicing pairing with members of your team. You’ll also find out how to participate in P.A.I.R (Pairers Against Inefficiency and Rework), a fun research program he’s working on which will help quantify the benefits of Pairing.

  • eXtreme Tuesday

Weekly eXtreme Tuesday returns again! 6:30 in the presentation space.

  • 0 Shares
  • Share on Facebook
  • Share on Twitter
Matt Royal

SF Standup – Left Handers Day

Matt Royal
Monday, August 13, 2012

Interestings

  • Be sure to close your connections inside an Enumerator

Since the block in an Enumerator has its own Thread context and thus connection, be sure to close it at the end od the block.

  • 0 Shares
  • Share on Facebook
  • Share on Twitter
Will Read

Postgres features n’ bugs

Will Read
Wednesday, August 8, 2012

Interestings

  • Potential Heroku/PG/hstore bug in 9.1.3

One of our tables was using an hstore to collect data (a really big json object). We discovered that the primary database on staging was using PG 9.1.3 while our acceptance & production apps were using 9.1.4. Pushing this very large (58K) object into the hstore caused a Postgres failure:

ActiveRecord::StatementInvalid: PGError: ERROR: cannot execute INSERT in a read-only transaction : INSERT INTO “xxxx” (”created_at”, “data”, “updated_at”, “user_id”) VALUES ($1, $2, $3, $4) RETURNING “id”

while saving the same data into our acceptance app did not cause the error.

We suspect that there is a bug in PG 9.1.3 when inserting “big” strings into an hstore that is fixed in 9.1.4.

We promoted a new 9.1.4 db on our staging app. This cleared our problem.

  • postgresql_cursor and streaming in rails

We were able to stream the contents of a table to the user without loading the whole dataset into memory.

  • RubyConf CFP ends Friday

It’s in Denver this year.

https://rubyconf2012.busyconf.com/proposals/new

  • 0 Shares
  • Share on Facebook
  • Share on Twitter
Brandon Liu

New Jasmine Gem

Brandon Liu
Friday, August 3, 2012

Helps

  • New Jasmine Gem

There’s a new version of jasmine-gem on GitHub – please test it out so we can push a new gem next week.

https://github.com/pivotal/jasmine-gem

  • jQuery opacity

Once the CSS opacity is set on an element with jQuery the z-index is no longer respected and the element appears on the bottom.

Leads:
Can it be reproduced in other browsers? Only tried Chrome so far.

Interestings

  • Safari doesn’t like Rails timestamps

my_model.created_at or my_model.create_at.to_i spit out values that when you (in JavaScript) new Date(value), give crazy dates in Safari.

The workaround is to use:

(Ruby)
value = my_model.created_at.to_f * 1000

(JS)
date = new Date(value)

Discussion:
Try all browsers when dealing with a Date API
There’s also DateJS, but has not been maintained in a long time.

  • Jasmine failed to start on latest Chrome

If you have an updated version of Chrome and jasmine fails to start Chrome, reinstalling later version of chrome driver (http://code.google.com/p/chromedriver/downloads/list).

Or alternative is to re-image the machine, which contains later Chrome and later ChromeDriver.

  • bitbucket Tracker integration broken by ‘&’ in author name

We spent several hours tracking down this (open) bug in bitbucket’s tracker broker. You can change the ampersand to something else in your git-pair script.

  • IE9 svg path click handler

IE9′s click handler for SVG paths treats two clicks as a single click and six clicks as a double click.

  • 0 Shares
  • Share on Facebook
  • Share on Twitter
Dan Podsedly

Velocity Matters

Dan Podsedly
Wednesday, August 1, 2012

Last week, we made a slight tweak to how velocity is calculated in Pivotal Tracker, to handle team strength overrides in a simpler, more explainable way. As a result, if your project has an adjusted team strength in a recent iteration, you may be seeing a slightly different velocity.

Details of how velocity is calculated, and how team strength affects it, are at the end of this post.

This seems like a good opportunity, though, to step back a bit, and revisit the velocity concept in Tracker and why it (still) matters. Read on, even if you’re an old hat to agile and Tracker!

What is Velocity?

First, let’s re-define what velocity is. Christian Niles, our iOS engineer, recently gave it an eloquent description (inspired by his recent relaxed strolls through the streets of Paris):

“Just like a speedometer that measures how fast you’re hurtling through space, Tracker’s velocity is a measurement of how fast your team completes stories. Instead of miles or kilometers per hour, Tracker expresses velocity as the number of points completed per iteration.

Because Tracker stories are assigned point values instead of due dates, Tracker calculates velocity by averaging the number of points you’ve completed over the past few iterations. In Tracker, past predicts future.”

It’s About the Conversation

Yes, velocity does give you a glimpse into the future, in the form of more realistic estimates of when milestones will be hit, at least compared to wishful due dates. It’s obviously just an approximation, though, and the velocity number itself is ultimately not very meaningful outside the context of a given project.

What’s really valuable are the conversations that story estimation encourages within development teams (and their product owners). Conversations that uncover all kinds of assumptions and hidden scope, and give the product owner the insight to make value decisions at every step (is that 5 point feature really worth it, is there a simpler alternative?), which all leads to leaner, better product, and a more direct path to the finish line.

Having a crisp, prioritized backlog of estimated stories, and a steady velocity, lets you have really constructive conversations with your stakeholders when facing that inevitable change to requirements. Dragging those new stories into the backlog gives you immediate feedback about how the scope increase will affect the future timeline and planned releases, and allows you to make tradeoff decisions (“ok, let’s move these other stories down so we can still make that milestone”).

These conversations are where all the important tactical decisions are made, and there will be many, as you keep learning as a team, and the world keeps changing on you. Each one takes you closer and closer to winning the battle (and shipping great software).

Consistency is Everything

Steady state allows you to predict, at least roughly, when your project will hit important milestones. This gives your business the ability to plan ahead and to make meaningful tradeoff decisions (usually scope vs time), as you discover more scope (and you always do). Predictability is rare in the software industry, and only comes when you get your project to that zen-like state of steady, consistent pace, measured by low volatility (of velocity).

Achieving low volatility takes an ongoing effort, but the practices that collectively yield it are worth the effort on their own merit. Break down large features into small stories (that fit into a single iteration), estimate as a team, maintain a constant ratio of features to bugs and chores every iteration, deliver stories continuously, and have your product owner highly involved, available, and accepting those stories daily.

Managing Team Fluctuations

Unless you’ve got a team of cyborgs, or perfected cloning technology, chances are there will be weeks when a big subset of the team is sick (yes, that achilles heel of pair programming), on vacation, at a conference, or it’s just the usual between the holidays lull with a skeleton crew.

The team strength feature allows you to plan for that (or account for it retroactively), in terms of velocity. For example, if half of your team leaves for a conference one iteration, you might set your the team strength of that iteration to 50%. Likewise, if your team works all weekend to prepare for launching your product, you would set the team strength to 140% (since they worked 7 days instead of a normal 5 day work week).

Check out a short video on team strength here.

You can also adjust the length of a single iteration, for situations such as the big end of year holidays. Or you can use it to effectively put your project on hold, by combining iteration length override with a team strength of 0%.

Just the Formula, Please

How velocity is calculated is fairly straightforward, it’s the sum of all ‘normalized’ points completed over a given set of iterations (based on project settings), divided by the combined length of all those iterations, in weeks. ‘Normalized’ points are the number of points the team would have completed in an iteration at 100% team strength.

velocity_per_week(iteration_1, ..., iteration_N) =
    SUM(iteration_i.points / iteration.team_strength) /
    SUM(iteration.length_in_weeks)

Iterations with a team strength of 0 are excluded from both sums.

The formula above always returns velocity per week. The project velocity Tracker displays is always multiplied by the default iteration length, and rounded down to the nearest integer. For example, if your iterations are 2-weeks long by default, Tracker will multiply the per-week velocity by 2.

Learning More

We’ve got quite lot of detailed information about velocity and related topics in the Tracker FAQ, as well as the Getting Started guide. In particular, take a few minutes to watch the Introduction to the Concepts video.

If something still isn’t clear, give us a shout!

p.s. thanks to Richard Jones for the awesome Millenium Falcon pic. we want one!

  • 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 agile Feed
  1. ←
  2. 1
  3. ...
  4. 7
  5. 8
  6. 9
  7. 10
  8. 11
  9. 12
  10. 13
  11. ...
  12. 79
  13. →
  • 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 >