The Life and Times of a Dev

Yes, we're really that weird
posts - 181, comments - 310, trackbacks - 106

My Links

News

Twitter










Tag Cloud

Archives

Post Categories

Play

Work

Wednesday, March 21, 2012

Why I LOVE Dell

We recently ordered a laptop for an employee.  It was delivered yesterday and we realized it had no web cam and wasn’t the 1080p resolution.  He wasn’t happy.

So, this morning, I sent an e-mail to our rep and asked him what we could do.  Within an hour or two, he called me, arranged a replacement laptop with the corrected specs, set up a return and had everything arranged and charged us only for the difference.  No pain, no silly questions.  We won’t loose use of the laptop either.  The return and the new laptop will overlap so that we can just pack up the old laptop in the box of the new one, slap some labels on and away we go.

This has been my experience with Dell over the past 10 years.  Their corporate service has always been fantastic, and it’s made me a huge fan.  Keep up the good work, Dell!

Technorati Tags:

Posted On Wednesday, March 21, 2012 11:21 AM | Feedback (2) |

Tuesday, February 21, 2012

Converting Hyper-V to VMWare

Our company is standardizing on VMWare for a number of reasons.  I won’t list them here, but wanted to write about a problem that I had using VMWare Standalone Converter version 5.0 to convert Hyper-V virtual machines.

There were four problems:

  1. The converter needs to be run as an administrator
  2. You have to be connected to localhost or you’ll be prompted to install the standalone agent first
  3. Domain credentials don’t work as expected
  4. You need to give explicit permissions to Everyone the directory where the virtual machines are stored

Running as an Administrator

The first problem is the easiest to figure out what’s going on.  Basically, when you run it, you get the error:  A general system error occurred:  Crypto Exception: error:02001005Confused smileystem library:fopen:Input/output error:unable to load C:\ProgramData\VMWare\VMware vCenter Converter Standalone\ssl\rui.crt

image

Easy to fix, just run as an administrator.

Connect as LocalHost

If you try to connect to the full domain name of the machine when you’re running the converter from the hyper-v machine, you’ll be prompted to install the Standalone agent, which will promptly fail because another version is already installed.  It’ll look something like this:

image

The fix to this is easy to.  Just connect as localhost.

Domain Credentials Don’t Work

This one is tougher to figure out because basically, you get no help understanding what the problem is.  What happens is that you’re able to connect to Hyper-V and see a list of the machines, but when you select ANY machine on the server, you get the error:

Unable to obtain hardware information for the selected machine. 

image

This one is a pain.  Basically, the solution to this is to create a new local user and make them part of the Administrators group.  Then, you’ll need to log in on the machine using that user name and use that user name for the permissions when connecting to the Hyper-V.

Once you’ve done that, you’ll think that you can get past this error, but then you run into issue #4.

Changing the Directory Permissions

In our case, our vms were stored in f:\VirtualMachines.  You’d think that a domain admin/admin would have the ability to read information from anywhere but something that the standalone converter is doing prevents it.  You’ll get the same error as above in #3.  The fix to this is to make sure that “Everyone” has full control permissions to the directory where your files are stored and all of the sub directories.  I also did the same through the share, but I’m not sure if that was needed or not.

Conclusion

After addressing all of these items, we’re converting quite happily.  Hopefully, this will help you as well.

Technorati Tags: ,

Posted On Tuesday, February 21, 2012 6:24 PM | Feedback (0) |

Friday, January 13, 2012

DBDeploy.Net 2

We’ve used dbdeploy.net on a number of projects and have found it to be a useful tool, especially around CI environments.  We recently started a Windows Azure project that uses SQL Server and discovered that DbDeploy.Net didn’t work.

There have been a few nagging issues with DbDeploy.Net as well, like the lack of support for recursive script directories, and when we looked into the code base, we discovered that it’s not really written to modern software development standards, and that getting it there would take quite a bit of work, almost as much as just rewriting it, and not much effort has gone into the original version lately.

Not wanting to shirk from a challenge, we rewrote it. Smile  We didn’t use any code from the original.  Some of the concepts are similar, but for the most part, it’s a complete rewrite.

You can download the new version at http://dbdeploynet2.codeplex.com. There’s still plenty of work to do, but its fully functional (and unit tested) for Sql Server and Sql Azure environments, provided that your scripts are Sql Azure friendly (the scripts that Sql Server Management Studio generates are not, but easy to fix).

