Regarding the case with Bob and John, cooperative systems like svn do not prevent this scenario any more than a locking system does. I can 'update' FooBar.java, which satisfies svn that I have the latest edition, then delete that file locally and overwrite it with my own personal copy that I made without any regard for the baseline version, and check that in, happily destroying the other guy's changes.
No system, locking or not, prevents this, so I do not see the point of even bringing it into the debate.
The real issue is deciding what your balance is between
likelihood of merge mistakes
vs.
inconvenience caused by people locking files
The notion that either a locking or non-locking system is "superior" is nonsense.
I've used VSS, in its default full locking mode, with 6 developers, and it worked like
a dream. Occasionally, somebody would forget to release a lock and we'd have to hunt them down or break the lock manually and hand-merge when they returned, but
this was very minimal. I've seen svn screw up its automatic merge more than once, such that I don't really trust it. It doesn't always flag a 'conflict' when two people have changed the same file in a way that cannot be automatically merged together.
Conversely, I've seen people get impatient with VSS's locks, edit their own copies,
and sloppily check them in over the top of other peoples' code, and I've seen
svn handily catch me when I might accidentally try to check something in that has been changed by somebody else since I last checked it out.
My point is, this is not a sensible debate to have. The success of either system comes down
to how you manage the conflict points when they occur, not whether one system
or the other is better.