thoughtbot New Bamboo is now part of thoughtbot

Read the announcement

The Bamboo Blog

Our thoughts on agile development and web technology

  1. Gwyn Morfey

    Shared Risk: Our Agile Contract


    At XP day, I said that we no longer put any reference to scope in our contract. I was immediately challenged to explain, and targeted by a 'Heatseeking Action' - a practice we'd introduced only a few minutes ago - to do so by 12:03 on Thursday. So here are the details.

    The contract represents a tiny subset of the communication that happens when a project starts up. By the time the contract's signed, we've agreed a vision, run a stories workshop, prioritised the backlog, drawn up risk factors, discussed likely velocity, and drafted an approximate release schedule. Collaboration is more important than contract, but - particularly for senior stakeholders - contract is still important, so here's what's in ours:

    Continue reading

  2. Gwyn Morfey

    Scrum Check: Stay Focused


    Scrum Check is one of the tools that Laurie and I presented at XPDay on Monday. It’s a short checklist that helps multitasking scrum masters to prevent any of the Scrum basics from slipping. For best results, take once daily, preferably by turning in a slow circle from your desk.

    In fact, for best results, write your own. But as a starting point, here are the questions that I’m currently using:

    Each day

    • Can you see the taskboard?
    • Does it have a full set of stories/tasks?
    • Does the client know what’s been committed to on the board?
    • Has it been updated since yesterday?
    • Are there 'you are here' arrows?
    • Are there stories awaiting done-done checking?
    • Can you see the burndown?
    • Has it been updated since yesterday?
    • Is it under the glideslope?
    • Can you see the release plan?
    • Do you know what’s likely to be in the next iteration?
    • Are most of next iteration’s stories now unblocked?
    • Has there been a daily stand-up?
    • Can you see the demo date? Is everyone who’s needed attending?
    • Can you see the product owner's name and contact details?
    • Does the team believe in what they're building, and why?

    Continue reading

  3. Laurie Young

    Chain of Fools


    What do you do when you have one person who is the repository of knowledge for a critical part of your project, infrastructure or similar.

    You need some way to address this situation, otherwise that poor person will go mad dealing with other peoples problems, never feel free to go on holiday, and if they get hit by a bus you really are in trouble.

    Steven Williamson at youDevise told me a cool technique they use to fix this problem, they use Horace. Horace in this case referred to a stuffed toy. A woolly mammoth to be precise.

    The one guy who knows everything about, for example the CI system, gives Horace to someone. He gives it to someone who does not know anything about the CI system, a “fool”, who while intelligent, has no knowledge of this CI system works.

    Continue reading

  4. Makoto Inoue

    Real time online activity monitor example with node.js and WebSocket


    Update 23rd March 2010: Today we're announcing Pusher, a new realtime client push service. Sign up for the beta now

    Here at New Bamboo, we specialise on Ruby On Rails web development. However, we started talking more and more about exciting things happening around HTML5 and javascript during morning standup (where we talk about all the cool things we are working/have discovered) , lunch time and our company hack day.

    The latest hot topic is node.js. Some of us went to Full Frontal Javascript Conference and were very excited by the power and potential of node.js which Simon Willison (Django core team) introduced there. Simon describes node.js as “A toolkit for writing extremely high performance non-blocking event driven network servers in JavaScript”. I highly recommend you to read his blog post, “Node.js is genuinely exciting”

    Continue reading

  5. Bartosz Blimke

    Stubbing and Setting Expectations on HTTP Requests Is Now Easy With WebMock


    I’ve been working recently on a Ruby application which was making HTTP calls to a remote service. We chose rest-client as a client HTTP library. We needed some way of testing the behaviour we were going to implement.

    We wanted to run our tests in isolation, without making any real requests over the Internet.
    One obvious option was to use some mocking library to stub rest-client methods and set expectations on them. Doing this is always a pain. You usually end up testing the implementation instead of behaviour.

    If you use Net::HTTP directly then to spec code like this:

    res = Net::HTTP.start("", 80) {|http|

    Continue reading

  6. Damien Tanner

    The Bamboo Hackday


    About a week ago we tried something new in Bamboo HQ. We had a hack day. This was a day we had set aside in advance where we didn’t schedule any client work to be done. In the days leading up to it we filled up a whiteboard with ideas to hack on during the day.

    We didn’t really know what to expect because we’d never done it before, but it actually went really well. We had a scrum as usual in the morning, where people had a final opportunity to ‘pitch’ their ideas to get others to work on it. Some people joined forces to collaborate on ideas, whereas others worked on their own.

    We had a couple of opportunities to ask others for help during the day in the form of mini-scrums, but it mostly went pretty smoothly, because everyone is fairly versed in the idea of self organising teams.

    Continue reading

  7. Damien Tanner

    Updating our blog


    This week we ported our blog from Jekyll to (and I mention this anticipating a wave of WTFs) a custom rails solution we built in a few hours. The reasons for doing so were numerous, however the primary one was that it was causing a blocker for people writing posts.

    Over time, and much to our surprise, we found that it is much easier to log into a web system to create a post than mucking around with the technical tools we use on a daily basis.

    Instead of simply writing cool stuff, we were spending too much time getting Jekyll installed on people’s computers, running into permissions issues with our deployments and generally cursing loudly. The net result that people were saying they couldn’t be bothered.

    Continue reading

  8. Max Williams

    Thoughts on Kiwi.js in relation to Sammy.js


    A little while back, I posted about Sammy.js and how it had simplified the way I was designing client side applications. In the meantime, my usage has grown to the point where I need a bit more structure, in a similar way to how an application originally built in Sinatra may at some point be moved to Rails to take advantage of some of the conventions there.

    With this in mind, I have been looking for something to represent the ‘Model’ aspect of my application to abstract some of the Ajax requests. What I found last week was Kiwi.js which aims to provide the m the v and the c for the client-side world. I have spent some time this weekend investigating Kiwi, and really like the way it works (see appendix).

    Continue reading

  9. Gwyn Morfey

    The Lego Game


    At Scrum Gathering we presented a lego game that we use to teach prospective clients about agile projects. We’ve run this game twice internally and once with live clients. There’s quite a detailed structure below, but running the game involves a lot of improvisation; really, it’s about throwing up the same set of obstacles both times, and showing how an agile approach makes them less painful.


    • Box of lego
    • Specification document
    • Pile of story cards
    • Pile of fake cash


    One trainer, 3-6 players

    Run 1: Waterfall

    Estimation phase (2 mins)

    Give the players the Specification. Ask them to agree on an estimate (2 mins). Then ignore the estimate and write the actual phase timings (10 min / 2 min) on the Specification.

    Build phase (10 mins)

    Give the players some of the lego bricks and ask them to start building. Halfway through the build phase, give them the rest of the lego bricks. Two minutes before the end, announce that the deadline has been shortened by one minute. Make the process of getting answers to questions difficult and time-consuming - for example, questions and answers must be in writing. Stand on the other side of the room.

    Acceptance testing (2 mins)

    Look for symmetry, colourscheme, size, etc. Find some defects:

    • Wheels? ("it's a plane.. how will it land? you should have inferred it from the specification")
    • Pick a colour (eg red) that's retrospectively not allowed ("it's not in the spec? But we never use red. Marketing hates it.")
    • Announce an "emergency rebuild, since the project is late".

    Emergency rebuild (2 mins)

    Final Assessment

    Add up fines for defects at £100M per minute late (which is actually wrong, and may provoke contract arguments), and £50M per defect. Hand over the remaining cash.

    Run 2: Scrum

    Initial planning (2 mins)

    Join the players. You’ll be playing as both SM and PO. Hand them the story cards, along with a statement of vision. Help them move the cards into swim lanes and write estimates on them, then plan the first 3-minute sprint.

    Sprint 1 (3 mins)

    As soon as a player reaches for a red brick, stop them - no red in the project.

    Continue reading

  10. Bartosz Blimke

    Solving a Problem of Non-Working Key Forwarding With Capistrano


    After I upgraded my Mac to Snow Leopard, Capistrano deployments with key forwarding stopped working. I started getting a following error:

    Permission denied (publickey)

    My fellow Bambinos enlightened me that key forwarding was switched off by default in Snow Leopard. The solution was to change the following two lines in /etc/ssh_config:

    #Host *
    #ForwardAgent no

    to the following two lines:

    Host *
    ForwardAgent yes

    Unfortunately after this change I was still getting Permission denied (publickey) error.

    Today I found the root cause. My ssh key was not added to the authentication agent so the key was not forwarded. The solution was to execute the following command:

    Continue reading