We look forward to your feedback.

Technorati Tags: ,

Posted On Friday, January 13, 2012 12:08 PM | Feedback (0) |

Physician, Heal Thyself–ScrumMaster, Master Thyself

In the New Testament in Luke 4:23 Jesus speaks of a proverb, “Physician, Heal Thyself.”  What, you may ask, does this have to do with being a good developer or a good ScrumMaster?  In my experience, it has quite a bit to do with it, actually, and recently, it’s had far more meaning to me than it used to have in the past.  In large part, my own increased awareness has stemmed from reading Lyssa Adkins fantastic book, “Coaching Agile Teams.”

My Command and Control Roots

My dad owns several independent telephone companies in the west.  Growing up was a lesson in business.  I saw him grow the business from a small company of only about 500 customers to now thousands of customers in Oregon, Kansas, Utah, and Idaho.  In many ways, he’s been quite successful.  I’ve participated in lobbying congress, seen him work on advisory boards for independent telephone companies and watched him interact with his employees.

From there, I went to Idaho State University and received my Bachelors of Business Administration majoring in computer information systems.  I even started my MBA.  All of this was fantastic for me to learn and taught me quite a bit.  However, it all also taught me how to be an expert at Motivation 2.0.  Many also know this as Command and Control. They taught me how to be a manager.  If I could hold everything in my head, and tell people exactly what to do, I was being a good manager.  I was taught that employee’s weren’t to be trusted, because they’d cheat and look for ways skip on doing work.  I was taught that timesheet’s in 15 minute increments so that you knew what people were doing at any given point in the day was a good thing.

I was so bad, that I even once installed a time system that used the employee’s fingerprints to clock in and out.

Ghastly, I know, and I’m deeply ashamed of that period in my life.

My Transformation

About 10 years ago, I started to realize the error of my ways.  I didn’t understand it at first.  My dad’s company had a consulting firm come in and do an evaluation of why they were struggling with morale, and almost refused to work with us as a company because of the results of a survey that they took of the employees.  It was/is that bad.  That was the catalyst for me to start learning.  It’s what I needed to hear to try and become better.

I left my dad’s company and moved to a government agency, which didn’t help my understanding of command and control.  I could see the problems it was causing in the teams, but still didn’t understand why.  Finally, I ended up as CTO of a local firm and started running my own team.  I got the chance to practice not being command and control.  I read about the agile thing it was hard, but I was doing better. Not good, but better.  I still didn’t get it.  I thought I was Agile, was using a RUP derivative (sort of), had heard of Scrum and thought I was doing what was needed, except that the entire thing blew up in my face and I didn’t know why.

Finally, I started a new job as a project manager for Veracity Solutions.  Almost immediately, things started to go downhill, similar to my last company.  My response was, “O.k., I just need to control things tighter and everything will be o.k.”  It wasn’t.  I was scared.  I didn’t want another failure.

I became very introspective and I realized that the problem wasn’t the team, wasn’t the process, wasn’t the other people.  The problem was me.

I WAS THE PROBLEM!!!

I put that big and bold so that every time I see it, I can ask myself the question,

AM I STILL THE PROBLEM?

Each day, I’m striving to continue the transformation.

Heal Thyself

Recently, I read much of Lyssa’s book and realized that I still have a long way to go.  I had become a master of the mechanics of Scrum, but I hadn’t yet mastered the people side of scrum.  I am still using violent language, I’m still not as aware of my emotions as I’d like to be.  I’ve discovered that I have a growing edge (the rough boundary between things I’ve mastered and things that I stink at) that is much closer than I want it to be.

Coaching is all about helping PEOPLE become better than they currently are.  It’s not about the mechanics of some process.  It’s not about process at all.  It’s about becoming a better person.  When I wasn’t introspective, I was trying to make people become just like me, controlling, terrible people.  I had to heal myself first.  I had to recognize that people around me have the same wants, needs, and desires that I have and that I can only be successful when they are also successful.

I’m still not perfect, but I am growing closer to that vision of myself that I’ve always had.  I’ve gone from having the bubonic plague to having the bird flu, and I’m getting better, hopefully every day.  At least I’ve never been turned into a newt.  That would have been a much harder starting place.

If you want to coach others, please take the time to understand yourself and make sure you don’t have any lingering patterns that will cause you to be ineffective as a coach.  For the software development world, Lyssa’s book can help.  For the religious world, Christ’s example can help.

