I have been watching recently twitter comments about people “repaving” or rebuilding their machines.  Recently I have added a couple of new developers to one of my teams and received feedback that it took quite too long to get them up and running to be productive. Lastly, my machine was due for a “repave”.  Realizing a real good machine image could increase productivity, I set out on an adventure.  Here are my thoughts:

Identifying the Image

My first step was to identify the image contents.  I made an initial list and then worked with the development team to understand what was essential as part of the build.  Here is the final list we came up with:

  1. Operating System – Vista Business
  2. Productivity Programs
    1. Microsoft Office Programs – Include OneNote
    2. Microsoft Visio
  3. Communications Programs
    1. SharedView (This has been critical for customer interaction)
    2. Messenger
  4. Browsers
    1. IE 8.0
    2. Firefox (Latest Version at Image time)
  5. Development Tools
    1. IDE
      • Visual Studio 2008
      • ASP.Net MVC (RTW)
      • Web Deployment Projects (RTW)
      • CodeRush / Refactor
      • SharePoint Designer 2007
      • Telerik RAD Controls
      • AJAX Toolkit
      • XUnit 1.1
      • TestDriven.Net
    2. SQL Server 2005
    3. Source Code Controls
      1. Tortoise SVN
      2. ANKH SVN (Soon to switch to VisualSVN)
  6. Miscellaneous
    1. Anti Virus Software
    2. CCTray (Continuous Integration)
    3. Paint.Net

We missed a couple of things as part of the process.  This is to be expected.  In my next repave process I will look to add some of the additional tools that make us successful.  However, at this time it is pretty good and the rest of the install of these misses is minimal.

What didn’t go quite right

I think the most important thing to note was standardization of machines.  Most of the team has Dell M6300’s.  Unfortunately, not all of them.  I ended up actually creating two images at this point and am ensuring that developers have a machine that fits one of these two images.

Secondly, from an installation process, I installed Visual Studio 2008 first before SQL Server 2005.  This was a mistake, which I should have remembered from a previous install experience.  Management tools in SQL Server don’t install quite right if VS2008 is installed first.  After blowing away the SQL artifacts and reinstalling this was fixed.

Lastly, there were just a few things that kind of crept up.  Installing printers, capturing my email signatures, redirecting the user profile folders correctly.

What went well

The best news is that we proved the image to work and the total time was only about 1.5 hours to completely reimage the machine.  Since this was my machine that was reimaged, I was able to test and be up and running very quickly.  The same thing happened with the other machine that was imaged.  We used Windows deployment Services to do our images.

Conclusion

Overall the results have been very good.  Reimaging is done on off hours when necessary.  Also, the image server is available to our developers to “clean” their machine whenever they want.  I went from a potential impediment of 12 hours to about 1 1/2 (total time of additional configuration) for a machine.

For anyone who is managing a team that doesn’t have an imaging process for developer machines, I would highly recommend it.

Question:  How efficient is your new hire process in regards to developers?  Is a developer up and running on your project in two hours or two days? Can the developer start working on any project with a minimal impact to the team?  Lately these are some of the questions I have had. 

Determine your baseline

As the new developers have come on board, it was evident that our process is not as it should be.  I have been observing some of the blocks that have come during the process and made a baseline checklist of what needs to happen.  Here is where I am at today:

  1. Ensure the developer machine is imaged and ready to go.  This alone is difficult especially when the machine needs:
    • Latest Windows updates
    • New software tools
    • Miscellaneous updates as needed.
  2. Permissions – Ensure that any incoming developer has the right permissions to get to the materials they need to be productive.
    • Source Code Repository
    • SharePoint / Project information
    • Development Environment Resources
    • Account Access Groups
  3. Process Overview – How is the employee expected to work within the team.
    • Time management
    • Status reporting and documentation
    • POCs for questions
    • Overview of what they are working on

Streamlining the process

Right now this process takes between 1 to 2 days of time with multiple people involved.  Many pieces can be streamlined, even automated.  My goal is to break the processes down into “quick hits” and “long term nice to haves”.  Ideally, I would like a developer up to speed within 3 hours looking into code.

Is this doable?  Your thoughts are welcome

As a leader, coach, mentor, and manager I have been through many goal and objective meetings.  Through the conversations of helping determine goals for my team there are a few principles that I diligently adhere to:

These are not my goals but yours:

I have yet to complete goals that have been set by others with little or no input from myself.  It is a sad state of affairs when a manager has “determined what is best for the employee”.  When I first started leading a team, I was this manager.  To the detriment of the company I worked for, I alienated my team and made the goal process a wasteful paper drill that eventually ended up in the circular file.  To be fair though, the company instituted a very stringent goal setting process that lacked input from the employee.

