Working Iteratively
Coroutine executes all development using an iterative approach. Our team works with our clients to produce a running list of features and tasks, prioritized by importance and expected return on investment. These items are then broken into two-week blocks. Because the cycles are so short, any individual feature or task is required to be small, clearly explained, and easily implemented. Programmers simply work down the list in the order defined by the client.
The process results in unmatched satisfaction from both our clients and our programmers. It eliminates all disputes about what is and isn't out of scope. Team members focus instead on building the very best software that can be built, a goal lost all too readily amid the change controls and arbitrary deadlines of other methodologies.
Because iterative development is new to many of our clients, we use a software service called Pivotal Tracker to manage our projects. Pivotal Tracker simplifies the process of defining features, creating prioritized work lists for iterations, and tracking progress.
A Focus on Testing
Coroutine follows a methodology called Test-Driven Development (TDD). There's nothing particularly earth-shattering or complex about the methodology, but given how beneficial it is, it is nevertheless shocking how rarely it is practiced. Writing test cases before code improves the development process in several ways.
Correctness
Code that has been rigorously tested is much more likely to work correctly. Duh. TDD ensures that test cases are actually written. Many of our clients are surprised to learn that they have entire systems in production without a single automated test.
Quality
Programmers who write test cases write better code. Test cases force programmers to consider all possible points of failure. By doing this upfront, programmers tend to write more fail-safe code from the first iteration.
Stability
Code will not be deployed unless it passes all known test cases. This constant and regressive testing ensures that new features don't break features already in use.
Speed
Test cases speed up all phases of development but particularly the debugging process. If any part of the system fails a test case, that part can be reverted to the last version that did pass all tests. Often, programmers can resolve bugs faster by inspecting the differences between versions of the code base that do and don't pass associated tests.