Wednesday, July 26, 2006

I am Hiring

In the last 6 months I have recently taken a position with a local software ISV in the Bothell area. We recently acquired some IP and I am now tasked with building a team to take over this IP and take it to the next level.  To that end I now find myself with four job openings I am trying to find great candidates for.

You’re ready to make a big impact, and we’re ready for you.  At AMS Services, we’re looking for a driven software engineer to be a charter member of a small, agile, and high-performing team, poised to introduce cutting edge technologies to a ripe industry. 

 

AMS is committed to using the latest technologies and methodologies when developing our comprehensive enterprise business solutions for independent insurance agents and brokers.  As a result, we’re forming a high-performing team to take the company’s new product, TransactNOW, to the next level.  TransactNOW is a suite of solutions designed to facilitate real-time transactions between insurance carriers and agents across both new and existing technology platforms.  Improving business efficiency through increased agent and carrier connectivity is one of the insurance industry’s best opportunities, and with you, AMS Services is prepared to lead that change.

 

As our team integrates this new product into the company and with our customers, we will drive the long term architectural vision for the company’s software products.  Reporting through the Chief Architect, we will serve as an incubation group for new programming practices and will be seen as the flag bearers for new software development practices within the company.  We will remain small, agile, and able to introduce exciting technological change into the industry.

 

AMS Services rewards top performance and skilled talent with a competitive compensation package including base salary, comprehensive medical benefits, 401(k), generous paid time off, cash-based performance rewards, educational assistance and, where appropriate, relocation benefits.  We support and encourage a diverse workplace.

 

Lead Software Engineer

As the lead for the AMS Connectivity Solutions Product, you manage a small team of 3 Senior Software Engineers.  You play an integral role in directing the software development process:  You drive design and Scrum meetings, provide architectural guidance, write specifications, participate in the development and testing of software, and manage project documentation and deadlines.  You also act as the initial escalation path for solving problems amongst the team.  Working across multiple teams, you drive shared services initiatives as well as evangelize new development practices and methodologies.  As the lead engineer for this organization, you administer both technical and personnel aspects of the project and report directly to the Chief Software Architect.  Most importantly, you manage a talented team in a highly collaborative and creative environment to impact the future of your industry.

 

Qualifications

 

The ideal candidate for this role will have 10 or more years of software product development experience with at least 3 years leading a small team.  You should be well versed in programming in C# and familiar with the .NET Framework.  We also expect you to have experience with new software development methodologies such as Scrum, Test Driven Development or Extreme Programming (XP).  Previous experience with XML and web services is a plus. 

 

As you will be interacting with teams at all levels, you should possess outstanding oral and written communication skills.  You should be well versed in balancing team management of both technical and personnel issues.  You must be able to win over teams and build consensus without authority.  As a charter member of this team, you should be able to work independently to solve problems and provide multiple solutions to potential roadblocks.  The ability to be flexible and diplomatic in working across ambiguous situations is a key attribute to success in this role. 

 

 

Senior Software Engineer – C#

As the Senior Software Engineer for the server side portion of AMS Connectivity Solutions, you design and build new product features based upon customer feedback requests.  You play an integral role in the software development lifecycle:  You participate in design meetings, provide architectural guidance, write specifications, develop and test software, and document projects.  You work across multiple teams to drive shared services initiatives as well as evangelize new development practices and methodologies.  Most importantly, you and your teammates partner in a highly collaborative and creative environment to impact the future of your industry.

 

Qualifications

 

The ideal candidate for this role will have 6 or more years of software product development experience.  You should be an expert C# programmer with previous experience with XML/XSLT, web services, ASP.NET, DHTML, JavaScript and you should have experience with new software development methodologies such as Scrum, Test Driven Development or Extreme Programming (XP).

 

