Recent Posts

The Art of Delivery, part 2

May 22, 2008

Two years ago, I wrote an article titled, The Art of Delivery. I wanted to post a few updates based on how our process has evolved since then (and continues to).

Over the past few years, we’ve been fortunate enough to work on quite a diverse collection of projects. This has enabled us to work with many different clients and solicit feedback on our process. This has given us an opportunity to evolve a set of best practices that fulfills the long-term project goals/budgets of our client while making sure that we’re able to maintain a design and development process that is agile.

As I’ve mentioned in previous posts, our team typically bills work per-iteration on projects rather than per-hour or a flat-bid per-project. Since iterations are bite-sized pieces of the entire project and limited to 1-2 weeks, our teams estimates are much more accurate and we’re able to keep things rolling and on track.

stay on
track{width=”500” height=”333”}

The basic structure of our project looks like this.

  • A Project has many releases
  • A Release has many iterations
  • An Iteration has many deliverables
  • A Deliverable has many tasks

Before we begin working on an iteration, we outline a set of goals that we want to create solutions for. This process comes out of discussions between our client and us until we agree on what is the highest value/most critical to the success of the project, based on our shared understanding of where we are today. These goals translate into Deliverables, which in a typical iteration might require Interaction Design, Interface Design, or Development. We tend to break our process up into stages so that Interaction Design on Module XYZ would be implemented in a following iteration. This is because it’s unrealistic to expect someone to provide an accurate estimate on how long it’ll take to implement something before you know how people will interact with it.

Within any given iteration, our team is spread across several sets of deliverables. As a team, we breakdown these deliverables into smaller sets of tasks. It’s our aim to keep tasks smaller than a full days worth of work as it’s much easier to measure progress across the iteration when we can track tasks at a granular level.

Essentially, tasks are the individual steps needed to achieve these goals. We don’t go out of our way to list each one of those during an estimate process as some tasks take less time than it takes to generate an estimate for them. Each person providing estimates should avoid getting too granular and aim to find a good balance that compliments their workflow.

Like most things… mileage may vary.

Through this process, we can get calculate the estimated costs for each deliverable, which then provides us an cost for the entire iteration. In addition to deliverables, we also budget a set of hours/days so that we can be compensated for handling small requests, bug fixes, and project management. It’s important to factor these things into your process.

In future posts, I’ll discuss how we’re handling this process while working on multiple projects… as that’s where it can chaos can start if you’re not careful. ;-)

oops{width=”500” height=”333”}

How does your team work? As we’re always evolving our process in an effort so that we can be more efficient and speed up our delivery cycle, I’d love to learn from those in the community.

Boxcar on Twitter

May 22, 2008

We’re about to roll out some announcements for Boxcar, our professional VPS hosting solution for Ruby on Rails applications. As we roll out these new updates, we’re going to offer some extra special deals to those who are following us on twitter. :-)

If you want in on the action…

  • [Follow
`boxcar":http://twitter.com/boxcar * "Follow `planetargon](http://twitter.com/planetargon)

As usual, we’ll be posting some announcements on our blog as well… so be sure to subscribe to our feed.

Was away on vacation

May 11, 2008

It’s been quiet here the past several weeks and that’s because for the first time since I started Planet Argon, I was able to take an extended vacation.

IMG_8957{width=”500” height=”333”}

My partner and I headed to France (Paris, Nice, Lascaux II, and Bordeaux) for a few weeks. It was a first time for both of us. I’ve posted some photos on my flickr (vacation set).

Lascaux
II{width=”500” height=”333”}

I’d like to thank my amazing team for helping make it easy for me to take off for that much time. :-)

In any event, I wanted to post a few non-technical links…