Whatever your source of inspiration, seek to make those around you better and together, we can move into a better world.

Technorati Tags:

Posted On Friday, January 13, 2012 11:54 AM | Feedback (0) |

Thursday, December 29, 2011

Age of Empires Online

I’ve been playing Age of Empires online now for a few months and I really like the game.  I’ve always been a fan of the series, and they did an excellent job on this one as well.

They’ve made it free to play, but, of course, if you want all of the features, you’ll need to purchase a pro civilization, which I’ve done.  I figure that I’d pay $50 for the game if they had released it in the traditional way, so the price was actually quite reasonable.

If you like RTS games, this is a great one to add to your collection.

Technorati Tags: ,

Posted On Thursday, December 29, 2011 6:04 PM | Feedback (0) |

Wednesday, December 28, 2011

Extending Unity

Unity is a great IoC container.  One thing that is lacking, however, is the ability to automatically resolve requests without some kind of mapping.  In the past, I’ve applied attributes to classes to do that mapping or used a config file.  Recently, though, I looked into extending Unity itself and discovered that it’s actually quite doable to do so. 

I’ve created an “AutoResolver Strategy” that will allow Unity to take any interface request and automagically translate that into a resolution.

It assumes that you’re using the following naming pattern for your interfaces:  “I” + Concrete Class Name.  For example, the interface for the ConfigurationService would be IConfigurationService.  A request that looked like UnityContainer.Resolve<IConfigurationService> would automatically resolve and create an instance of ConfigurationService.

To support testing, when I write code, every concrete instance has an interface, and I use dependency injection, usually constructor injection, to inject those types into the classes where they are needed.  In most cases, there’s a one to one mapping in the production code between the interface and the concrete type.  When writing unit tests, however, I’ll often need to mock the dependencies.  I prefer Moq for this.  I’ll make my mock, and then put that mock into the container that will be used to run the test with a container controlled lifetime and voila, my type has been replaced.

Basically, this gives me the best of both worlds.  I can still create a mapping or use a config file, or I can autoresolve and not mess with mappings.

Here’s the class.  Details on attaching it to the container are below.

// -----------------------------------------------------------------------
//  <copyright file="AutoResolverStrategy.cs" company="Veracity Solutions, Inc.">
//      Copyright (c) Veracity Solutions, Inc. 2011.  This code is licensed under the Microsoft Public License (MS-PL).  http://www.opensource.org/licenses/MS-PL.
//  </copyright>
//  <summary>
//      Created By: Robert J. May
//  </summary>
// -----------------------------------------------------------------------

namespace Veracity.Utilities.IoC
{
    #region Usings

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Reflection;

    using Microsoft.Practices.ObjectBuilder2;

    #endregion

    /// <summary>
    ///   Represents a strategy for performing mappings when the given type isn't already mapped.
    /// </summary>
    public class AutoResolverStrategy : BuilderStrategy
    {
        #region Constants and Fields

        /// <summary>
        ///   An object to use for locking.
        /// </summary>
        private static readonly object lockObject = new object();

        /// <summary>
        ///   A cache of type mappings that we've looked up already.
        /// </summary>
        private static readonly Dictionary<string, Type> typeCache = new Dictionary<string, Type>();

        #endregion

        #region Public Methods