As you will interact with teams at all levels, you should possess outstanding oral and written communication skills.  You must be able to win over teams and build consensus without authority.  As a charter member of this team, you should be able to solve problems and provide multiple solutions to potential roadblocks.  The ability to be flexible and diplomatic in working across ambiguous situations is key attribute to success in this role. 

 

Senior Software Engineer – C# / Build

As the Senior Software Engineer for the server side portion of AMS Connectivity Solutions, you design and build new product features based upon customer feedback requests.  You play an integral role in the software development lifecycle:  You participate in design meetings, provide architectural guidance, write specifications, develop and test software, and document projects.  Additionally, you spend a small portion of your time managing the team’s build processes.  You work across multiple teams to drive shared services initiatives as well as evangelize new development practices and methodologies.  Most importantly, you and your teammates partner in a highly collaborative and creative environment to impact the future of your industry.

 

Qualifications

 

The ideal candidate for this role will have 6 or more years of software product development experience.  You should be an expert C# programmer with previous experience with XML/XSLT, web services, ASP.NET, DHTML, JavaScript and you should have experience with new software development methodologies such as Scrum, Test Driven Development or Extreme Programming (XP).  Since you will be responsible for the build processes for this product, you should have expert knowledge of Source Configuration Management (SCM).

 

As you will interact with teams at all levels, you should possess outstanding oral and written communication skills.  You must be able to win over teams and build consensus without authority.  As a charter member of this team, you should be able to solve problems and provide multiple solutions to potential roadblocks.  The ability to be flexible and diplomatic in working across ambiguous situations is key attribute to success in this role. 

 

Senior Software Engineer – C++

As the Senior Software Engineer for the client side portion of AMS Connectivity Solutions, you design and build new product features based upon customer feedback requests.  You play an integral role in the software development lifecycle:  You participate in design meetings, provide architectural guidance, write specifications, develop and test software, and document projects.  You work across multiple teams to drive shared services initiatives as well as evangelize new development practices and methodologies.  Most importantly, you and your teammates partner in a highly collaborative and creative environment to impact the future of your industry.

 

Qualifications

 

The ideal candidate for this role will have 6 or more years of software product development experience.  You should be an expert C++ programmer and should have experience with new software development methodologies such as Scrum, Test Driven Development or Extreme Programming (XP).  Previous development experience with COM, C#, XML/XSLT, DHTML, and web services is a plus.  Over time, your C# coding responsibilities may increase, so while prior .NET experience is not required, a passion to learn and develop software in C# is important. 

 

As you will interact with teams at all levels, you should possess outstanding oral and written communication skills.  You must be able to win over teams and build consensus without authority.  As a charter member of this team, you should be able to solve problems and provide multiple solutions to potential roadblocks.  The ability to be flexible and diplomatic in working across ambiguous situations is key attribute to success in this role. 

 

To inquire about job openings with AMS, please send your resume to ckinsman@amsworld.com.

Wednesday, July 26, 2006 7:01:01 AM (Pacific Standard Time, UTC-08:00)   #      Comments [0]  
 

  Thursday, June 08, 2006

using NUnit.Mocks DynamicMock with a Property in C#

Starting to use the DynamicMock feature of NUnit.Mocks. I had a class with a property getter that I wanted to use it with.  The code consistently failed.  Grabbed the NUnit source and looked at the covering unit test for DynamicMock.  Guess what, no covering test for a Property to show me how to do it!  I started thinking about it and realized that Property getters and setters are just treated as speciallly named methods under the covers and started playing around.  Finally came up with the following that works:

    8 namespace DynamicMockTest

    9 {

   10     [TestFixture]

   11     public class Class1

   12     {

   13 

   14         [Test]

   15         public void Test1()

   16         {

   17             DynamicMock mock = new DynamicMock(typeof(IMockTest));

   18             mock.ExpectAndReturn("get_Domain", "AMSWORLD");

   19 

   20             Assert.AreEqual("AMSWORLD", ((IMockTest)mock.MockInstance).Domain);

   21         }

   22 

   23     }

   24 

   25 

   26     public interface IMockTest

   27     {

   28         string Domain { get; }

   29     }

   30 }

 