Each individual now is responsible for going and providing the first cut of the goals.  I usually ask them to think about them in a S.M.A.R.T. goal format when presenting to me. I have found that this is very hard at the start for my team. However, we are getting better after a couple of iterations.  Below is an example of one of my employees (notice that it is not quite in SMART goal format):

  • Tech skills:
    • jQuery
    • WPF/Silverlight
    • Functional Programming / F#
    • Entity Framework
    • ASP.NET MVC
  • Project-related:
    • Remove a now-redundant middle-tier layer from our application
  • Business/Process:
    • Learn how to develop leadership skills among those with more technical experience
    • Develop an internal tool using new technology
  • Team goal:
    • Revisit and take ownership of the Definition of Done

Develop Goals for the Short Term

I typically ask that goals and objectives last no more than 1 quarter.  I have found this to be a very good time box.  This keeps the goals somewhat fresh in the employees mind.  It also helps to focus on some very specific goal setting.  Within the time period, I ask the individuals to “check-in”.  This allows me to help guide them to with resources and ideas to achieve their goal.

The most successful individual use this “check-in” process.

Defining The End Result

One of the most challenge areas that I face when determining goals for my team, is what the end result looks like. Ideally it is some physical artifact that can be presented or disseminated.  I work to ensure that the knowledge that my employees have gained can be shared.  A lot of times the end result is usually a process improvement within the team (which is usually the best from a business perspective).

This is the refined list from above.  Since the timeline is known (1 quarter), it is not shown as part of the goal.

  1. Pick 5 areas in our application where performance can benefit from doing things client-side using jQuery. 
    • Document the improvements and present them.
  2. Pair with each member of the team once per week. 
    • Observe how the process changes coding styles during this period (3 months).
    • Record the “a-ha” moments.
    • Present your findings.
  3. Research and develop one area of the build process.
    • Develop a custom MS Build script instead of using the Visual Studio Solution Build.
    • Discover online what others are doing but don’t just use their tools.
  4. Team Project: Develop a Virtual Scrum Board using WPF & ClickOnce.

This process gets better each time I sit down with my team.  What process do you use to define goals and objectives for your team?

For the last few months, my development team has added an extra process to their daily standup, everyone should share a blog that they have read.  The stated purpose was to get interaction within the team and knowledge share.  Lately though, it hasn’t had the effect that I wanted.

History

When we first started this process it was met with lukewarm adoption.  Initially statements were made that it was essentially a waste of time. Parameters had to be put around the type of blog entries when one person talked about a Lifehacker post on building something out of champagne corks. After providing the team my OPML list, everyone only stayed within that list to grab their blogs.

A trend started happening within the team.  The general excuse was “I didn’t have time to read a blog this morning.”  This has been very hard for me being a person that wants to share knowledge to benefit the greater good. From a positive note, when a good blog did come up some lively discussions ensued. The downside to this was stand ups could go off topic and focus, 15 minutes could become 30 minutes.

The Aha Moment

Yesterday was my aha moment. Two people didn’t share a blog because of whatever reason.  Then one person on the team stated that he would rather share something that he was working on that would benefit the team more directly.  That was when it hit me.  It is not so much of finding the blog for the knowledge sharing as it is of providing something of value that we can all learn from.

Today, I went to Tools – Folder Options and saw a tab that was unfamiliar to me.  I am using Windows 2008 and saw the Search tab.  One of the options was the ability to include natural language search. 

image

After a little research, I turned this on and WOW!  It will search everything from outlook emails to mp3 metadata in a natural language format.  This is extremely useful.

Some examples of searches I have done with success:

  • Emails from Fred on NUnit
  • 1980 pop music
  • SOW for Company XYZ

 

Technorati Tags: ,

For the last several months, I have had several changes in my environment that has caused me to take a look at how I collect information.  I am now doing more research than ever, my job has changed, and I am working to become a more organized person (although I will never reach GTD nirvana).  Lately the questions for me have been:

  • Where did I see that sample?
  • Which email account did I get that information in?
  • Do you mean I have to retype all of these meeting notes?
  • What are my next priorities?

Sound familiar?  After playing around with OneNote for a couple of years, it took an aha moment for me.  I learned about sharing notebooks across computers.  This concept has now become invaluable.  Below are a few tips and tricks that I am starting to use with OneNote:

  1. Poor mans Tablet PC.  Last Christmas, I was given a Digimemo L20 for a gift.  This is a pretty ingenious piece of equipment and one I take with me whenever I go to meetings.  The software now includes a way to transport my notes (even in digital ink) to OneNote very quickly.
  2. Use a command line argument to start OneNote on a specific page/section (/hyperlink).  I usually take a little bit of time to discover command line arguments. This time I was a little late in looking at these, but what a time saver.  Every OneNote section or page has a hyperlink that is associated with it, which can be discovered by right-clicking on the page tab/section tab and selecting copy hyperlink to this page.  Combined with SlickRun, this is truly invaluable. OneNote Command Line Switches
  3. Using a notebook on multiple computers. Here is a link.
  4. Using it as a ToDo list manager.  I combine a Slickrun magic word with Todo to go to a specific page in my notebook that is shared across computers.  Get this, the tasks even integrate well with Outlook 2007.

 

Technorati Tags: ,

I stumbled across this article on Lifehacker today.  It demonstrates how to add a custom search on Vista’s Start menu.  I customized one for going to Dan Appleman’s SearchDotNet site.  Here is the text I used for the URL

 