([tastespotting](http://tastespotting.com) without the meat)
```ruby
-   [Robby's Muxtape](http://robbyrussell.muxtape.com/)
-   [Robby's Grabb.it](http://grabb.it/users/robbyrussell)
-   [Robby on twitter](http://twitter.com/robbyrussell)
-   [Robby's feedflix](http://feedflix.com/robbyrussell) (netflix
```text
queue/stats)

Link yours up!

In the coming weeks… I’ll be posting some more thoughts on Project Management, time management, and anything else that seems to come up. If there is anything you’d like me to write about, feel free to drop me a line with a request.

RubyURL meets Zombies!

April 22, 2008

Last Friday, Greg Borenstein sent me a link to ZombieURL after it got launched. The folks at Bottlecap Labs took RubyURL and threw in Zombies… the rest you’ll have to see for yourself.

There… I warned you.

You can check out the source code for ZombieURL on GitHub

You can also grab the underlying source code for RubyURL on GitHub.

I’d love to see what other fun things people come up with to do with RubyURL.

Review: Braintree

April 16, 2008

Zack Chandler (author of the TrustCommerce gem) writes..

“How do you like Braintree? I’ve haven’t used them yet but may in the future…”

Good question. I was actually planning to write up a quick review of their exceptional service because not many people know about them yet. Now is as good of a time as any.

We’ve been using Authorize.NET for over four years as it’s what our primary banking institution hooked us up with when we began researching merchant services. However, they didn’t provide us with some of the subscription-based management features that we found with some other payment gateways and we began referring our customers to TrustCommerce. We planned to switch over to TrustCommerce with the development of Cobalt (our new billing and hosting support platform).

After we began to set milestones for going live with Cobalt, I tried to get in touch with TrustCommerce. I was provided a demo account and really wanted to get in touch with their sales department to get an application.

…a week goes by. No response. So, I tried to contact them again. No response. tried again… and (yet) again… no response. To date, I have yet to hear back from them.

This was echoed by one of our consulting clients that said, “their support staff seems real responsive, but I can’t get ahold of anyone to actually get an account.” So, I planned to start looking at other options or stick with Authorize.NET.

..and then (as if they were listening to my thoughts)… I receive an email from Bryan Johnson, founder of Braintree, a payment processing company.

(snip)

“I am the founder of Braintree, a payment processing company. We provide credit card and electronic check processing, simplified PCI DSS Compliance through remote storage of credit card data, payment gateway/virtual terminal, etc. We’re a one stop shop.”

He goes on to introduce himself and explain that they’re really focused on subscription-based services, which is exactly what our new centralized billing app is handling.

So, since I hadn’t heard from TrustCommerce, I requested a demo with Braintree. We were able to take advantage of the hard work that has put into the ActiveMerchant project, which already works with Braintree. So, our application that we’d been focusing on integrating with TrustCommerce was just a few lines of code away from working with Braintree.

While I’m sure that many people have had great experiences with TrustCommerce (as I did when I worked with their support team while working client projects)… not being able to order an account isn’t doing them any favors.

So, we just launched and now running Cobalt with Braintree as our backend for managing recurring credit card processing. Their customer support has been great so far. In one case, I messed up some security settings and locked myself out and after they saw that I had failed to login a few times, I received a call from one of their support people. I didn’t prompt it… they took the initiative to call me. She said she’d look into it and called me back when she figured out what I had done wrong. :-)

On Monday afternoon, after I announced that we launched Cobalt on my blog, I got a congratulations from another of their developers who congratulated us and wished us the best of success.

So… Zack. To answer your question, “How do you like Braintree?”

My answer is… I think they’re fantastic so far. Their web interface for managing your account could use a few IxD eyes, but we like that it’s minimal and most importantly… the core functions of their product appear to be working great. Our team has now talked to roughly 5-6 different team members at Braintree and have nothing but great things to say about those interactions. Great customer service that definitely seems to echo that they want their customers to be successful and are here to do what they can to provide us with the tools we need to fulfill our goals.

I only wish that we had the same service from all of our vendors.

