The one circumstance where you save money by testing late is if you cancel it during the prototype phase. If your company is smart enough to spend some time and money by letting a small team prototype out their game or application prior to doing any real development, and if your company does the right thing by not allowing any code or assets from the prototype to make it into the production tree, then you can save a lot of money not just on testing, but on an entire team. Once the prototype is "green lit," that's when you enter pre-production and should add at least the test lead.

Sadly, many companies have scaled back on prototyping. They're going straight from licensing to full production with little to no time spent making sure that the game is fun first, and as a result we're getting nothing but carbon copies of franchises built on the buggy codebases of yesteryear.

In the past, many game publishers would cancel nine out of every ten titles they worked on before the first whiff of them ever got out to the public, and that's the way it should have been. It's cheaper to spend $100,000 and cancel it once you know it's not fun than it is to spend $2,000,000 on the game and another $13,000,000 on production and marketing just to find out the same thing.

Now some of you may have noticed the caveat of not allowing anything from the prototype into the production tree. That was intentional. A prototype is essentially a house of cards...a facade showing the potential of the final product. Most are built as such. Memory bounds checking is never to be found, no consideration is made as far as making it run on multiple machines or platforms, the restrictions of the platform aren't taken into consideration, etc. It's not a very stable foundation to build a winning product on top of. The point of prototyping is to find what works and take the lessons learned while making the prototype to heart while making the final product, not to short circuit the preproduction process.

So the question you need to ask yourself now is this: Does your company cancel enough products to make it cost-effective not to test from the beginning?

The biggest downside of crunch time is that if you want to stay focused so you can minimize your crunch, you have to isolate yourself in large part from the rest of the world.

I'm usually on MSN Messenger, but for the past while it's been shut off so that it won't distract me. Outlook pop-ups? Disabled. BlackBerry is on silent but checked every once in a great while. I check my external E-mail during lunch and that's about it.

For someone who is used to interacting with others, the self-imposed walls can be stifling.

On the upside, the end of the hermitage is in sight. I should be able to do an "end-to-end" system integration test tonight, then a dash to migrate older code to use the new system.

My granddaughter will be down here in two weeks, and I want to make sure that she's able to see her grandfather during the three weeks that she's here. Schedules can be extended, but a childhood cannot.

Over the last couple of weeks, my rank has skyrocketed from around 190,000 to around 50,000...but there's one problem with that. It's not going up because of me.

Back in January, I was one of Blogger's "Blogs of Note." Recently, some hardcore blog spammers have started including links to "Blogs of Note" in with their spam to not only make it harder to automatically detect the spam, but to make it look like their posts are linking to other appropriate places.

So in this case, I'm getting something I don't deserve. My previous legitimate peak was around 80,000. So if I've passed you because of these schmucks actions, I apologize. I'm not trying to...I'm just getting dragged along for the ride.

June 20, 2007

The main problem is that there are four different motivations for piracy, and the "ask them to stop" approach only works for one of them and does nothing to stop the distribution of the copies that are already out.

The first (and the one this works for) is the altruistic pirate. These guys believe that the reason software doesn't make any money is that it doesn't have enough exposure, so their goal is to drive adoption of the software. Unfortunately, the closest actual market you can look at to compare this to is the shareware market which has average conversion rates under 0.1%. The number of sales generated really won't offset the loss from units downloaded from people who don't share your motivation.

The third is the angry pirate. The company in question made some sort of perceived slight towards them, so they're just going to crack and distribute the product to "punish" the company. The product could have been priced too high, the game may not have been long enough, the game may have not supported one of their video card features, the boxart may have been entirely the wrong color of blue, it doesn't matter. He's upset, so the company is going to pay because their customers won't have to.

Finally, it's the challenge pirate. These are the guys who crack the new protection methods, or find new ways to crack the previously uncrackable.

Unfortunately, "asking them to stop" won't stop the last three groups, and they're significantly more plentiful.

June 19, 2007

There was a link recently on MSNBC to a SomethingAwful article about wikigroaning. "Wikigroaning" is when you compare the Wikipedia coverage of a useful popular entry with the depth of coverage of a nerdy obscure entry, according to the article.

Now first off, I'm going to be talking about some fairly straightforward numbers here and everything I talk about is currently out there on the net if you feel the urge to do any searching.

