There are several usages for branching. One of them is separating projects that once had a common code base. This is a quite typical and low demanding scenario from the SCM point of view, although useful.
You can also branch with something happens: you can always develop against the main line (using branch per task or not), and then when you have to release to your clients, you create a new branch.
To have full developer isolation, so that a developer can commit changes whenever he wants without affecting the rest of the team, branch per task can be used. This means every task that affects code will have a corresponding branch. This is an easy, and very powerful, way to keep track of everything that was done on a specific activity, typically each task on the bug-tracking application that involves code modification.
