I recently wrote about why you need a definition of done, and it only seems logical to follow this up by presenting what I use for a definition of done for developing software.
I use two guiding principles as the basis for constructing my definition.
Potentially releasable: Ideally the software can be released (or shipped) [...]