Bryan, thanks for introducing yourself. You have a great team.

  • [Be Careful that you don’t Stub your Big
Toe](http://www.robbyonrails.com/articles/2007/02/13/be-careful-that-you-dont-stub-your-big-toe)

Boxcar Conductor: Rails deployment made easy

April 15, 2008

In a previous post, I showed how we’ve been working on an interactive deployment process for Rails applications to reduce the time it takes to deploy to a Boxcar.

We began to move our Boxcar deployment recipes into it’s own Rails plugin and just made it available on GitHub.

Introducing Boxcar Conductor

The Boxcar Conductor plugin aims to automate the entire process for deploying to your Boxcar. We’re down to just a few simple commands to run to get your application up and running. While mileage may vary with other hosting providers, we did want to open up this work to the community and centralize our work with the community of Boxcar customers who have helped us build and test these tools.

Install Boxcar Conductor

If you’re running on Edge Rails… you can take advantage of the new support for installing plugins in git repositories.

Announcing Cobalt and monthly subscriptions for Boxcar

April 14, 2008

We’ve been designing and developing a new centralized billing platform over the past few months and late last week, we launched it! Along with this new billing platform, we launched another new application, Cobalt, which is a new account management and support tool for our hosting customers.

::: thumbnail Cobalt - account
management
[Uploaded with plasq’s Skitch!]{style=”font-family: Lucida Grande, Trebuchet, sans-serif, Helvetica, Arial; font-size: 10px; color: #808080”} :::

We’ll be migrating all of our past customers over to this new system in time, but are initially using it for new Boxcar customers.

We’ve been building the new system to use Braintree as our new credit card payment gateway. With this switch, we’re also introducing monthly subscription rates for Boxcar, which means that you can try it out month-to-month now.

Over the next few weeks/months, we’ll be announcing several features to Cobalt that will ease your Rails deployment experience.

I want to thank all those on my team that helped get these new applications up and running.

If you’re looking for professional VPS-based Rails hosting, hop on our train by ordering a Boxcar today for $99/month!

For more information, visit railsboxcar.com or Planet Argon.

Also, be sure to follow Boxcar on twitter.

Portland is calling... (you)

April 11, 2008

We’re not looking for rock stars or ninjas at Planet Argon. ;-)

We’re looking for individuals that share our core values.

  • COLLABORATION - We believe that an open dialogue between all
members of a group helps to produce more reasoned and intelligent
decisions.
```yaml
-   **ENTHUSIASM** - We recognize the unique power of people who are
```text
passionate about their craft. We believe that fun is an essential
ingredient in a collaborative and vibrant company culture. We think
happy people make better software.
```yaml
-   **COMMUNITY** - We are part of many communities. Our neighborhoods,
```text
our cities, our workplace, and our professional communities. We give
back to our communities by implementing socially responsible
business practices and sharing our knowledge and tools with our
peers.
```yaml
-   **VERSATILITY** - We believe that it is important for our team to be
```text
open and flexible, as well as the work that we do. This allows us to
adapt to change and encourage innovation.
```yaml
-   **EXECUTION** - We value action and when people make things happen.
```text
It is important that we follow through on our commitments, plans,
and ideas.

..maybe you’re a .NET/Java/PHP/Python developer (who secretly plays with Ruby on Rails at night/weekends). We’re looking for an intermediate-level Rails developer to join our team. Ideal candidates would be in the Portland, Oregon area or willing to relocate.

PLANET
ARGON{width=”500” height=”333”}

If you’re interested, take a moment and introduce yourself.

git-svn is a gateway drug

April 10, 2008

As we’re migrating away from Subversion to Git, I’m having to learn a lot about git-svn. Andy has posted a few articles on this topic, but I wanted to share a quick tip that I find myself forgetting.

Working with Subversion branches

While you’re hopefully already familiar with how great local branches are with Git, you might not know that you can connect local branches to remote branches in your Subversion repository. This allows those of us who are using Git locally to work against Subversion branches.

I’m going to assume the following:

  • Your team is using Subversion
  • Your team already has a branch that you’re working in
  • Your team is following Subversion directory conventions
(`branches/`, `tags/`, and `trunk/`)
```ruby
-   You have Git installed (*with SVN extensions*)

### Checkout the Subversion project with Git

Please visit Andy's tutorial, [Git SVN
Workflow](http://andy.delcambre.com/2008/3/4/git-svn-workflow), for a
more detailed explanation of the following commands.

First, we'll initialize your new local Git repository with `git-svn`.
```text
```ruby
git svn init -s http://svn.yourdomain.com/repos/project_name
Now, you'll change directories to your new Git repository.
```bash
```bash
cd project_name
Let's fetch all previous revisions into your local
repository[^1^](#fn1){#fnref1 .footnote-ref role="doc-noteref"}.
```text
```text
git svn fetch
Great, once this is done... you're **master** (local) branch is linked
to `trunk/`.

### Mapping a local repository to a remote branch

Assuming that your team is working in a Subversion branch on the current
iteration of work. Our team has a naming convention for branches for
each iteration. For example, if we're in Iteration 18, we'll write this
as ITER-018 everywhere (Basecamp, Lighthouse, Subversion, etc...). At
the start of each iteration, we create a new branch with this naming
convention.

For `ITER-018`, the Subversion branch would be located at:

-   http://svn.yourdomain.com/repos/project_name/branches/ITER-018

If you were to do a `git branch -r`, you should see `ITER-018` show up
in the list. Now, the one thing that wasn't clear when I first read the
`git-svn` documentation was that you can't just checkout that branch
with one command. In fact, this has tripped me up a few times.

First, you'll need to checkout a new *local* branch. I've opted to come
up with my own convention for *local branches* and in this case, I'll
name it `iter_018`.
```text
```text
git co -b iter_018
So, now I'm in the iter_018 branch, which is local. I'm currently still
mapped to `trunk/`, which isn't what we want. However, all we need to do
is reset where Git is currently pointed to. We can run [git
reset](http://andy.delcambre.com/2008/3/12/git-reset-in-depth) to point
this to the ITER-018 branch.
```text
```text
git reset --hard ITER-018
That's it! Now, the local `iter_018` branch will point to
`branches/ITER-018` in your Subversion repository. This will allow you
to work with your existing repository branch and still reap the benefits
of local Git repositories.

### What about master?

Good question. The `git reset` command that you ran will ONLY apply that
that individual local branch. So, master is *still* pointing to
`trunk/`. This will allow you to have several local branches that map to
remote branches.

## Next Steps...

If you're working with Git already.. great!

If you're working in an environment that using Subversion, `git svn`
provides you the ability to start exploring Git without making your
entire team switchover. Perhaps your a consultant and working for a
client that uses Subversion... no problem!

We're still using Subversion for past client projects and are
considering [GitHub](http://github.com), which [just launched (to the
public) today](http://github.com/blog/40-we-launched) for future
projects. A few of us are already using GitHub for open source projects.

Fun.. I just saw the following tweet pass by as I began to wrap up this
post.

::: thumbnail
[![rails on
github](http://img.skitch.com/20080411-rgageidq82ak6ij952ppant4u9.preview.jpg)](http://skitch.com/robbyrussell/jeh1/rails-on-github)\
[Uploaded with [plasq](http://plasq.com/)'s
[Skitch](http://skitch.com)!]{style="font-family: Lucida Grande, Trebuchet, sans-serif, Helvetica, Arial; font-size: 10px; color: #808080"}
:::

[Check out Rails on GitHub!](http://github.com/rails/)

### The Gateway Drug... Git reminds me of Cake

### Questions?

I know that I glossed over a few things, so feel free to post questions
and/or tips for others who are looking to dabble with Git.

------------------------------------------------------------------------

1.  ::: {#fn1}
```yaml
You'll likely have problems if you don't have a Git authors file
specified in your git config.[↩︎](#fnref1){.footnote-back
role="doc-backlink"}
:::

1Password and Fluid.app

April 04, 2008

I’ve been really happy with my purchase of 1Password so far. If you’re not familiar with it, I would really recommend their free-trial. I’ve been really impressed with how quickly it became reliant upon it. 1Password works across several browsers, imports existing passwords, and even has integration with your iPhone. However, over the past month, I’ve been wishing that it worked with my Fluid applications.

1Password 2.6.BETA-2 was released a few days ago one of the features added was integration with Fluid applications.

::: thumbnail Fluid and
1password

[Signing into Lighthouse with 1Password]{.small} :::

I’m glad to see that Agile Web Solutions was so quick to respond to the flurry of people requesting this.

  • [Campfire messages in
Growl](http://www.robbyonrails.com/articles/2008/03/05/campfire-messages-in-growl)

iPhone's Missing Feature

April 03, 2008

I love my iPhone. There… I said it.

There is one problem with it (and I don’t blame Apple for it). Multimedia Messaging is pretty much non-existent with non-iPhone friends & family. My family continues to send me pictures/videos via text message… because they can with their other friends and family. I find myself looking at the following message quite often.

::: thumbnail IMG_5279.jpg
[Uploaded with plasq’s Skitch!]{style=”font-family: Lucida Grande, Trebuchet, sans-serif, Helvetica, Arial; font-size: 10px; color: #808080”} :::

Then I go to AT&T’s AMAZING site…

::: thumbnail viewmymessage is
shit
[Uploaded with plasq’s Skitch!]{style=”font-family: Lucida Grande, Trebuchet, sans-serif, Helvetica, Arial; font-size: 10px; color: #808080”} :::

…and I get a broken image.

Great work AT&T! Apple… this is tainting my experience with the iPhone. Make them fix it!