Tuesday, March 29, 2005

Version the file system not the files

Most version control software misses the point. They version the files fine. Most fail to sufficiently version the file system.

When you are working on a codebase you want to be able to write new classes, rename them, move them to other assemblies, etc. A single class (throughout it's life) may have lived in various diffrent directories, in varously named files.

SourceSafe allows you to rename files or directories, but once they are renamed it is as if they have always had that name. If you ask for an old version, it still has the new name. Not what you want.

Subversion is better. It remembers the file's filename and content, so getting a version as of a past date works correctly. However subversion still required you to use subversion to rename the file otherwise it can't track the change. What if you are using a refactoring tool or IDE that does the file renaming for you?

What is needed is a version control system that watches the changes you are making to the filesystem as a whole and tracks these changes for later. Renaming a file on the hard drive should be enough for the verison control software to know the file was renamed.

Last weekend I have started a small application that attempts to achieve this goal. SVNMirror.

SVNMirror mirrors all changes made to a directory (and all subdirectories) in subversion. Here is how it works...

SVNMirror watches a source directory for changes (using the .Net FileSystemWatcher classes). SVNMirror is also given a versioned directory (which would usually be your working directory if you were using Subversion in the standard way). When a change occures the change gets mirrored in the versioned directory.

For example:

* You create a new file in your source directory. SVNMirror copies the file to your versioned directory and tells subversion to add the file to version control.
* You modify a file in your source directory. SVNMirror copies the change to your versioned file.
* You delete a file in your source directory. SVNMirror marks the file as deleted in subversion.
...
etc.

There are still a few issues with renaming files that are not comitted to the database yet, but other than that the proof of concept works fine. :)

I'll post a link to the page once I make a site for the project.

Tuesday, March 22, 2005

What exactly are you estimating?

"How long will it take to get to Sydney from Melbourne?"

To answer this you need to know three things:
* How fast are you going?
* What route are you going to take?
* How accurate are my estimates for speed and distance?

Whenever you estimate a task in terms of time you are joining three independent variables. The Productivity of the team, the Magnitude of the task and the Accuracy of your estimate.

* To drive direct to Sydney is about 1000 km.
Assuming you don't need to take any detours or get lost.

* The average velocity for the trip is around 100km/hour.
Assuming your car doesn't break down, or you have an accident, or the kids need the toilet every 20 mins ... etc.

So.. I could quote my estimate as 13 hours.

If I had done the trip a few time, and it always took between 10 and 13 hours then maybe I would be much happier to make that quote.

But... what if I was gambling $100,000 on being able to get someone to Sydney in that time.
I wouldn't be happy with the estimate any more. I would want to allocate extra time incase the unforseen happened.

What level of risk is your customer happy with? Have you asked?

GitHub Projects