I use my own projects to develop techniques and learn technologies.
My current project uses hg for source control (because I'm too lazy to type stuff in again after losing it or breaking something, and use both a netbook and a desktop to code on so want a common repository to sync to), TDD (because I'm too lazy to write code that isn't needed to provide features and don't like big debugging sessions), and uses astyle (because I'm too lazy to indent stuff myself) and splint (because I'm too lazy to chase bugs all day). I also keep a workbook with what I'm doing and what I'm thinking of doing, because sometimes I don't touch it for a while, and there's also quite a bit of infrastructure, so it makes sense to write down ideas of where the later stages might be going. I don't do big comment headers describing that the array_get_length(array_ref_t array)
function returns the length of the array
array. When debugging I use logging rather than printf, mainly because the logging library prints the line the logging function is on - so it's easy to jump to - and you can turn it off with a build flag.
Even at work I don't do big design up front on any project*; instead I plan what I expect to be doing for the next 2-4 weeks down to 2 day slots. Typically in three weeks time the requirements will have drifted anyway, or you're done.
How much of source control, automated testing, automated coding standards checking and design documentation is present in professional projects depends rather on the practises at whoever is employing me. So often my own set-up is more 'professional' in terms of boxes ticked.
'* Typically I'll design/decide the interface by which an message is sent between components up front, then let content, semantics and configuration evolve as required. Then each component is managed as a stand-alone small project, rather than an increment to a big project.