Modern Application Development
Smart development, not hard development
We leverage agile development methodologies to make our development cycle as efficient as possible. This can be a somewhat nebulous concept, but to us it means the following.
Iterative
We much prefer to work in very short timeboxed iterations, typically a week on larger projects, but possibly less. At the end of the cycle, working software is delivered to the customer, including as much functionality as we have managed to cram in during the time period. Then together with the client we reassess where we are, what features are still outstanding, any changes or bugs the client would like to see addressed, and start another cycle.
The advantage of this approach is that it minimises the risk of delivering a large chunk of functionality that the client doesn't want. Although people often think that specifying what they want upfront is doable, typically it's not until they have a working prototype in their hands that they realise that they would like things to work slightly differently.
Test Driven Development
We write the tests before we write the functionality. That way we find we get the greatest amount of code covered by unit tests, but also it improves the stability and structure of the code markedly.
Continuous Integration
Whenever we commit something to our source code system, a back end system checks it out and runs our test suite against it. That way we can tell immediately that we've broken something. We use Hudson for this, and are very happy with it. We also use Hudson to build our "official" prototypes and app store binaries.
Constant Refactoring
We try not to spend hours and hours building functionality that we might not need. We try and get the needed functionality out using the quickest possible initial solution, and then mercilessly refactor as we go along. Of course, this is only possible with good unit tests.