We build software in short, one-week release cycles called iterations. Working this way allows us to provide continuous value and adapt to changing requirements.
At the end of every iteration, we release a new version of the code with the new functionality that was developed that week. This ensures that we are constantly delivering and adding value.
This approach enables our customers to give us feedback early on in the development process, which enables us to adapt to the needs of our customers.
Test Driven Development
Before we write any code, we write test code to establish the expected behavior. As the system grows, we run these tests to ensure that our software continues to behave as we expect and without bugs.
We run these tests as part of an automated build process so that whenever we change any code we can tell if the application still works. We find that writing tests first, forces us to think about what we’re doing, which prevents mistakes and consequently having to redo work.
Writing tests also enforces simplification of our code, which reduces the chance of bugs. Requirements become easier to implement, and changes have less of an impact.
Continuous Integration (CI) is a development practice that requires our developers to integrate code into a shared repository several times a day. Each check-in is then verified by an automated build, allowing our teams to detect problems early.
As multiple developers often work on the same projects. To maintain the integrity of the software we write, we use version control and build automation tools to continuously merge and test the code we produce.
Learning and Technical Sessions
We are proud of our culture of continuous learning and improvement. We gather regularly for talks, workshops, and to brainstorm new approaches that will improve the way we work so that we may learn from each other.