December 31, 2009

The End Of A Year Of Shifts

I don't think you'll be able to find many people who think this year has been a good year. I definitely don't think this was a good year as a whole, but I do think that several good things have happened this year. That said, this year was a culmination of a multi-year effort for me and to let you know what I'm talking about, I need to go back into history for a few minutes.

I started in quality assurance back in 1998 at Access Software, coming in at the end of Links LS 1999 Edition and coming into an extremely defective QA process. Even as defective as it was, it planted a seed in me that unleashed some latent talents. I quickly became a test lead and continued along that path at Microsoft after the acquisition. While the QA process at Microsoft was significantly improved, the environment had changed to the point where two things had happened: my connections to what I was testing became more ephemeral because of my position, and I started to feel disconnected from not only my department but my duties as well. It was affecting my performance and behavior in negative ways. Yvonne's illness gave me an excuse to start searching for a different job and I finally left Microsoft after working on Amped 2.

Now, even though QA was my passion, I've almost always coded. Coding had been a creative outlet for me, and I'd spend hundreds of dollars a month on books so I could learn new languages, new techniques, and new technologies. I had been writing games since I was five, and that coding experience helped me in QA because I could look at a feature, say to myself, "How would I develop this?" and test the code as if I wrote it. Because no two programmers will ever code a feature the same way, this dissonance helped me out significantly in my career. My coding experience also helped me land on my feet outside of Microsoft by working for my home town of Layton, Utah. I very nearly didn't get the job. After I was hired, my boss told me that he looked at me and saw someone who was burned out to the point of not caring anymore which was a very fair assessment. While the pay at Layton wasn't all that great, coding as a full-time job was reinvigorating. I got a much deeper understanding of data-driven coding, learned a lot about when you have to reinvent the wheel, and even though I look back on my code back then and laugh at how primitive it was, the experience taught me a lot about dealing with internal and external customers, requirements gathering, and more.

Now, before I had even started at Layton City, I had sent out tons of resumes as part of my effort to leave Microsoft. One of those resumes had been to Ritual Entertainment. I had been in discussions with them during my last year at Microsoft and finally had a chance to interview with them in March of 2004 and was told at that point that I was their choice. However, work they had been doing on the new Legacy of Kain title (a sequel to Defiance) had been canceled by Eidos and they had to suspend my hiring. They managed to get other projects and finally were able to make me an offer just before Thanksgiving in 2004 to be their new QA manager. My role was going to be to create their QA department and policies from scratch, and I eagerly accepted the role and moved to Dallas.

I had two motives when I accepted the job. The first was to introduce QA to Ritual without hitting any of the roadblocks that Microsoft hit retrofitting Access with their QA structure. The second was the belief that I had something to share with the industry and working for what I thought to be a premiere independent developer would give me a mouthpiece from which to speak.

Well, I failed at my first motive. I approached Ritual with kid gloves and while the approach was better received than the iron fist of law, it made it seem like I wasn't serious about getting QA in. As a result, I ended up having a total budget over my two year tenure of under $150,000...and that included salaries, config passes at external labs, hardware and more. Trying to be Mr. Nice Guy meant several necessary QA policies weren't going to be implemented until at least year four (if I made it that long).

I fared much better at succeeding on the second point. Interviews with the fansite and several gaming websites, dealing with the customer base directly, and access to several industry backchannels that were previously unavailable to me gave me a podium and I used it. I still have a lot of friendships from my efforts at the time.

Three things happened in my last year at Ritual. One of the three major projects we had (an expansion to a recently released game) was cancelled due to poor sales of the original title, another major project shipped but died in the marketplace, and Ritual had started to staff up for a third title that we were partnering with another local dev on that never materialized due to a license holder dicking everyone around. The end of that third piece coincided with my Sony post. Given that Ritual was shifting into survival mode, my layoff was understandable, but it still shook me to my core.

I fell back on my development experience and started work with a contracting firm, but even that experience had a ton of issues. They finally stopped when I accepted a full time position three years ago next month.

After the employment situation settled down, I found that I was still fairly shook up. A lot of my beliefs about myself and my abilities were tested at Ritual and found wanting. I needed to really take stock in who I was, what I believed and why, and that's what I've been doing over the last two and a half years...re-examining almost every aspect of who I am.

Some things I've discovered have been obvious. I'm finally "out of the closet" so to speak regarding my atheism. On the Dawkins scale, I'm right on the 6. A huge shoutout goes to Matt Dillahunty and crew down at the Atheist Community of Austin for helping me along that path.

I've found my core strength to be divining requirements from poor definitions. My skills in QA and development are directly tied to this piece of the puzzle.

I've discovered that while QA is my passion and always will be, I'm not the proper advocate for it on a large scale. There are many levels where advocacy can be done and I am much better at being an advocate at a local scale. Besides, anything that takes my focus away from my project is a bad thing.

Likewise, I love game development with a passion, but it takes so much out of me that if I ever go back, I shouldn't stay for more than three years in any sort of individual contributor role. That's pretty much my tolerance level for the type of bullshit that the games industry piles on its workers.

I'm still extremely antipiracy, but I am extremely pro-fair-use. I believe that as long as you aren't giving someone else an exact copy of what you acquired legally, you should be able to do damn near whatever you want with it. Space-shift, time-shift, transcode, encode, format-shift, mashup, breakup, modify...it's your business. As long as you don't demand support for your changes, go ahead.

Finally, I believe I've found the final use for this blog. Over the last several years, I've been posting little code snippets about how to solve or workaround various problems. No bullshit, no fluff...just a description of the problem and the code to make it go away. Aside from the occasional personal post like this one, that is going to be the focus of this blog going forward.

Thanks for sticking with this blog for nearly six years. It will be interesting to see if this blog makes it to the decade mark.

December 14, 2009

Workaround: Integrating Windows Identity Foundation and Sitefinity

Problem:

After adding an STS reference to your Sitefinity web site, you are able to get to the STS login, but after logging in, the website goes into an infinite refresh loop.

Reason:

Sitefinity takes over the ASP.NET pipeline at an inopportune moment for Windows Identify Foundation.

Solution:

Add a new ASP.NET page to your project called STS.aspx. The page can be blank. It's just there so that the ASP.NET pipeline will remain active at the proper time.

In your web.config, update your audienceUris and realm in the windows.identity section to point to [domain]/STS.aspx instead of just [domain].

Comment out the WSFederationAuthenticationModule httpModule and add this one in its place:
<add name="SitefinityWSFederationAuthenticationModule" type="SitefinityWSFederationAuthenticationModule, App_Code" />


Add a new class to your App_Code folder called SitefinityWSFederationAuthenticationModule.cs with this code:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.IdentityModel.Web;
using Telerik;

public class SitefinityWSFederationAuthenticationModule : WSFederationAuthenticationModule
{

protected override void OnRedirectingToIdentityProvider(RedirectingToIdentityProviderEventArgs e)
{
UriBuilder ub = new UriBuilder(HttpContext.Current.Request.Url);
ub.Path = "/STS.aspx";
ub.Query = String.Empty;
e.SignInRequestMessage.Realm = ub.Uri.ToString();
base.OnRedirectingToIdentityProvider(e);
}

}