in

Corey Roth and Friends Blogs

Group site for developer blogs dealing with (usually) Ionic, .NET, SharePoint, Office 365, Mobile Development, and other Microsoft products, as well as some discussion of general programming related concepts.

Kyle Kelin on .Net

May 2008 - Posts

  • My Company is Hiring

    Our recruiter sent me the following e-mail message this morning. We are currently looking for Senior Consultants out of New York as per the description below.

    New York based software consulting firm seeks a project leader. Responsible for coding, testing, analysis, design, definition, development and implementation of software architecture & engineering solutions for U.S.-based clients.  Must be able to lead/supervise team of software professionals. Master's degree + 2 yrs exp. Proficiency in req'd technologies, incl Windows, Vista; C#, Visual Studio 2008; .NET Framework 2.0/3.5, ASP.NET, MOSS 2007, BizTalk 2006, SilverLight, XAML; SQL Server 2005.

    I know New York seems overwhelming but Infusion does a good job of making the move as painless and cheap as possible. If you or anyone you know is interested e-mail me or leave a comment.

  • Consulting Services and Staff Augmentation Cannot Exist in the Same Company

    This is going to be a little off topic so if you are looking for something technical then skip this post. Now that we got that out of the way let me define some terms that I am going to use in this article. A consulting services firm in the application development space is a company who places developers on projects for a specific period of time. The work is done either on site or off-site. The majority of time there is a statement of work for the project and a set of deliverables. A staff augmentation on the other hand has developers but is a completely different entity. A staff augmentation company makes its revenue by placing developers in openings where the skills of the developer match the needs of the client. They mostly work off what is known as contract-to-hire contacts. A contract-to-hire is when a staff augmentation company bills the client for the developer's time for six months at a fixed hourly rate. At the end of the six months the client has the opportunity to convert the developer to a full-time employee for a fee. I don't favor one type of company over the other and in my career have worked with both. The problem is when a company tries to support both revenue models they become ineffective at both strategies. Companies are always looking to diversify revenue streams but those streams need to be complementary. I do not believe consulting and recruiting services are complementary.

    The first reason they aren't because good talent is in limited supply. Only a very few times in the last twenty years have developers been in long supply. Eventually the recruiting side competes with the consulting side for new hires. This effects how a company can deliver their project deliverables because they have a talent shortage caused by farming out some of their best talent. A good consulting firm knows that they will have developers on the bench at throughout the year and factor this into their rate. This helps them sell without worrying about staffing the project (well not worrying as much). A consulting firm can't run smoothly without a little slack.

    The second reason is that it sends mixed signals to the client and the consultant. A consulting firm needs to be able to place developers on-site without them being approached by the client to convert. Yes this happens all the time but it happens more to companies that send developers on-site as contract-to-hire. So if you have your consultant (a non contract-to-hire) at a company that knows you do contract-to-hires they will assume all your employees are hirable. Of course there are a lot of other things a firm has to do to keep their consultants but that are another article. The consultant will also be more likely to convert because he will see others converting.

    The final reason is for a consulting firm a contract-to hire is a lose-lose situation. If the developer placed works out the firm just lost a valuable resource that they likely won't get back. I won't go into the details of the number but the placement fee is far less than the amount of revenue a good consultant can generate in a year. The other half of the lose-lose situation is what if the developer doesn't work out and the client doesn't want to convert them. Maybe they weren't as good as you thought. Now you have damaged your reputation with that client. Sure they will probably call you to fill the next job opening they have but they won't call you to RFP they half a million dollar custom .NET application project they are going to do. I have seen this happen first hand. Never forget every person you put on-site represents your company no matter if you have tagged them as junior or a contract-to-hire.

    If you find your company in this situation and struggling here is at a high-level what you need to do (assuming you have the power or can find someone with the power to listen). You first need to pick a side and an identity. A company's business strategy and revenue model needs to planned and definitive. If the company is small the focus should be narrow (dominate one market before moving to another). Next that strategy needs to be communicated clearly to everyone in the company. If you have to write it on the wall to make sure everyone knows it. After everyone knows the strategy align the money to award those you contribute to it. Review all bonuses and commissions and make changes to any that are out of line. Be sure and make adjustments if the new business focus would result in someone receiving a lower bonus or commission. Finally continually review the business strategy and goals to make sure that the day to day activities of the business are an execution of that strategy.

     

    DISCLAIMER: The only business I have ever owned only lasted 3 years and only had 2 employees counting me. I don't know *** about business. Seriously I'm a consultant with business knowledge but no business experience. This post isn't meant to give business advice. Do I really need to say that?

  • Method Ordering Constraint with the SPGridView

    I was a working on a web part this week that was to display a list of users. The requirements evolved to include paging so I decided to use a SPGridView. But when I set the AllowPaging property to true I would get the following exception: object reference not set to an instance of an object. After spending some significant time digging around on Google I found the answer. The answer lies in the order of the API calls. You have to set the PagerTemplate to null after you add the GridView control to the ChildControls collection but before you bind the control.

    So my code in RenderContents does the following in order:

    1. Instantiate the GridView.
    2. Set the properties and the datasource.
    3. Add the Gridview control to the ChildControls Collection
    4. Set the PagerTemplate to null
    5. Bind the control

     

    My Code:

    usersGrid = new SPGridView();

    usersGrid.ID = "usersGrid";
    usersGrid.AutoGenerateColumns = false;

    usersGrid.PageIndexChanging += new GridViewPageEventHandler(usersGrid_PageIndexChanging);

    usersGrid.DataSource = usersCollection;

    this.Controls.Add(usersGrid);

    usersGrid.PagerTemplate = null;

    usersGrid.DataBind();

     

    I imagine the reason for this has to do with the page life cycle but I don't know the exact reason. The first one that posts the answer in the comments gets a free DotNetMafia T-Shirt. Also in my opinion this is a design flaw. You should avoid ordering constraints for a method call and if that restraint is required than the exception throw should do a better job of indicating the constraint.

    Note: I have not tested whether or not you would get this same behavior with a GridView on a normal web page.

  • Where is the Workflow History List

    I recently was working with workflow in SharePoint Designer and I have a few Log to History actions. The workflow failed so I wanted to view the log to try and debug the problem. I went to View All Site Content and the workflow was not listed. I spent about 20 minutes trying to find the list. Finally I figured it out. The list exists but the link was just missing. So I manually navigated to the list: /Lists/Workflow%20History/AllItems.aspx.

  • Invalid WebPart Tag Error: One Possible Cause

    I recently (as in 5 minutes ago) ran into this error and thought I would share since it cost me a good hour of work today. I have a WebPart that I need to add another assembly to. The second assembly was responsible for getting data from Active Directory. So I went through all the hoops of adding the assembly

    • Strong name the assembly and added a reference to my WebPart project.
    • Made an entry into the manifest.xml file
    • Made an entry into the wsp_structure file.

    Now that should be it but when I tried to add the WebPart I now got an error that said Invalid WebPart Tag. What the hell does that mean? The log didn't provide much more additional information. Eventually I noticed a mistake in my manifest.xml file. Take a look at the before and after.

    Here was my original manifest.xml file.

     

    <WebPartManifest xmlns="http://schemas.microsoft.com/WebPart/v2/Manifest">

      <Assemblies>

        <Assembly DeploymentTarget="GlobalAssemblyCache" FileName="Infusion.WebParts.dll">

          <SafeControls>

            <SafeControl Assembly="Infusion.WebParts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=434425b09396c611" Namespace="Infusion.WebParts" TypeName="*" Safe="True" />

          </SafeControls>

        </Assembly>

    </Assemblies>

    <Assemblies>

        <Assembly DeploymentTarget="GlobalAssemblyCache" FileName="Infusion.DirectoryServicesHelper.dll">

          <SafeControls>

            <SafeControl Assembly="Infusion.DirectoryServicesHelper.dll, Version=1.0.3058.16424, Culture=neutral, PublicKeyToken=3e458cd467f1ce4f" Namespace="Infusion.DirectoryServicesHelper" TypeName="*" Safe="True" />

          </SafeControls>

        </Assembly>

     </Assemblies>

      <DwpFiles>

        <DwpFile FileName="Infusion.WebParts.DisplayUsersFromADGroup.dwp" />

      </DwpFiles>

    </WebPartManifest>

     

     

    Here it is done correctly

    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------

     

    <WebPartManifest xmlns="http://schemas.microsoft.com/WebPart/v2/Manifest">

      <Assemblies>

        <Assembly DeploymentTarget="GlobalAssemblyCache" FileName="Infusion.WebParts.dll">

          <SafeControls>

            <SafeControl Assembly="Infusion.WebParts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=434425b09396c611" Namespace="Infusion.WebParts" TypeName="*" Safe="True" />

          </SafeControls>

        </Assembly>

        <Assembly DeploymentTarget="GlobalAssemblyCache" FileName="Infusion.DirectoryServicesHelper.dll">

          <SafeControls>

            <SafeControl Assembly="Infusion.DirectoryServicesHelper.dll, Version=1.0.3058.16424, Culture=neutral, PublicKeyToken=3e458cd467f1ce4f" Namespace="Infusion.DirectoryServicesHelper" TypeName="*" Safe="True" />

          </SafeControls>

        </Assembly>

     </Assemblies>

      <DwpFiles>

        <DwpFile FileName="Infusion.WebParts.DisplayUsersFromADGroup.dwp" />

      </DwpFiles>

    </WebPartManifest>

     

    Yes I know this is a pretty obvious mistake but when you get such a general error message it is touch to track down.

2019.
Powered by Community Server (Non-Commercial Edition), by Telligent Systems