On Mon, Jul 11, 2011 at 7:51 PM, Mike Meyer <m...@mired.org> wrote:
> On Mon, 11 Jul 2011 16:21:45 -0400
> Ken Wesson <kwess...@gmail.com> wrote:
>> > So, "repository" does not imply "server" at all,
>> This is getting silly. "Repository" is a word that brings immediately
>> to mind typing checkin and checkout commands at a command prompt in
>> order to work on source code that is stored remotely. And remotely
>> implies "server".
>
> I was with you until you said "stored remotely".

Well, the source code is being worked on collaboratively by
geographically separated people in many cases, and from multiple
office cubicle computers in the most geographically-concentrated case.
The canonical master version of the source code must reside in some
single place, which can be at most one of those developers' computers;
so for the rest of them, it's stored remotely.

What's stored locally may range from a single file being worked on at
a time to a copy of the whole code base, but there is still generally
a master copy and there is still therefore some mechanism for updating
the master copy and resolving edit conflicts that collide there.

That mechanism requires the computer holding the non-master copy or
single file to push its diffs to the computer holding the master copy
(and then the latter is a server) or the computer holding the master
copy to pull diffs from the others (and then all the REST are
servers!).

So not only is there a "stored remotely" in there out of necessity for
anything but a single-developer-on-a-single-machine project, but
there's also a "server" in there, or even multiple servers. The
alternatives I can think of are:

1. One developer, one computer. Version control may be overkill in
such a case anyway and it's not how big, major projects are developed.

2. Many developers, one computer. No "remote storage" and if the
developers are co-located no server; otherwise a terminal server. The
former is obviously not parallelizable (though edit conflicts are thus
a non-issue -- single global lock FTW!!!1!1) and the latter is a
throwback to the 1980s or earlier. :)

3. Many computers, one developer manually synching files or just
carrying the codebase around on a thumbdrive. No servers, no remote
storage that isn't simply overwritten when returned-to. The extra
copies, if any, merely amount to backups. Most likely with a
one-developer project with a tower and a laptop, or developing a phone
app on a computer and on their phone.

4. An ad hoc, peer-to-peer system with many evolving versions of the
codebase and patches swapped back and forth but no canonical "master"
copy. This *might* be workable on a small project (a handful of
developers, not too many LOC) but surely cannot scale much above that
without becoming total chaos. There might be no "server" beyond email
in such a case, used for exchanging diff files or whatever. But I
expect any project organized that way to melt down above a fairly
small size of codebase and/or developer headcount. Versions will
become too divergent, the bigger and more numerous they are, until
patches that worked on the sender's copy often won't work, or won't
work without extensive modification, on the recipient's, and then the
ability to share improvements begins to break down rapidly when that
point is reached. In effect, the codebases begin to evolve into
separate species that can no longer interbreed. Perhaps this is how
bacteria, despite being able to share genes in horizontal transfer and
acquire them after birth, nonetheless have distinct species -- they
become incompatible for all but certain broad classes of "plugin
interface implementation" patches such as, unfortunately,
antibiotic-resistance genes.

This could be made slightly more scalable by modularizing, specifying
module interfaces, and letting the modules evolve separately,
versioning each one by patch level, so the version of a module is
bumped every time it's patched. Patches expected to be acquired and
applied in order to keep each module up to date with everyone else's
work. Obvious problem with patch-numbering collisions, where two
developers hack on module Y and both produce distinct patch 1337s
unaware of what the other is doing -- in other words, edit conflicts.
Repositories that number every commit sort-of implement this, but with
a master copy and a database of some sort tracking the changes and the
commit numbers and some mechanism for resolving edit collisions.
Collisions are also detected right away, since both developers will
submit their changes to the central repository. In the peer-to-peer
model each might deliver their own "patch 1337" to a bunch of others
and both could spread for a while among different subsets of the
developers before eventually colliding in one developer's copy of
module Y who receives one of the patches and then, later, the other.
Before that, problems could arise if developer X talks to developer Z
and gets patch 1338 for module Y, tries to apply it, and despite
having patch 1337 it doesn't work because patch 1338 depends on one
patch 1337 and developer X has the *other* patch 1337. Z tells him he
mustn't have patch 1337, he insists he does, confusion ensues until at
some point someone thinks to compare Xs and Zs patch 1337s and
discovers that they're not the same...whence, collision fun again.

So, unless 4 can be made workable, then the typical use scenario for a
version control system involves both a) "remote storage" of code and
b) a "server". Their exact roles may vary. The exact way that
checkouts and commits work may vary. But without those two things in
*some* way shape or form the poorly-scaling anarchy of case 4 above
seems to me to be inevitable. Hell, even time sharing an old Unix
terminal server with a shell-and-emacs account for each developer
means remote code storage (on the Unix box) and a server (if only a
telnet/ssh server). :)

-- 
Protege: What is this seething mass of parentheses?!
Master: Your father's Lisp REPL. This is the language of a true
hacker. Not as clumsy or random as C++; a language for a more
civilized age.

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to