At Accolo, we identified a specific product development opportunity and went out and secured a small round of funding to support it. After we shored up the round of funding we took a look at what we were trying to accomplish and our staffing options to accomplish our goals. There were a few obvious approaches:
- Hire a small team of full-time employees as developers, qa personnel and design folk and purchase all the tools to support the development effort (project management and QA tools)
- Hire a mix of full-time and contract employees for development, qa and design and purchase all the tools to support the development effort (project management and QA tools)
- Hire full-time design personnel and outsource the development and qa effort to an on-shore vendor
- Hire full-time design personnel and outsource the development and qa effort to an off-shore vendor
Option 1 and 2 were both out immediately. We didn't have the funds to pay the high prices for people in the bay area nor the time to recruit and manage those folks. Option 3 seemed like a good idea, but my experience with vendors on-shore in our price range has been bad (one of these experiences may be a topic for a future blog entry). So, option 4 seemed like the best bet.
So, the next step was to look around for potential off-shore vendors. We picked a vendor in the Ukraine that has both a good track record in actual product development, not just IT tasks, and who also happens to be under the same VC umbrella as we are. We figured that if they are under the same VC umbrella then there would be extra incentive to do well for us. So, since August Accolo has been working with a 10 person team in the Ukraine to build our primary product development initiative. We have maintained design and functional requirements writing on-shore, most recently adding a person filling a business analyst role (we actually stole her from another unit in our company).
We chose an agile approach to the project with the Ukrainian vendor. So, what are the key lessons I've learn in making agile development techniques successful with an off-shore development team? The main success factors to off-shoring an Agile development project are (1) collaboration tools, (2) development backlog, (3) Well defined iteration management process and (4) mockups.
Collaboration ToolsCollaboration tools become extremely important in off-shoring agile projects. Because of the time-zone and language differences written communication is vital.
Collaboration tools must facilitate three things: (1) Rapid person-to-person communication during overlapping hours (2) communication of requirements and mockups (3) iteration management
The good new is that it is not necessary to go out and buy expensive collaboration tools to make this possible. Most off-shore vendors made the investment in project and iteration management tools, now all you need is a way to communicate with the team members. At Accolo we've been able to accomplish our collaboration goals using all free tools, Skype,
Trac and Google Docs.
Skype provides not only free voice communication, but also a nice IM tool. We use Trac's Wiki features to embed mockups and write requirements around those mockups because it allows for easy linking between different design documents. You could really use any Wiki for this. We use Google Docs for managing our feature backlog (more on this shortly), permissions model and complex requirements that we want to communicate using spreadsheets.
Development BacklogUsually the first engagement with the off-shore project team will be with a project manager or technical lead that will work to understand your business, requirements and direction. We spent hours with our newly assigned project manager from Kyiv in conference rooms looking at demos, drawing on white boards and discussing our short, mid and long term goals. This was all great stuff and the PM left the US feeling like he understood our business and goals. However, we left out one key thing that caused a lot of confusion and wasted time, we did not produce a
development backlog. We went for a few months of shifting priorities and unreasonable expectations before we realized we needed a backlog to manage our priorities. This was an especially big problem when trying to set stakeholder expectations. Stakeholders typically don't care about development challenges, they just want to know what is going to be built and when. Without a backlog of sufficient detail it is very difficult to communicate priority and timing with stakeholders.
There are different approaches to development backlogs, our definition at Accolo is a list of features, each of which can be completed within a development iteration, all force ranked relative to every other feature.
My advice to anyone starting an agile project with an off-shore team is to create a development backlog first. At Accolo we are fortunate to have an existing application. So, for our first pass at the development backlog we listed all the key pages in the application in a Google Spreadsheet; one application web page per spreadsheet row. Then we added row after row of subfunctionality per page until will had a 250+ row spreadsheet. After that we went back to our feature wish-list (all the things that have come up in brainstorming sessions) and added a row to the backlog spreadsheet for each feature. So, what Accolo ended up with was a list of 400+ features all force ranked in a list.
The next, and most important step, is to force rank every entry in the backlog relative to the other features in the backlog. This is tedious work, but it will go faster then expected. At Accolo we started from the top with 1000, with the feature with a priority of 1000 being the most important, and then working down from there evaluating every feature's priority against the last ranked feature. We use a "Priority" column in our spreadsheet that can be resorted as priorities change.
TIP: Try to keep as much of the related sub-functionality prioritized together. For instance, if you are creating a search feature with two subfeatures, autocomplete and reset, try to prioritize autocomplete together in the backlog. As developers are working on functionality they tend to "get in the zone," meaning the developer is very focused on the feature and he has a keen understanding of how the feature works. It is often most efficient to have the developer complete as much of the subfunctionality as possible while the developer is "in the zone."
The next step is to identify the minimum feature set for releases. For instance, at Accolo we identified the minimum functionality for an internal only, non-production alpha release, an open beta release and a full-featured production release. Because our backlog is in a Google Spreadsheet we put a line in the spreadsheet deliniating the minimum requirements for each release (we make these lines orange so they stand out). Defining minimum feature set for releases is a good way set expectations. You can tell stakeholders that you have completed x number of features while we need to complete y features for a release. You can even estimate delivery by looking at statistics about implementation time for the completed features and estimate the gap between completed and not completed features.
The importance of a backlog cannot be overstated. The lack of a backlog at the beginning of our project is the single biggest mistake we have made when off-shoring development using Agile development techniques.
Well defined iteration management processEarly in any Agile project an iteration duration is chosen. I've often seen iterations of 2 or 3 weeks, but never less than 1 week. This, of course, depends on your project, but most web application projects do well with a 2 or 3 week iteration length. Once the duration of the project has been agreed upon by all development personnel the iteration must be broken down into deliverables that will ensure iteration quality and provide requirements for future iterations in a timely manner. Here are the basic requirements for iteration planning:
- Features are broken down into small enough chunks so that each chunk is completable in an iteration
- Feature is complete ONLY if QA and stakeholders have accepted the feature as fully functional - we use the concept of Running Tested Features (RTF)
- Engineers commit to the number of features that can be completed in the iteration based on designs and test-cases
In order to support the basic requirements for iteration planning we have developed a schedule of deliverables based on our 3 week iterations. The deliverables are assigned to designers, engineers or project management and are expected at the same point during every iteration. Below is a diagram of a typical iteration plan and deliverables. The example below goes from the end of iteration 12, through iteration 13, to the beginning of iteration 14. The engineer commitment for iteration 13 happens on the last day of iteration 12, Friday. On the first day of iteration 13, Monday, a discussion happens to determine priorities for Iteration 14. By setting the priorities for iteration 14 the designers and requirements folks now know what to design. The designs for Iteration 14 will be due at the end of the second week of iteration 13, Friday. Once the designs for iteration 14 are complete at the end of week 2 of iteration 14 the QA folks start writing test cases for the new requirements. The test cases for iteration 14 are written during the last week of iteration 13. The engineers then use the designs and test-cases to estimate development effort and make a commitment for iteration 14. Of course, during this entire time the engineers are developing the features for iteration 13 and the QA personnel is testing iteration 13.