http://www.searchdotnet.com/results.aspx?cx=002213837942349435108%3Ajki1okx03jq&q=%w&cof=FORID%3A9#1121

 

Notice, I put in the %w where my search text would go.  Now I won’t use slick run for custom searching on this site.

Last night I created an Excel spreadsheet that captured all of the basic information for my family, addresses and such.  I figured I would import it into Outlook.  I am currently running Outlook 2007.  What a pain that turned out to be.

  • There is no support for importing Excel 2007 spreadsheets.  Guess that was just an oversight from the Outlook Team.
  • After saving down to Excel 2003, no big deal, the import asked me to specify a specific range in the spreadsheet to import the contacts from.  I do know how to do this, however, once I created the range and resaved the spreadsheet in 2003 format, I kept getting errors
  • I ended up converting to a CSV format.  So during the import process, I could have just went through the wizard steps and imported the contacts giving me not a very good experience because my field names did not match those in Outlook.  Fortunately, I did mapped the fields and completed the import.

 

The bottom line in this for me was that the customer experience was not too good.  Here are a number of things that I would have improved upon:

  1. Ensure that a user was able to import with the same Office Version.  Not too much to ask I think.
  2. Give more explicit instructions on what was needed to successfully import an Excel file up front in step one of the wizard.  I would have canceled, created the named range, and voila, complete.  Even better, have Outlook inspect the Excel file and help determine the range.
  3. When mapping the fields, it was not intuitive to drag the column names of the the import file to the Outlook field names, unless I missed some instructions.

 

My rant for the day.

 

Technorati Tags: ,

Those of you that use RhinoMocks probably know how to do this already, however, I spent about twenty minutes getting this right.  I was writing a test that was looking to ensure that a call to a mocked object doesn’t happen.  As I created the test, it passed right away which was a bad sign, even though the mocked object was being called.

There are a couple of methods a person can use to create mock objects.  Be sure to use the right one for your test.

  • MockRepository.CreateMock – This creates a mock object where errors will be thrown for any method that is called and not recorded
  • MockRepository.DynamicMock – This creates a mock object where errors will not be thrown by unrecorded methods.

 

In brief, I first used the DynamicMock<T> method which of course swallowed the call and didn’t throw the error.  So after changing to CreateMock<T>, here is how my final test ended up:

 

image

 

A couple things to note:

Notice that the using for the record has no Expect calls

 

Technorati Tags: ,
  • What are my cookie values? 
  • What are all the items I have in a current session? 
  • How can I know how much ViewState is on a page? 
  • For the last request I made, how many times did I call a particular method?

As an ASP.Net developer, these are constant questions that I run into while developing.  In a conversation with a co-worker, he suggested that the application should have a “developer’s toolbar”, that could get displayed as needed on a page to answer some of these questions? What a great idea.  But how do I go about it, so that it isn’t part of my production code? What are my options?

  • Use compilation constants to remove the code as it is released.  I try to stay as far away from compilation constants as possible.  Too many bad experiences.
  • Use a configuration setting.  This might be an option.  However, this feels like putting development code into production.
  • Create a HttpModule or HttpHandler.  I have never written one of these, but some reading indicates that it might be possible.

In the end, I chose the HttpModule / Handler route.  Here is the story for it.

Creating the HttpModule

First I started by creating a new class library and adding a new class that implements IHttpModule.  I then hooked into the following events:

 

image

PreRequestHandlerExecute

I used this event to tackle the issue of deciding whether or not to show the toolbar.  This was challenging for me because I used a Session and a QueryString to determine this for me.  The reason for this is I wanted the toolbar to be off by default, in case the web.config file included the HttpModule and went to production.  Second, I wanted a way that the developer at any time could show the toolbar or hide it.

This event is the first time that the developer gets access to Session data in the pipeline for an HttpModule.  For the longest time, I was getting errors and couldn’t understand why I couldn’t read or write to the session.  I added the following interface IRequiresSessionState to the class and this solved my problems.

Here is the code that I used to check if the toolbar should be available.

image

 

If the toolbar should be visible, the code to create the toolbar is implemented.

image

 

Notice a couple of things with this code.  First I created custom handler classes for items like cookies, logs, and sessions.  I placed them in the same assembly as the HttpModule so that I could create kind of a package deal.  After the standard web.config entries for handlers and modules, this code is in a working state, but not where I want it to be.  That is where the BeginRequest and a custom Filter came in.

Here is the result of the toolbar at the bottom of the page

image

 

BeginRequest Event

I used the BeginRequest event to set the Response.Filter equal to a custom filter.  The reason for this only became evident when I looked at the view source on a page. 

This is what it looked like before the filter:

image

Here is after the filter.

 

image

 

Notice how the toolbar itself was originally after the end html tag.  This is because I am writing to the Response.Output method the toolbar.  In the HttpModule when making Response.Write calls, they are placed at the end of the stream of the page. In another post, I will look at the Response.Filter and how I used that.

 

Next Page »