        /// <summary>
        ///   Looks for an existing mapping. if not found, attempts a mapping based on the name of the resolve request.
        /// </summary>
        /// <param name="context"> The current context for the buildup. </param>
        public override void PreBuildUp(IBuilderContext context)
        {
            // Note that this is the same functionality as the default BuildKeyMappingPolicy.  The difference is that if we have no policy, we infer one.
            var policy = context.Policies.Get<IBuildKeyMappingPolicy>(context.BuildKey);

            if (policy != null)
            {
                context.BuildKey = policy.Map(context.BuildKey, context);
            }
            else
            {
                if (context.BuildKey.Type.IsInterface)
                {
                    string interFaceName = context.BuildKey.Type.Name;
                    string interfaceNamespace = context.BuildKey.Type.Namespace;

                    // By convention, all of our interfaces start with I, and by convention, the concrete type that they implement is the same name without the I.
                    if (interFaceName.StartsWith("I"))
                    {
                        string newName = interFaceName.Substring(1, interFaceName.Length - 1);
                        string fullName = interfaceNamespace + "." + newName;

                        Type concreteType = null;

                        if (typeCache.ContainsKey(fullName))
                        {
                            concreteType = typeCache[fullName];
                        }
                        else
                        {
                            Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();

                            foreach (Assembly assembly in assemblies)
                            {
                                concreteType = assembly.GetType(fullName);
                                if (concreteType != null)
                                {
                                    lock (lockObject)
                                    {
                                        if (!typeCache.ContainsKey(fullName))
                                        {
                                            typeCache.Add(fullName, concreteType);
                                        }
                                    }

                                    break;
                                }
                            }
                        }

                        if (concreteType != null)
                        {
                            NamedTypeBuildKey oldKey = context.BuildKey;
                            NamedTypeBuildKey newBuildKey = new NamedTypeBuildKey(concreteType, null);
                            context.BuildKey = newBuildKey;

                            // look for persistant policies for this interface name
                            ILifetimePolicy lifetime = context.PersistentPolicies.Get<ILifetimePolicy>(oldKey);
                            if (lifetime != null)
                            {
                                context.PersistentPolicies.Set(lifetime, newBuildKey);
                            }
                        }
                    }
                }
            }
        }

        #endregion
    }
}

 

Once you’ve got this class into place, you’ll need to create an extension that tells Unity when to use the strategy.  I use this extension:

 

// -----------------------------------------------------------------------
//  <copyright file="AutoResolverUnityExtension.cs" company="Veracity Solutions, Inc.">
//      Copyright (c) Veracity Solutions, Inc. 2011.  This code is licensed under the Microsoft Public License (MS-PL).  http://www.opensource.org/licenses/MS-PL.
//  </copyright>
//  <summary>
//      Created By: Robert J. May
//  </summary>
// -----------------------------------------------------------------------

namespace Veracity.Utilities.IoC
{
    #region Usings

    using Microsoft.Practices.Unity;
    using Microsoft.Practices.Unity.ObjectBuilder;

    #endregion

    /// <summary>
    ///   Extends unity to automatically resolve most items based on naming convention.
    /// </summary>
    public class AutoResolverUnityExtension : UnityContainerExtension
    {
        #region Methods

        /// <summary>
        ///   Initializes this extension.
        /// </summary>
        protected override void Initialize()
        {
            this.Context.Strategies.AddNew<AutoResolverStrategy>(UnityBuildStage.TypeMapping);
        }

        #endregion
    }
}

Then, you’ll need to attach the extension to the container, like this:

var container = new UnityContainer();
container.AddNewExtension<AutoResolverUnityExtension>();

That’s it.  Enjoy!

Technorati Tags:

Posted On Wednesday, December 28, 2011 11:13 AM | Feedback (0) |

Monday, October 17, 2011

Effective Stand-ups

When teams are first introduced to Stand-Ups, many teams will dread them.  Their thought is, “Oh great!  Yet another meeting to consume a bunch of my time!”

I certainly understand this sentiment, and if run incorrectly, stand-ups are certainly painful and can be a waste of time.  Stand-ups are fundamentally about coordination between team members and nobody else.  To restate that, stand-ups are for the pigs, not the chickens!

This post is to help you understand what a good stand-up is and how best to keep people from dreading your stand-ups.

What is the Stand-Up?

Before I jump into how to make a stand-up effective, I’d like to talk more about what a stand-up is.  The basic structure of the stand-up is this:

  1. The team gets together at a regularly schedule time
  2. The team meets every day at the same time
  3. Everyone on the team attends
  4. The ScrumMaster starts the meeting on time and picks the first team member to start
  5. The team coordinates around the questions:
    1. What did I do yesterday?
    2. What am I working on today?
    3. Is anything blocking me?
  6. The stand-up ends when everyone has had a chance to answer the questions
  7. After the stand-up, the ScrumMaster helps resolve any blockages identified during the stand-up

That’s it, but many teams try to make it much more complex than that.  Because of that, next I’ll try to give some examples of how people fail with stand-ups.

Stand-Up Dysfunctions

I’ve seen several types of dysfunctions in my years as a ScrumMaster.  They tend to be quite common, and all can be addressed.  Interestingly, “long” stand-ups are usually a side effect, not a problem!  With the exception of teams that are too big, I’ve never seen stand-ups go long on a regular basis for teams that are functioning well.  Here are the most common issues I’ve seen in Stand-Ups.

  1. Using stand-ups to report to management
  2. Using stand-ups to solve design issues or other problems
  3. Monopolization of stand-ups by either pigs or chickens
  4. Lack of participation from certain team members

