Small Releases: The release times typically are a 2-4 weeks. These releases of software may not have the full functionality. But they are complete and should be usable.
Evolutionary Design: as opposed to Upfront design.
Sufficient documentation: without overloading of developers.
Continuous Integration: The code needs to be built and integrated into the build machine consistently. (scheduled builds)
Automated testing: Tests to be automatically run to make sure that the code does not break existing functionality using NUnit etc.
Document generation from code: The best way to keep the documents complete and up to date is to generate them automatically from code. This of course requires well established regulations and coding standards so that the documentation can be automatically generated by the tools.
Extreme programming is the most extreme form of agile methodology. This brings its own additional thoughts such as:
Test Driven or Test First Programming: The tests are written before a single line of code is written. The objective of the code is to make the tests pass. So no code can get ever written unless there is a failed test.
YAGNI: (You ain’t gonna need it) Don’t code for features that are not listed in the current requirements. The reasons preached are:
The requirements are not known at this stage and hence these features even if coded today would not be coded correctly.
This takes cycles away from the time spent on the requested features.
Pair programming: Programmers code in pairs so that a senior programmer trains a novice programmer in the process. This way the knowledge is spread across the group rather than staying with a person (expert).