Well defined roles and team structureAccolo is a web application, so we have typical web application project team roles. We have management, design, implementation/engineering and QA. Of course the roles depend on the project. We are heavy on the web design as opposed to, for instance, middleware vendors who will be heavier on the engineering design. Otherwise, this split is pretty common for any software project.
One key thing you must understand when managing off-shore vendors: Your off-shore vendor doesn't know what type of personnel you need better than you do. Even if you consider yourself non-technical you have a better understanding of how your team should be staffed than the off-shore vendor. Don't let the vendor dictate staffing decisions that don't make sense. Don't be afraid to tell the vendor the types of people you need and make changes as quickly as possible if you see delivery problems. Off-shore development engagements are not successful if you hope to just "throw requirements over the fence." You must actively manage the vendor and the personnel choices that vendor makes.
The Accolo application is very user-centric, making heavy use of complex user interfaces. The most important aspects of our application is a simple and highly-usable user interface with heavy automation done on the back-end. So, when our vendor began staffing our project with exclusively back-end developers it didn't seem right. However, we were brand-new to off-shoring development with an established vendor and we didn't realize the importance of actively managing the vendor. We ended up with back-end developers trying to do front-end work. Back-end developers are typically un-able, un-willing and un-interested in doing front-end work. So, we were getting poor front-end work and angering our back-end developers. It took us a few months to realize we needed to actively manage the vendor. We made it clear to the vendor that we though a 1:1 front-end to back-end developer ration was more appropriate. It took a project manager change, but we finally got what we wanted. Today we have 3 pure front-end developers and 4 back-end developers (with some front-end capabilities).
However, while development/engineering staff and structure is important QA is critical. QA polices the requirements, making sure that what is implemented meets the requirements. We were lucky to get a very good QA person. If you choose to off-shore the QA function of an Agile project make sure you get a QA person that understands your business, takes ownership of the requirements you produce and is not afraid to mix it up with engineers. I think a 2 developers to every QA person is a good ratio even when off-shoring an Agile project.
We are starting to see problems with only 2 QA people. We don't have anyone on our team who can write front-end automated tests (we have standard automated unit-tests for the back-end). If you have an application using complex front end technology for a rich user-experience make sure you have a person available, if not dedicated to your team, that can architect and write automated front end testing.
Design is key, mockups are criticalIf you have an application that requirements a rich user experience you cannot off-shore the design function. The front-end design must be heavily controlled by the people closest to your customers, you. Trying to communicate the nuance of required functionality to off-shore designers will not be successful.
There is a saying that floats around our team, "pictures
save a thousand words." I think anyone involved in software design can relate to this adage. There is no better way to clarify requirements than to show what the user-interface will look like. You can then add detail around each element of the page and speak to the back-end processing related to the feature group. In off-shored Agile projects this is even more true for two obvious reasons:
- Time Zones: A lot of time can be wasted clarifying requirements when the implementation team is on the other side of the world. As stated previously, there is no better way to clarify requirements that a picture of what the page should look like
- Language Barriers: There are varying degrees of English proficiency between team members on any off-shored development team. I would extend the adage written earlier to say "pictures save a thousand words and doesn't depend on a particular language." Obviously this has limits because pages have words and labels, but the point is valid. A person can look at the layout regardless of language proficiency and get the gist of the requirements.
The production of the mockups and supporting requirements must be done on-shore with direct access to the business stakeholders. So much nuance is derived from the short meetings and informal encounters between business folks and design folks. Hire FTEs and/or contractors to do the design and requirements work.
Don't make the mistakes we made early in our project. Have at least the beginnings of a development backlog that has been force ranked before engaging an off-shore team. Make sure that the off-shore vendor comes with a project management software suite for development and issue tracking. Establish the way that mockups will be produced and requirements detail built around the mockups. Develop an iteration deliverables plan so that every team member knows what deliverables they are responsible for and when those deliverables are due. A consistent iteration deliverable pattern will allow the development team to get into a rhythm. Hire great design personnel on-shore and focus on mockups with written requirements augmenting the mockups, not the other way around. And definitely don't try provide only written requirements, you will find yourself going around and around in circles clarifying requirements.
My off-the-top-of-my-head-because-I-haven't-had-time-to-research-it estimate of productivity is that off-shoring an Agile project gets you about 80% productivity compared to a full on-shore team. This is raw productivity not taking into account innovation benefits you get from an on-shore, full-time team. But, if you can get an off-shore dev team at 80% or less of what it would cost you for an on-shore team it is justifiable.