The trick is to precede the property name with get_ or set_

 

Thursday, June 08, 2006 2:17:45 PM (Pacific Standard Time, UTC-08:00)   #      Comments [3]  
 
XP VPN Error 721

Just got a new machine (T60p finally has a Windows key!) and was having some problems connecting to our corporate VPN. Searched google and kept seeing posts about routers not passing GRE.  I knew mine was as my old laptop sitting next to the new one could connect. Couldn’t figure out the issue until it dawned on me that perhaps the Windows Firewall might be blocking GRE.  My first reaction was nah…   This is outbound access by a component built into Windows XP.  The firewall isn’t going to block it.  Well I was wrong.  The trick is to go into the Firewall Advanced Settings and make sure that VPN – Encapsulating Security Payload (ESP) and VPN – General Routing Encapsulation (GRE) are enabled like this:

FireSet

Posting this partly so I remember the next time I hit this and partly because I didn’t see any mention of this in my google search results.

Thursday, June 08, 2006 8:58:46 AM (Pacific Standard Time, UTC-08:00)   #      Comments [2]  
 

  Monday, May 29, 2006

WIX

I have been building some installs with WIX over the long weekend.  Overall I love the toolkit compared to tools I have used in the past but some things are very difficult to find information on.  I have built an MSI without any UI.  i.e. not even WixUI_Minimal.  When the MSI first starts it shows:

 

I can set the title.  I can’t figure out however how to show any text static or progress based.  Any ideas?

Monday, May 29, 2006 6:45:44 PM (Pacific Standard Time, UTC-08:00)   #      Comments [0]  
 

  Tuesday, May 16, 2006

SQL Server Integration Services LoadXml fails with a message about an invalid provider

Ran into this today on my laptop. Fired up BIStudio to test some SSIS packages on my local machine.  I couldn’t even load the package due to the LoadXml error mentioned above complaining about the FLATFILE provider.  Come to find out this has to do with something, LEXMARK printer drivers and Flash 8 are suspects, mucking with the security around component categories.  I found some code that when run as a low privileged user will find the bad entries:

 

using System;
using Microsoft.Win32;

namespace CheckClsidPerm
{
    class Program
    {
        static void Main(string[] args)
        {
            RegistryKey clsid = Registry.LocalMachine.OpenSubKey(@"Software\Classes\CLSID");
            string[] clsids = clsid.GetSubKeyNames();
            Console.WriteLine("found {0} keys", clsids.Length);

            foreach (string s in clsids)
            {
                try
                {
                    using (RegistryKey clsidKey = clsid.OpenSubKey(s))
                    {
                        using (RegistryKey ic = clsidKey.OpenSubKey("Implemented Categories"))
                        {
                        }
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine("error while reading key {0}: {1}", s, e.Message);
                }
            }
        }
    }
}

Run this under a low privilege account.  Then go in and find the CLSIDs in HKEY_CLASSES_ROOT and add Users with read access.  This fixed the issue for me.

Tuesday, May 16, 2006 11:43:02 AM (Pacific Standard Time, UTC-08:00)   #      Comments [1]  
 