Let's start with the base memory layouts of the PS3 and Xbox 360.

Xbox 360

Unified Memory512Mb

On-Die EDRAM10Mb

Playstation 3

System Memory256Mb

Video Memory256Mb

No big deal, right? Both basically have the same amount of memory. The 10Mb of EDRAM is only really used for render targets, depth/stencil buffers, and so on. (If you are interested in some additional information, look in the XNA Game Studio Express Edition documentation under "Predicated Tiling.")

Now, the memory difference between the two actually doesn't amount to much on the surface. While the Xbox 360 is able to decide how much memory is going to be used for the frame buffer, textures, models, etc., the PS3 has a very set memory footprint for those items and it works quite well for developers to know what their footprint can be.

The catch comes with the operating system. While GameSpy was recently mocking Microsoft for having a 100 friend limit on Xbox Live, there was a good reason for it. Microsoft is operating under a bit of a memory crunch on Live. The entirety of memory set aside for the Xbox operating system is a paltry 32Mb. All of the Xbox OS, including Live, the associated textures, the buffers necessary for holding the data from the Live service, the hypervisor that the games run on, etc....everything fits into 32Mb of memory.

On the PlayStation 3, it's a bit worse. Their OS takes up 64Mb of memory. That's the XMB, OS, kernel, everything. That's 25% of their system memory, compared to just over 6% for the Xbox operating system.

Even that isn't that big of a deal. The Core processor architecture lends itself to smaller applications running in parallel, so the system is more focused on keeping the smaller cores active, plus being able to rely on the presence of a hard drive has led to some virtual memory systems being created so that for the most part, the memory headache isn't being felt.

But that isn't the part that is going to hurt Sony. The part that will hurt Sony is what they allowed early developers to do. Xbox Live worked on the 360 because it was seamless, but on the Xbox, games had to give up memory to have the Live feature set. Because of this, it wasn't as seamless, it didn't work on all titles, etc. (Sounding familiar?) On the PS3, you'd think with 64Mb of memory reserved for the kernel, they wouldn't have to sacrifice memory for the sake of the PlayStation Network.

Well, the catch is that because of some allowances, Sony can't rely on the kernel being loaded. Sony allowed developers to swap out the kernel and use that memory for their games. Most kernel functionality is inside static libraries that apps can swap in and out, and games that take advantage of this allowance simply swap in the kernel in the rare instances when they need it.

So this generation, the best Sony can hope for is an Xbox 1 experience where some games are network-aware. As part of the next generation, I expect the two systems to have network systems that are on par with each other, but for this system, Microsoft wins the network.

That said, Sony doesn't have to win the network to win the war. They just have to win the games and the gamers. With the limited penetration of broadband in the United States, coupled with what appears to be more reliable hardware and the PlayStation brand name recognition, Sony still has some advantages. As long as their PR strategy doesn't further alienate gamers and developers, they could stay in the game.

June 17, 2007

As many of you know, I don't drive for a variety of reasons. I actually like the relaxing commute that I have now using the train and bus, and I've managed to get my one-way commute down to 65 minutes from end to end. It's still enough time for me to get a lot of reading done and some coding (although it's difficult to get myself into a C++ mindset and code for any significant portion of that trip, so it's usually C#/XNA work to tide me over).

But even so, there is still a significant amount of walking that is done on a daily basis. For the Hell of it, I've started tracking my distance over the last few weeks using a pedometer. Even though my average stride length when I'm walking my normal speed is about 36 inches, I've been using a 30 inch stride when doing my distance calculations to account for slower walking at times and "false steps."

Turns out that I walk approximately fifty miles a week. During the week I average about six miles a day, and about ten miles a day on the weekends.

The last time I did this experiment was back in Utah and at the time I was only walking about forty miles a week. That was partly because I didn't have as far to walk to board my mass transit options, partly because I had much more sedentary jobs, and partly because Layton was a significantly smaller city so I didn't have as far to walk when I needed to get to places.