Using Stand-Ups to Report to Management

This is, by far, the most common problem with Stand-ups.  Note that Management can include the ScrumMaster.  A key sign of this happening is that team members are required to bring in story numbers, defect numbers, etc. to the stand-up and tell exactly what they did for each story.  Team members will typically make eye contact with the manager or ScrumMaster to whom they’re reporting.  When reporting like this happens, Management will often give feedback or direction during the Stand-Up.  This is a great example of a Chicken talking when they shouldn’t be.

Of course, this can be tricky, since Management often controls your paycheck, but as a ScrumMaster, and as a team, you need to make sure that the team has the time to coordinate that they need.  One way to solve this problem is to ask the manager in question to not come to the stand-up for a week and promise that you’ll give him detailed information about what was said.  If they’re a good manager, they’ll probably go for this.  This will let you reshape the stand-up to be about coordination.  You’ll be able to introduce new interaction styles between the team members.

Another strategy is to ask the manager to not talk during the stand-up.  In fact, if they’re willing, have them focus on their phone, like they’re dealing with important e-mail messages.  Breaking eye contact has an interesting effect on people’s behavior.  We expect that the people we’re talking to will look us in the eyes.  By breaking eye contact and not talking, the team won’t feel like they’re talking to the manager and they’ll be more likely to make eye contact with other team members.

A third strategy is to actively look for points of coordination and call them out; give them special attention.  That will start people thinking in terms of coordination and over time, they’ll start to coordinate normally.

A final strategy is to ask, after every report, “How can we help you with that?” or “Is there anything that you need to coordinate around those items with the team?”

Using Stand-Ups to Solve Design Issues

This problem also really happens frequently.  Basically, a team member will bring up a problem, and the rest of the team begins to try and solve the problem.  This collaboration is great, and you want to foster it in general, but not during the stand-up.  My strategy here is to try and make a determination as to how long the discussion is likely to take.  If you’re working with a small team, a little more talk can be tolerated.  If the conversation appears to be likely to take a lot of time, simply say, “Can we take this offline?”  If the team doesn’t respond well to that, interrupt and say, “This is a great discussion.  We need to move on with the stand-up, so I’ll schedule a meeting where we can continue this discussion.  Who’s next?”

Most teams will respond to the first well, some will require you to be more forceful, but curbing design discussions can greatly enhance your stand-ups.

Monopolizing Stand-ups

Some team members just like to hear their own voices!  Sometimes, it’s because they’re really happy with what they’ve created.  Other times, they just don’t know how to filter the content that they’re giving.  Sometimes, they do it to try and manipulate the stand-up.  Often, team members are giving details on how they did something, rather than what they did, or are treating the situation as a reporting situation, rather than a coordinating situation.

Monopolization is most typically solved by individual coaching of team members.  Don’t do it in stand-up, unless you give the feedback generically at the beginning of your stand-up.  Instead, talk with the team member and then do role playing.  Most people are very receptive to this type of coaching and will gladly change, if that will make stand-ups shorter.

Some people are more recalcitrant and will require more work.  Be patient, and if you can get the rest of the team to function well, they’ll see that they’re standing out and be pressured to change.

Another strategy is to tell everyone that they’ve got 2 (or whatever) minutes to give their stand-up.  Then, bring an egg timer into the meeting and use it for each team member.  When it goes off, they’ll know they’re going over.  The noisy bell tends to be very effective at getting people to focus their thoughts.

Lack of Participation

This is a tough one.  This usually happens when people are resisting the change to agile.  I’ve actually heard, “Yesterday, I did stuff.  Today, I’ll do some more stuff, and I’m not blocked.”  I’ve heard that when people were joking, but I’ve also heard that from people that were serious.  Without major attitude change, team members that behave this way are going to cause major disruptions on the team.

First, try approaching them and giving them coaching about how their behavior is impacting the team.  If they still resist, become more blunt.  If they still resist, you’ll need to get HR involved, and they may not be the right person for the team.  Remember that technical ability does NOT trump the ability to work on a team except in rare cases.  If they don’t change, move them out.

Conclusion

I hope that this has been useful in helping you understand how to make your stand-up more effective.

Technorati Tags: ,,

Posted On Monday, October 17, 2011 11:59 AM | Feedback (1) |

