### Ringing in the New Year with a timely reminder from xkcd

I've refrained from reposting xkcd for a while, but this is just too good! So where did you leave your key-ring last night, huh?

Happy New Year!

### Armageddon's Children - Genesis of Shannara Book 1

 Check any bookshop's fantasy section and you are sure to find a number of title by Terry Brooks (along with the other Terry). I've never read him before though, and picked up Armageddon's Children - Genesis of Shannara Book 1 out of interest back in November.Here begins the tale of the world that will emerge from the Great Wars to become one of the greatest in modern fantasy. Here begins the Genesis of Shannara.."I'd stress begins. I found myself drawn in as the story unfolds and characters are introduced from three or four distinct story lines, and awed by the imagination that Terry Brooks has pured into the backstory. A crescendo of plots and conflicts builds..... and then you get to the end of the book. No doubt an amazing epic in the telling, if you are committed to reading the whole series. Personally, I decided to cut my losses (at least for the time being). Telling a story in multiple parts is fine by me, but with each "part" coming in at 400 hundred odd pages good story-telling dictates making each part a satisfying whole in its own right. I am sure there are many fans who will disagree and gleefully devour the whole series. To each his/her own...

### Does your team have "hustle"?

I was reminded recently of a quote from Frederick Brooks' classic The Mythical Man-Month

A baseball manager recognizes a nonphysical telent, hustle, as an essential gift of great players and great teams. It is the characteristic of running faster than necessary, moving sooner than necessary, trying harder than necessary. It is essential for great programming teams, too.

Hustle. You'll know it if you've got it, but if you don't, then how do you get it?

Knowing that you should even be asking this question is I think a good indicator that as a Project Manager you may even be on the road to becoming a great Leader! Peter Drucker wrote "Management is about human beings. Its task is to make people capable of joint performance, to make their strengths effective and their weaknesses irrelevant."

The term management has of course been so abused and ridiculed (thanks to Scott Adams et al and untold thousands who have assumed the title but not the competence) that its common usage is a far cry from Drucker's meaning, which I personally define as the nexus of (little-m) management [the science of knowing] and leadership [the art of making things happen].

So back to the question of hustle. Probably the most common problem I've seen in practice is that you have a team of really smart people, but they simply can't fix on what to hustle about. Either they've lost their way (like after a major release), or never found it in the first place (can't pin down some fundamental vision, design or architectural issues). Once you are underway however, a problem common to large projects is that your day-to-day/week-to-week work is just lost in this huge 18-month timeline. You can't hustle for 18-months straight, so why hustle at all?

Now anyone in the business of development will immediately think of a few methods-du-jour for tackling these kind of situations: scrum, prototyping, XP etc.

Common to these methods is the idea breaking problems down into achievable steps or iterations, and importantly emphasising the delivery of something concrete each time.

To generalise, they provide a sense of "where we are", and a series of tangible near-term goals for "where we want to go".

In other words, find a sense of purpose and you're on the way to unleashing some hustle.

Now isn't that what good leadership is all about? Having a clear vision. Understanding the people in your team, how they are motivated, how they are "blocked". And then creating the circumstances under which the team can realise the vision.

As a Project Manager responsible for delivering results, every tool deserves to be questioned and considered as part of your strategy.

Take something as fundamental as your project plan/gantt chart. Based on average software project success rates, there's upwards of a 70% chance your project plan is just lulling upper management into a false sense of security, while also serving as a daily reminder to the team of the impossibility of the task at hand. Why do you even bother?

If you are going to toil over one at all, consider whether it is really doing the job of communicating where we are/where we want to go to the team. Is the team reading it? Does the team even have access to it??

Is it posted up on the wall, and referred to whenever two or more team members are having a conversation? Or is it a crufty bit of detritus that lives in a folder that no-one other than the PM uses (and they don't have MS Project installed anyway)?

Worse yet, is the cryptic, mystical project plan actually contributing to the fuzziness of the team not really knowing exactly where we are or where we are going? And killing any hope of seeing some hustle..

### Migrating to a Virtual CVS Host

Seasons greetings to all! Of course, a few days off means time for some of those special projects that have been waiting in the wings;-)

I run a cvs repository for my personal use at home (migrating to subversion is a project for another xmas break). There are two stupid mistakes in the setup I've wanted to fix for a long time.

1. It is running on the main machine I use for testing and development, which can lead to some tricky catch-22 situations. Duh!
2. I've always used the servername to access the repository, which makes relocation a pain. This seems to be a problem common to the many development shops I have seen. Gold stars for actually using source control, but brickbats for not thinking of using a virtual host name before finding yourselves tied to a specific host!

## The Relocation

Actually, by moving to a new server I mean old laptop .. it is easy to write-off a 256Mb 600MHz machine these days, but they really do make decent "network utility" servers! Running Linux of course. Ideal for just sitting in the corner and running your crucial network services day in, day out. Like cvs.

Since I was migrating the cvs repository from another Linux machine, the move was a piece of cake. The following notes assume Red Hat (or Oracle Linux), which is what I am running. It also assumes the cvs repository is at /cvsroot and the cvs user account is called cvs (just substitute your actual details where approriate).

CVS Setup - New Server
Most Linux distributions will already have the cvs server installed (but not configured or running). Since I'm on Red Hat, I can check for the cvs package using rpm:
$rpm -qa | grep cvs cvs-1.11.2-27 If you can't find the server package, download and install as appropirate for your distro. Setting up the CVS Service Create a new cvs user and group to own the repository. [root@new server]# /usr/sbin/groupadd cvs [root@new server]# /usr/sbin/useradd -g cvs cvs [root@new server]# passwd cvs Check that the service name is listed in /etc/services$ grep cvspserver /etc/services
cvspserver 2401/tcp #cvs pserver process

To get the cvs server under xinetd control, create /etc/xinetd.d/cvspserver:
service cvspserver
{
socket_type = stream
protocol = tcp
wait = no
user = root
passenv = PATH
server = /usr/bin/cvs
server_args = --allow-root=/cvsroot -f pserver
}

Move the Repository Files
Normally at this point you would initialise a new repository if you are setting up a server from scratch (cvs -d /cvsroot init). However in this case I'm moving the repository files from the old to the new server. For me, this meant tar/gzip of the /cvsroot, ftp the archive to the new machine, and unzip to re-create /cvsroot.
[root@old server]# tar -zcvf cvsroot.tar.gz /cvsroot
[root@new server]# cd /
[root@new server]# ftp {file from old server}
[root@new server]# tar -zxvf cvsroot.tar.gz

Starting the Server
[root@new server]# /etc/init.d/xinetd restart
Voila!

## Switching to a Virtual Hostname

OK, now we get to the main point of the post - using cvs with a "virtual hostname". I mean of course using a name that belongs to the cvs service rather than any particular server, which will make future relocations to new servers a breeze if it becomes necessary.

So where I used to access "server1.mydomain.com", I will now use "cvs.mydomain.com". These names can be resolved by DNS or hosts file. They could actually map to different IPs (i.e. use virtual IP address also), but in my case I have just setup "cvs.mydomain.com" as an alias for my new server's IP address.

To preconfigure the cvs environment for Linux users I add the following to /etc/profile:
export EDITOR=/bin/vi
export CVSROOT=:pserver:$USER@cvs.mydomain.com:/cvsroot Migrating CVS Clients Now what about all the cvs "clients"? Strict protocol would suggest you should make sure everything is checked in before the server move, and check out a fresh copy from the new server when it is ready. This is not really a nice way to go for at least two reasons: 1. You'll probably miss something that needs checking in 2. If you have directories with a mix of cvs controlled/non-controlled files you have an interesting mix-and-match problem to get everything back in sync Fortunately there are some tricks you can employ to do an "in-place" migration of modules checked out on the client. Basically we just need to update the CVS/Root files with the details of the new server. Here's a quick perl recipe for updating all of the CVS/Root files under the current directory in Linux: perl -i.orig -pe "s/myacct\@server1.mydomain.com/mynewacct\@cvs.mydomain.com/g;"$(find . -name Root)

On Windows, you can use the extended FOR syntax to descend the directory tree:
for /R %r in (Root?) do perl -i.orig -pe "s/myacct\@server1.mydomain.com/mynewacct\@cvs.mydomain.com/g;" %r

These perl one-liners (-e) loop line-by-line (-p) through the file, modifying it in-place while also creating a backup file with the .orig suffix (-i.orig). Each line of the file is evaluated with the global search and replace regular expression (s///g).