As a quick side note, my blood sugar is (finally) close to under control. My morning blood sugar is still a little high (I'm averaging about 135 mg/dL) but my pre-meal glucose is around 100 mg/dL and my after-meal is between 130-140 mg/dL. That's even with a reduction in my glipizide from 7.5mg to 5mg. Next step will be to reduce my dose to 2.5mg and see if I can keep the sugar in check. If I can, there's a very good possibility that after my surgery at the end of August, my diabetes could go into remission and I may even be able to get off of the glipizide altogether. Here's hoping.

I still haven't finished my Automated Games QA series of posts. You're allowed to call me a slacker bitch for it. In some ways, I deserve it.

A few interesting events over the last week...I had three different game development companies contact me about possibly rejoining the industry. One is looking at me as a QA Manager, one is looking at me as an XNA/MDX/C# programmer and one is looking at me as a Producer. I guess there are benefits to being multitalented as well as sticking it out in an industry for over seven years.

June 15, 2007

Sorry about the lack of delays this week. I'm being slightly more selective now that I know that I have people in the same building that are reading this...

My wife has been in discussions to bring my granddaughter down from Utah for the last three months like we have for the last two summers. Yesterday, she finally had the dates locked down, but we had to order the tickets before midnight to lock in the cheapest rates. So, I spent last night ordering airline tickets for her and my granddaughter.

This morning, everything went to shit. My wife called me in hysterics at work. She looks forward to Kait's visits more than just about anything, and they were just pulled out from under her.

I called Expedia within 24 hours to try to cancel the tickets (to take advantage of their one-time-only courtesy cancel), but found out that since they were paper tickets and the tickets had already been sent, they would have to charge me over $500 to cancel the round-trip tickets.

In short, we would get back absolutely nothing. Needless to say, I'm not thrilled right now.

June 13, 2007

I've noticed that the rebus seems to have gone the way of the dodo for the most part, having been replaced with the emoticon. :(

I guess part of it is that many symbols that we use no longer have common names.

I was helping another coder here debug code earlier, and I told him to insert a "bang" at the beginning of a clause. He looked at me quizically and said, "Bang? What's that?" He's had the same reaction to me calling an asterisk a "splat."

Most people get ones like:

I ♠ your cat.

I can see some causing issues, like:

I ♣ baby seals.

...doesn't mean the same if you read it as "I shamrock baby seals."

Others depend on your pronunciation in order to get them, like:

I ♦ your arms tonight.(Hint: Think 80's popular rock.)

What other types of jokes or means of communication that were popular in your youth have gone the way of the telegraph?

June 11, 2007

By 10:30am, I found a contractor who could do what we needed him to do at a reasonable price. He starts tomorrow.

By 11:30am, I finished initial coding on four new web services for an external partner.

By 1:30pm, I finished the cart page and the cart portion of the checkout page.

By 3:00pm, I fixed a goofy bug with an older web service where members who had status changes weren't having that information propogated out to external partners.

By 4:00pm, I finished the web services and their unit tests.

At 4:45pm, I published a build to our development environment so our external parters could work with the new web services prior to them going live.

In the middle of all that, I managed to fix seven bugs, and I bookended it by reading 160 pages of "Windows Presentation Foundation Unleashed" during my commute. It starts out damn slow because it has to establish a lot of new ways to do things, but I'm glad it did because things are now beginning to "click."

June 10, 2007

I've had reports of some issues with the site and IE6, specifically the background and sidebar never appearing so that the site is next to unreadable.

I've seen it happen on occasion in IE7 if the CSS is unable to download for whatever reason.

Personally, I think it's kind of funny that it's happening given that the template is almost a stock template from Microsoft Expression Web.

If this does happen to you, try holding the shift key and clicking the refresh button, or clear your cache and try again.

If you have any idea why it would be happening, or have a suggested fix, please let me know.

(Update: Seven E-mails and a comment later, yes, it's horked. I'll work on getting a new template up this week. Thanks to everyone who checked.)

(Update Update: I've made some changes to the style sheet. Seems that having really long words in my titles can cause the CSS to whack out in IE6...so I just changed the sizes of a few elements in the CSS to prevent it from happening. I need to make a few more updates to handle some older oversized graphics in old posts, but that's it. If it still looks horked in IE6, please let me know.)

Over the last while, I've grown to see what the Express SKU's have been doing...generate a new community for Microsoft. To be fair, the hobbyist community that has surrounded Microsoft's products hasn't always been using legal products, but these SKU's have helped grow the community in a legal manner. This larger community has helped slow defections over to F/OSS technologies.

The biggest difference between the XNA team and the Visual Studio team here is their goal. The XNA team doesn't care about the Express SKU...they're using it as a gateway to build their platform. The Visual Studio team is under the mistaken impression that their SKU's are the platform.

Microsoft makes money by making it possible for ISV's to make money building solutions that use Microsoft products. Technologies like .NET, DirectX, XNA, managed code SQL Server stored procedures, all of which either work solely or best with Microsoft technologies. The primary tool that enables ISV's to build solutions is Visual Studio.

My advice to the Visual Studio team would be to stop trying to make themselves more than they are. Quit trying to figure out how to trickle down features to try to get upsells and spend more time trying to figure out how to prevent some of the most common complaints about the platforms. Moves like the one against Jamie only make people wonder if they're going to need a lawyer on retainer to develop against Microsoft technologies.

June 8, 2007

Spent the morning catching up on E-mail. After going through all of the automated error E-mails from the time I left yesterday to when I got in, found and reproduced eleven unique issues and got them entered into the bug database. Then proceeded to fix nine of them.

I use AWStats to keep on top of my traffic here. It's kind of funny...even though I'm not in games anymore, I'm still pushing out tons of traffic (about 1Gb/month on average). About 80% of my traffic is to older posts, though, so I thought it would be funny to do a quick analysis of what has been bringing people here up through the end of May.

- Last month, the number of search queries looking for answers about what happened to "SiN Episodes" finally reached parity with the number of queries looking for pirated copies of "SiN Episodes." The number of people who are looking for fixes for the U4 Labs bug in the pirated copy still outnumber both queries by a factor of 2:1.

- The most viewed archived page on the site in May was about my left toe.

- There has been a sharp increase in referral spam over the last few months. Referral spam is when people blast sites with fake referral URL's to try to get people who read their logs to go look at resumes or casinos or hosting companies.

People wonder how bugs slip into games involving gigabytes of assets and millions of lines of code, but people never stop to wonder how typos can slip into three or four lines of written text in a television ad...

If you've worked with ASP.NET for any length of time, you have worried about how to handle the Yellow Screen of Death. You know, the one that says:

HttpRequestValidationException: A potentially dangerous Request.Form value was detected from the client...

or something similar.

The common refrain is turn off request validation, but there are times when you want to use the built-in validation functions. You just want a friendlier error for your user.

Most people try to catch the exception in their Global.asax Application_Error handler, but it acts like it can't catch it. The reason? Your request must be completed before the Application_Error block finishes, or the Yellow Screen of Death will appear again.

Here is some code that will generate a slightly more user-friendly error page. Feel free to extend it or use it as you will.

June 6, 2007

This morning was spent getting a production build ready to push out tonight and getting it into testing. Because of how long clean builds take, I managed to keep up on my personal E-mails and blog for a bit.

I took my fifteen-minute break to walk over to Whataburger, grabbed my lunch, brought it back to my desk, and coded while I ate. As a result, I managed to finish the cart module and started updating the use cases for the stored procedures I'd need for the data tier. I would have finished them, but two bugs made their way into the build and I had to spend my last hour finding them, fixing them and verifying the fix.

That wouldn't have been so bad, but the recruiters we have been working with sent over a tray of cookies. Fresh, soft cookies. Unfortunately, my blood sugar has been a bit out of whack lately due to a mild cold...so even though normally I could work my carbs to the point where I could have one, I couldn't risk it today.

I managed to dash out and barely make my bus home, and you always know you're in for an interesting trip when from outside the bus you hear the shrill, loud voice of someone who may or may not be...um...lit.

Tonight, I'll be trying to finish my use cases to hand them over to the DBA, finish refactoring the cart/checkout screen interactions to match up with the minor changes made to the design, propping the build, and overall just trying to relax.

As a side note, I'm beginning to question the usefulness of compiled workflows for Windows Workflow Foundation. Long story short, trying to find a decent way to handle upgrading workflows without affecting existing workflows is the equivalent of trying to find your favorite grain of sand on a beach...possible, but time-consuming. I'm considering moving to a XOML-only system and reading in the workflows at the time I create the workflow.

Now, I understand where Microsoft is coming from. The Express SKU is a freebie, and is intended to help create a new pool of developers who will hopefully purchase their full products. But they made many blunders leading up to this...

2. They restricted unit testing to their highest-level SKU's. Given the emphasis that most developers are placing on unit testing nowadays (myself included), it would make more sense to breed a unit-testing mentality into developers from the beginning. Even Benjamin Nitchke's "Professional XNA Game Programming" preaches the importance of unit testing from almost chapter 1.

3. They kept requesting that their legal demands be kept secret while at the same time being vague until the last minue about which clauses were being violated. If I have an agreement with you that you are violating, and I call you on the violation, you have every right to ask me what part of the agreement I'm violating. You even have the right to ask others for legal advice as to whether or not what you are doing is truly a violation. Unless the initial agreement itself is sealed with secrecy clauses (which the Express EULA is not), you even have the right to go public.

4. The law may not be on their side. There have been numerous documented attempts to stop people from reenabling features of hardware that had been crippled (such as Bluetooth in cellphones, enhanced features in digital cameras and even extra features on CPU's), but to date not a single effort at suppression has been successful that I'm aware of in the United Kingdom. If the reintroduction of a removed wire trace on the underside of a processor isn't seen under British law as a "technical limitation," why would the reintroduction of a registry key be seen any differently, especially in a country where corrolaries between hardware and software seem to be drawn regularly in software-related court cases?

Regardless of the outcome, this is fascinating to watch. If you want to keep up to date, here's Jamie's blog.

June 5, 2007

I spent the morning interviewing more potential contractors. I find it astonishing how many people that contracting firms are trying to push out at over $70 an hour who can't do even the most basic tasks associated with their advertised platform (in this case, C#/ASP.NET). My prescreening questions are culled from the first 150 pages of "ASP.NET for Dummies." Really.

One guy told me, "I enable ViewState on my web services so that they won't crash." What the Hell?

Inbetween interviews, I refactored the pricing module for the new multicurrency system so that it would not only allow per-currency fixed pricing, but also allow staff to purchase on behalf of someone else without changing their own currency settings.

June 4, 2007

This morning, a contractor was supposed to start to take some of the load off of me so I could really focus on the multicurrency work. The contractor took a full-time job late Friday, which left me in a bit of a lurch. As a result, I spent most of the day outside the multicurrency project.

On Friday, a last-minute requirement change left me scrambling to redesign parts of the application. The original design was to have everything be U.S. dollars under the hood, and convert the price to Canadian dollars or Euros on the fly based on exchange data that we'd query from an external web service once every 4-6 hours. We were doing this so that we could easily switch from one currency to another on the fly. However, a requirement was added to allow static prices for other currencies on a case-by-case basis. So instead of using U.S. dollars for everything, we've made a bit of a shift. All items require a U.S. dollar price, and if a dedicated price doesn't exist, we use the older codepath. Otherwise, we flip to the dedicated price.

June 2, 2007

Up in Plano, they are fairly proud of their recycling program. They even have bins set up around their downtown shopping area where people can sort and recycle the items that they're carrying.

Only problem... (Mouse-over for the answer)A make-busy job created for the sake of recycling isn't a high-quality job by any stretch of the imagination. A cheap harness hooked up to allow multiple bags and let the recyclables be truly pre-sorted would cost very little to make and pay for itself fairly quickly.

June 1, 2007

I could have had it scheduled for earlier, but the next six weeks are a period of major development at work. We're shifting from a "one-and-a-half" tier architecture (not quite as bad as this, though) to a pure three-tier architecture, adding in multicurrency support, shifting to using Windows Workflow Foundation for our extended duration workflows, and all in all rearchitecting a lot of the cruft that has built up over the last few years.

Now, I know I've been neglecting this blog over the last two months, so I'm going to try to make it up over the next six weeks. I'm going to try to do one post per workday talking about the progress that has (or has not been made), talking about the lessons learned working with this technology, and possibly sharing code snippets as well.

I'm also working on some code samples at the moment to post related to XNA. One that I'm putting the finishing touches on right now are how to load your assets on a seperate thread, as well as run your game logic on a seperate thread. Where possible, the code samples will be posted in both VB.NET and C# versions.

About Me

Currently Sr. Software Engineer in Test at Netflix. Formerly Sr. Quality Engineer on Firefly at Amazon, QA Manager at Ritual Entertainment, Software Test Lead at Microsoft Game Studios, Director of IT for Meeting Professionals International.

Opinions expressed are my own and do not necessarily represent those of any current, former, or future employer.