  Monday, May 15, 2006

CodePlex is Live

Remember the good old days of GotDotNet?  Before the interminable slow downs and the littering of the various areas with samples of dubious value?

Sandy Khahund and Jim Newkirk from the Patterns and Practices group moved to MSOPS to bring back those good old days. Their first effort, CodePlex (http://www.codeplex.com), hopes to solve many of those issues.  Still in beta but looking very good.

Check it out when you get a chance.

Monday, May 15, 2006 10:29:24 AM (Pacific Standard Time, UTC-08:00)   #      Comments [2]  
 

  Tuesday, April 18, 2006

MSH Convert an Absolute Directory to a Relative Directory

Still working on the conversion.  Now I am working up a script to create solution files that will be consumed by Team Build.  Solution files however require relative references to the projects.  Come to find out there is no functionality built into .NET to do this conversion.  Since I didn't want to pick up any dependencies in my MSH script I created the function in MSH with inspiration from Paul Welter:

 

# function that takes an absolute path and turns it into a relative path
function relativePath([string]$absolutePath, [string]$relativeTo)
{
    # Add some error checking
    
    # split up the paths
    $absoluteDirectories = $absolutePath.Split("\")
    $relativeDirectories = $relativeTo.Split("\")
    
    # Get the shortest of the two paths
    [int] $length = [System.Math]::Min($absoluteDirectories.length, $relativeDirectories.length)
    
    # Use to determine where in the loop we exited
    [int] $lastCommonRoot = -1
    
    # Find common root
    for( $i = 0 ; $i -lt $length ; $i++ )
    {
        if($absoluteDirectories[$i] -ne $relativeDirectories[$i])
        {
            break
        }
        
        $lastCommonRoot = $i            
    }
    
    
    # If we didn't find a common prefix then throw
    if($lastCommonRoot -eq -1)
    {
        throw "The paths $absolutePath and $relativeTo do not have a common prefix path."
    }
    
    # build up the relative path
    [System.Collections.Specialized.StringCollection] $relativePath = new-object System.Collections.Specialized.StringCollection
    
    # add on the ..
    for( $i = $lastCommonRoot + 1 ; $i -lt $absoluteDirectories.length ; $i++ )
    {
        if($absoluteDirectories[$i].length -gt 0)
        {
            $relativePath.Add("..") > null
        }
    }
    
    # add on the folders
    for( $i = $lastCommonRoot + 1 ; $i -lt $relativeDirectories.length ; $i++ )
    {
        $relativePath.Add($relativeDirectories[$i]) > null
    }
    
    [string[]] $relativeParts = new-object String[]($relativePath.Count)
    $relativePath.CopyTo($relativeParts, 0)
    [string] $newPath = [System.String]::Join("\", $relativeParts)
    
    return $newPath
}

relativePath "C:\dir1\dir2\dir5" "C:\dir1\dir2\dir3\dir4\dir6" 
Tuesday, April 18, 2006 4:26:07 PM (Pacific Standard Time, UTC-08:00)   #      Comments [0]   MSH
 
MSH Upgrade all CSProj files in a directory

I am currently working on our .NET 1.1 to .NET 2.0 conversion project at Vertafore.  After recently listening to the Hanselminutes on Msh I figured I would give it a spin.

One of the items we needed to do was run the command line upgrade across all of our projects.  At last count we had around 400 so this was a tall order.

Turns out it was only 5 lines of MSH!

Here it is for anyone else that wants it:

$devenv = "C:\program files\Microsoft Visual Studio 8\Common7\IDE\devenv.com"

foreach ($project in get-childitem -include *.csproj -recurse) {

   write-host "Upgrading Project: " $project

   & $devenv $project /Upgrade

}

Tuesday, April 18, 2006 4:20:53 PM (Pacific Standard Time, UTC-08:00)   #      Comments [0]   MSH
 

  Tuesday, March 21, 2006

Recruiting from Guy Kawasaki

You may be noticing a theme today.  I am finding a number of good links today I am posting for posterity.

http://blog.guykawasaki.com/2006/03/the_art_of_recr.html

Tuesday, March 21, 2006 1:47:03 PM (Pacific Standard Time, UTC-08:00)   #      Comments [0]  
 
Versioning Strategies for Data http://toadbalancing.blogspot.com/2005/12/preparing-for-backwards-compatibility.html Tuesday, March 21, 2006 1:42:14 PM (Pacific Standard Time, UTC-08:00)   #      Comments [0]  
 


Administration
Sign In