Wednesday, October 05, 2011

Spotify Failed Me

Recently, a co-worker was talking about how wonderful Spotify was, and I decided to give it a go.  I signed up for the ultimate version, because, hey, if you’re going to try something, you should give it a fair shake. Smile  I’m also a Pandora One subscriber.

The end result is that I’m canceling my Spotify subscription and returning to Pandora.  I’ll still use it when I really want to hear a specific song, but probably won’t spend much time in it.

You should know that 85% of the time, I’m a “Give me X genre of music” type of guy, not a “I want this song now” type of guy.  I don’t like to spend time building playlists.  I have better things to do.

So, here’s what I liked:

  • The ability to listen to music offline.
  • The ability to listen to pretty much any song I wanted.
  • The price.  $9.99 felt cheap.

Here’s what I didn’t like:

  • Their “radio” feature is terrible!!!  The Home Alone soundtrack is NOT classical.
  • No ability to play music like the current version I’m playing.
  • Finding similar artists works sometimes, but isn’t obvious.
  • the ITunes interface.  Have I mentioned how much I HATE the itunes interface?
  • Manually administering my playlists.  I just don’t want to spend the time, and I don’t want to listen to the same play list over and over.

So, because I usually find myself wanting to use the features in the dislikes group, I think Pandora is a better fit, even though I can’t always play a song that I want to hear when I want to hear it and even though it does repeat sometimes.

Where do you find yourself?

Technorati Tags:

Posted On Wednesday, October 05, 2011 10:42 AM | Feedback (1) |

Wednesday, September 21, 2011

Build 2011

I just got back from Build 2011, and rather than spout my own theories (I’ll get to them later), I want to point you at a post by Kieth Elder.

Basically, he says that there are two modes of using data, creation and consumption.  Metro is for consumption, desktop mode is for creation.  I think he’s spot on!

Technorati Tags: ,

Posted On Wednesday, September 21, 2011 10:28 AM | Feedback (0) |

Thursday, September 01, 2011

Technical Talent Versus Team Dynamics

Is technical talent more important than Team Dynamic?  I don’t think so.  Read on and tell me if you agree.

The Art of the Interview

For my job, I conduct quite a few technical interviews.  Rarely will I have a week go by where I’m not digging into someone’s brain trying to find out what they know and how they think.  However, understanding their technical knowledge is only part of the challenge.  We also must understand whether or not they code quickly, and whether or not they they will be a good fit for our teams.  Technical talent is only part of the equation. 

If you’re planning on an interview with Veracity, expect us to push you a bit, just to see how you react.  If you react poorly, even though technically you’re outstanding, you probably will not get an offer to join us.

We’re that serious about team dynamics.

Nothing will kill a team faster than someone who is technically strong, but refuses to work with the rest of the team.  The risk of failure on teams with members that refuse to comply with the team culture is very high.  Ironically, often, the team members that are the hardest to work with may not be that good.  We often find that people who are very difficult to work with, even though they may be considered very good by their peers, are often hiding behind that arrogance.  On several different occasions, once their actual performance was evaluated, they were more mediocre than was expected.

How to be a Good Team Member

So how do you avoid being the team member that hides in the darkness and doesn’t want anyone to know what is really going on?  For some, this can be tough because they feel like they’re being micromanaged.  Recognizing that visibility to your team isn’t micromanagement.  Having a manager tell you exactly what to do is micromanagement.  Recognizing that you work with people, not machines is also important.  In general, being charitable with those around you is key to wanting to work with them in a team.  They’re not a distraction, they’re why you do what you do, and without them, what you do would be meaningless.

That feels ephemeral, but that’s reality.  As soon as an individual recognizes that working together is the only way to produce great products for people, their behavior changes.

Compare the development team to a relay race.  If one individual tries to run the entire race for the team, they’ll be left in the dust by teams that understand that with four people, they can be much faster, even if individually they’re slower than the single guy.

Change or be Left Behind

Finally, if your company has decided to adopt Scrum you have two choices:  You can either change, or you can be left behind, which may mean you won’t have a job in the future.  Everyone else on the team will likely see the value, and if you’re a non-contributor, even if you write really good code, they’ll likely view you as being less valuable and ask you to move on.

Change may be hard, but it beats looking for a new job, doesn’t it?

 

Technorati Tags: ,

Posted On Thursday, September 01, 2011 11:52 AM | Feedback (3) |

Powered by: