Business of Software

Overtime

'Overtime' from MotiFake.com
A while back, I read a blog post on Big Bang Technology’s blog written by Max Cameron titled “Why We Don’t Work Overtime“. I will give a full disclaimer here at the outset, I probably work too many hours, so I have a little bit of skin in this game. Namely, I could be accused of only responding because my work choices were being invalidated by someone else. That certainly isn’t my impetus for this blog. I merely wanted to offer a different perspective to Max Cameron’s blog post.

Cameron is writing from the perspective of a Startup Company. He does make an exception to the overtime rule for the founders, but for his employees he says,

There are no heroes at our office. When the clock strikes five, 
the team goes home. If they try to keep working, I tell them that 
the game's over and they lost. They either put too much on their 
plate, got taken off-task, or were wasting time. None of those 
justify working past five, on a holiday, or over a weekend.

I certainly applaud his motiviations. He sticks to this rule even when clients ask for it, when they’d need it to win new business, etc. It is one of his company’s core values and they stick to it. Everyone realizes that when an employee (especially a salaried one) works overtime, he is “doing more than he agreed to” and is “taking away family time” and “upsetting the work/life balance”. However, what I find interesting are some of the reasons that their company takes that choice away from their employees.

One major reason that Cameron cites is that to persuade employees to work overtime, the noble concept of “sacrifice” is invoked. In his mind, soldiers, firefighters, and police officers sacrifice, and to try to align that concept with “expected overtime” is a dangerous habit to get in to.

He points out that the employees who work over are the “heroes” and those who don’t are “losers who let you down”. In his words, “Yearly reviews just got a whole lot easier”. Later he says, “How could I promote a loser when they’re surrounded by winners?”.

I want to deal with that point first. He is obviously being rhetorical and a little sarcastic with those last quotes, arguing his point to ad absurdum. However, I think there is a point to be investigated there. My current boss has taught me a lot about managing people and the value of making “the hard decision”. It sounds to me like Cameron is welching a little bit on managing employees. Sometimes, you have to make the hard choices. As my boss likes to say, “Who do we pay to do the hard stuff?”.

Imagine on one hand that you have an employee who works only 40 hours and is very productive, gets along well with others, is a leader, and so on. Now, imagine you have another employee who works a ton of overtime, but you know that it is because he isn’t very efficient. He has a good work ethic and to make up for his lack of efficiency (and “social time” during work hours), he tries to even it out with that overtime. Now, if you are a manager who can’t promote Mr. Productive Forty and explain to Mr. Compensating why he didn’t get the job, you aren’t much of a manager and should rethink your career path.

Let’s pretend there is another scenerio. This time, you have two very equal employees. One of them is a “5:01 Developer” (gone by 5:01 every day) and the other works over to make sure things get done on time, or to add special features off of the “nice to have” list that never gets prioritized ahead of “big projects”. In that case – all else being equal – why wouldn’t you promote the overtime guy?

These kinds of decisions are why you are the person writing the reviews.

A point that Cameron makes alongside this one is the concept of burnout. This is definitely a very real problem. However, I feel that he’s again arguing to take the “copout” path. He seems to be claiming that it is impossible or would require too much work to monitor and make sure that his employees aren’t burning out. There is a big difference between running a guy at 80+ hours a week for months at a time, working 1 or 2 60-70+ hour weeks before huge release, and regulary working 50 hours a week because that’s what you are comfortable working.

As I admitted earlier, I definitely work overtime. I am soon taking my first vacation week in years (only because the company stopped paying out for unused time – I have to “use it or lose it” and I’m too practical for that 😉 ). However, I’ve been going at this pace for about five years straight now, across 2 companies. I’m not close to burnout. You can’t manage people homogeneously, you have to manage to the individual. I’m more of a sports car, not a minivan, there is no danger of running the engine at a little bit higher speeds.

I’m not bragging. My point is that I’m different than other people and a team needs all kinds of people on it. The Apostle Paul actually writes to this point quite eloquently in the Bible in 1 Corinthians 12:14-21:

Even so the body is not made up of one part but of many.
Now if the foot should say, "Because I am not a hand, 
I do not belong to the body," it would not for that reason 
stop being part of the body. And if the ear should say, 
"Because I am not an eye, I do not belong to the body," it 
would not for that reason stop being part of the body. 

If the whole body were an eye, where would the sense of hearing be? 
If the whole body were an ear, where would the sense of smell be? 
But in fact God has placed the parts in the body, every one of 
them, just as he wanted them to be. If they were all one part, 
where would the body be? As it is, there are many parts, but one body.

The eye cannot say to the hand, "I don't need you!" And the head 
cannot say to the feet, "I don't need you!" 

There are things I do well and things that I don’t do well, and I realize that I don’t always see them clearly. The way that that is remedied is that my team is made up of all sorts of people. The person building the team knows what he has, and fills the gaps appropriately. The fact that I can easily work 50 hours a week or more without burning out is just a tool that my company has at its disposal, just as all of the other skills of employees are at their disposal.

One point that I just could not grasp in Cameron’s blog post was the fact that he is willing to let his clients down because of this overtime policy. Even if the work completed because of overtime would win their clients more business or help solve a serious problem that they are having, overtime is still off limits.

I see nothing wrong with working over to win new business, for you or for one of your clients. Your client has likely worked with others who cannot deliver these things and you make yourself indispensible to him as someone who can deliver them. But again, there is the potential for abuse, but that relies on your client service managers or account representitives to “do the hard stuff” of recognizing and stopping abuse before it gets anywhere.

As I was discussing this topic with a good friend of mine, he pointed out to me that one problem he had with overtime was that it “excused” or “covered up” poor planning. For instance, if a project was projected to have 15 features and be delivered in 2 months, but was estimated poorly, that can be a problem. Proper Agile philosophy is to have the business either extend the date based on the metrics from the iterations, or cut features. Another approach is for it to still spend the hours, but spend them in 60, 70, or 80 hour weeks to meet the deadline. That’s a “death march” and no one really wants that.

However, sometimes it is politically expedient to deliver the project by working the overtime. Not everyone works at a company that can afford to turn down external clients or at a consultancy that can easily refuse work. A good deal of software development is done as part of an “in-house” shop that develops software for “an enterprise”. There are 100 ways that you can curry favor by seemingly doing the impossible and those who don’t see the value in that don’t have a very mature view of the “real world”.

However, the issue then comes if you don’t learn a lesson about your estimating and back yourself into those kinds of corners on project after project. Again, I fall back on “Who do we get to do the hard stuff?” If your Project Managers can’t control these projects from the outset, you probably have the wrong people in there.

This has definitely been one of my longer rants and I know that a lot of people will disagree with me. Feel free to leave a comment below, or blog your own responses. If you do a reaction blog, please link it in the comments so that I can read the discourse and the other readers may benefit, as well.

Conferences

My Pittsburgh Code Camp 2011.1 Slides and Links

I just completed my talk, “Git for .Net Developers” and – as promised – here are my slides. I’ve got them up on SlideShare and also a straight Powerpoint Download.

Links pulled out of the Powerpoint

Download msysgit (I recommend downloading Portable Git)
Git Extensions
GitHub’s Setup Help
Git Immersion
Why Git is Better Than X
Best Git Cheatsheet Ever

If you were there, please Rate My Talk

A question came up about tools that can help you migrate, or use as a bridge.

SVN-Git Bridge (Read this Stack Overflow Q&A (SVN-Git is included in certain downloads of msysgit)
TFS-Git Bridge

Conferences

Speaking at Pittsburgh Code Camp 2011.1

Last Saturday, I got the news that I’ll be speaking at the Pittsburgh Code Camp at Robert Morris University in Pittsburgh, PA. Being from the area, it is kind of exciting to have the first place that I get to present be my hometown.

My talk is called “Git for .Net Developers” and my preparation is already well underway. I’m really excited about sharing this topic with others. At first, I was a little nervous about filling up the entire hour and fifteen minutes, but now I’m wondering if I’ll need to cut some things :). I plan on running through this about a million times before April 30, so I’m sure I’ll figure it out!

Here is a copy of the schedule as it is laid out at the time of this post (click for larger version):
2011 Pittsburgh Code Camp Schedule

I’d really like to get into presenting to the community in a big way, so I’m definitely excited for both this opportunity and for the opportunity to get feedback so that I can be the best speaker that I can be. If you are anywhere near Pittsburgh and are free on Saturday, April 30th, you should definitely come out to the Code Camp. Use this link and sign up. It is free, but they want your registration so that they are sure to have enough space and enough lunch! I hope to see you there.

Goals

Node.js Build From Source Failed

I was attempting to move on to another of my 2011 Technology Resolutions and start working with Node.js. I have already watched several of the free Node Tuts screencasts and also messed around with Node on someone else’s machine. Now I wanted to get down and dirty with it myself. As I got the source from Github, I followed the installation instructions for the Mac but got the following error:

Build failed:  -> task failed (err #1): 
	{task: cxx platform_darwin.cc -> platform_darwin_4.o}

Well, crap. It is bad enough that getting Node up and running is still pretty painful, but now I get this very cryptic (to me) error message. The great news is that I used my Google-Fu to find out that the problem was that I had gotten the master branch of the source and that was just not going to work. So, I got the latest branch (currently the v0.4 branch) and followed the installation instruction steps again. This time it was a win.

Incidentally, I also could have just used Homebrew and installed it with the simple command:

brew install node

Next time, then 😉

Git

Git > Charlie Sheen

In my last post, I talked about being shown something that just blew my mind about the power of branches in Git and as I understood what was happening, this little experiment got me to REALLY understand just how changes are tracked in Git and how branching and merging works in Git, as well.

To begin with, if you don’t understand Git at all, or are really confused after reading this post, I recommend going to Git Immersion. I’ve found no better tutorial and it got me from 0 to successfully using the product pretty quickly. You have to have Git installed and configured if you want to follow along with my examples in this post.

To start out, navigate to an empty directory. I opened my Powershell console and from my root typed these three commands, one at a time.

mkdir ninja
cd ninja
git init

I then saw the following:
Create Ninja Git Repo

Let’s create a text file in our directory containing the contents of the directory.

ls > DirectoryContents.txt

Now our directory looks like this:
Create Directory Contents File

Our next step is to add the file to be tracked by Git and commit it. I typed in these commands, one at a time

git add .
git commit -m 'Created Directory Contents File'
git status

My output looked like this
Adding the file to Git

Now we are all set. I plan on doing some work on a feature here, so I’m going to branch this repo so that I can make changes in isolation and then merge back.

Type in

git branch pirate
git branch

The first statement creates a branch of the repository called pirate and then calling the branch command by itself lists the branches you have. You’ll notice that master is colored and has an asterisk (*) next to it, indicating that it is the branch that I’m working in.
Create the Pirate Branch

Now if you issue these commands, you will see that we have switched ourselves to the pirate branch to do our work.

git checkout pirate
git branch

Switch to the Pirate Branch

Now let’s delete the existing file and create a new one and look at our directory.

del DirectoryContents.txt
ls > PirateFile.txt

Current Pirate Repo Directory

Okay, we’ve been having fun, but now we need to make an emergency fix back on the original file in the original branch. Let’s commit our pirate changes and switch back to master. If we just issue these commands we see that our directory is really just as we left it the entire time.

git add .
git rm DirectoryContents.txt
git commit -m 'out with the old, in with the new'
git checkout master

Directory Contents is on Master

Now, let’s visit the pirate branch again.

git checkout pirate

Back in Pirate Repo

To me, that really just threw a switch and I began to understand how Git was tracking individual changes one by one and could “play them back” against a repo to perfectly put you wherever you needed to be at any point in time. In TFS and SVN, you branch to another directory, which if you have a web app, causes a lot of IIS configuration changes. Even if you don’t do web apps, if you branch per feature, you are going to have a lot of “spare” directories lying around. That just makes my OCD hurt.

I know that SVN has the “switch” command, that takes the branch from the central repo (which is in a different directory) and puts it in your current directory structure. That certainly behaves a lot like Git branching, but when you add in Git’s other features, I’ll definitely have to choose Git over SVN as well as TFS.

Hopefully I’ve explained this well and you get exactly how powerful and simple this is and how Git can really alter your relationship with source control. My initial fears were that Git would get in the way (because of the command line stuff, etc), but instead Git has made source control get out of my way and just let me focus on dominating the codebase 😉