Visual Studio 2008 RTM install

I finally got around to installing the release version of Visual Studio 2008 on my machine. Fortunately, I checked around to see if there was anything special that I needed to do when uninstalling the beta, and found this article listing the recommended series of steps to uninstall the beta. I seem to remember there being some problems with uninstalling VS 2005 betas and then installing the final, so I’m glad that I checked. For those out there who don’t want to manually wade through that uninstallation list, there’s another article out there with an uninstall script that should do the trick.

My impressions of the final version of 2008 are pretty much the same as from the beta — it seems like a pretty solid release, with support for .NET 3.5 and better extensibility support among other things. I may write up more later as I get more seat time with the final…

SMU Hires June Jones

As an SMU alumnus, I feel compelled to comment on the hiring of June Jones as the new football coach. The football program has been in shambles ever since the NCAA death penalty was brought down on the Mustangs, and, personally, I feel that it will be very difficult, if not impossible, to rebuild the program such that it can really compete successfully at the I-A level. I also think that the enormous amount of money pumped into the program since the death penalty (culminating in the construction of the Gerald J. Ford Stadium, a massive edifice that seems out-of-place on the corner of campus) is probably unjustified in the grand scheme of things.

That being said, if there is to ever be any hope of reclaiming gridiron glory, it is going to start by the hiring of (comparatively) big-name coaching talent…so I am cautiously optimistic about this hiring. Hopefully this will give recruits a new reason to examine the possibilities of playing for the Mustangs.

Back to Back

The Arsenal won Saturday night (the second night of a back-to-back pair of games) to notch their first consecutive victories of the season. They defeated the reigning D-League champion Dakota Wizards 106-97 in a game that was probably their best showing of the season. Recent acquisition Marcus Campbell had a hot hand in the first quarter, finishing with 21 points on 10-of-14 shooting, and giving the Arsenal some much-needed size and rebounding inside. Not much to say here other than that the Arsenal had a very impressive shooting night, shooting almost 50% from the field and just about 90% from the charity stripe. Here’s hoping they can keep it up next Friday night for “Affiliate Night” against the D-Fenders.

We wound up getting to sit courtside in “the best seats in the house,” courtesy of a team promotion that we won, and sat next to Arsenal alumnus (and current Indiana Pacer) Andre Owens. It’s really nice sitting down on the floor — it gives you a much different perspective on things, and it’s just fun to be down there. The other notable occurrence of the night was the half-court shot promotion. The guy that they picked to do it was really hamming it up, trying to get people excited, and I thought that he was going to fail miserably, just like all the others have this season. He didn’t win, but he did strike iron twice (better than anyone else has done)…hucking the ball over his head, backwards. I was impressed enough to clap — one of his shots looked like it might get a friendly bank into the basket, but not quite…

The Arsenal are winning at home…

…but they’re still winless on the road. Last night they won a 105-103 squeaker against the Albuquerque Thunderbirds, although in my opinion, the game shouldn’t have gone down to the final possession. The Arsenal had a 10 point lead with a couple of minutes left to play, but played sloppy down the stretch and were saved by a Steven Smith bucket on their last offensive possession. The T-Birds played a very up-tempo game, forcing some rotation changes for the Arsenal and making them look very uncomfortable at points in the first half. Albuquerque also aggressively defended inbounds passes for a large chunk of the game, which I thought was pretty unusual.

The Arsenal are the only remaining team that is still winless on the road — even lowly Bakersfield, shaping up to be the Washington Generals of the NBDL, have notched a win away from home. At least the Arsenal have a winning record at home, now.

On the T-Birds’ roster is Darryl “DJ” Strawberry, who I thought was initially an unfortunately-named kid whose parents were admirers of the Straw. But, as I found out, he is actually the Straw’s kid…and he played very well, shooting 10-for-17 from the field and 4-for-6 from behind the arc.

The Arsenal face a tougher test tonight in the Dakota Wizards, current Central Division leaders and last season’s champs. We’ll see how they respond — for their part, the Wizards got blown out last night by the D-Fenders, but I have no idea how they’ll respond.

Addendum: I decided to check on ex-Arsenal player Marcin Gortat, recalled to the Magic (where he apparently has not gotten off the bench), and discovered this amusing widget on the NBA site. Note that it currently reports his PPG, RPG, and APG as “NaN” (aka not a number). I would be pretty offended if I were an NBA player and saw that. Of course, what it really means is that whoever wrote that widget needs to fix their divide-by-zero bug…

In Defense of the Escort Mission

Through a rather convoluted (but interesting) path, I came upon an Escapist article from earlier this year which trashes one of the whipping boys of game design, the escort mission. While I certainly wouldn’t disagree that there are tons of terrible escort missions in games, I think that escort missions don’t have to be terrible. Dare I suggest that they could actually be fun?

I wanted to expand a little bit on the article’s reasoning about why a lot of escort missions are unpleasant experiences, and what I think can be done to make them less dreadful.

  • The article mentions AI deficiencies with the convoy being escorted (along with some…uh, unusual similes by Red Storm/Ubisoft designer Richard Dansky), which can certainly be the case. This tends to be at its worst when the AI is trying to follow the player — if the AI gets hung up while following the player up a ramp, or through a tricky area, the player justifiably feels that the mission failure was unfair. These types of escort missions have problems similar to that of squad command systems — it’s difficult for the AI to understand what the player is really trying to do (and coordinate their actions accordingly), and the sort of second-to-second guidance and chatter that makes real-life escort missions possible isn’t practical with current control schemes.

    While missions that involve self-guided convoys still have issues, I think they are preferable to convoys that follow the player. It’s far easier to ensure that the convoy AI works correctly in this situation than in the case where it’s trying to follow an unpredictable player. Additionally, it helps to ensure a certain minimum pace to a mission, which might be another way to change up the feel of gameplay.

  • There’s also some discussion about attempting to create a sense of drama or sacrifice through escort missions. I agree that pretty much every attempt I’ve seen at this has fallen flat. Without being able to fail the escort and still continue with the game, all drama is removed. I have many more memories of “noble sacrifices” by my X-COM soldiers or lone catapults in Civ than I do from any sort of game featuring a pre-scripted sacrifice.
  • Escort missions that focus on a single AI tend to be more unforgiving and more prone to AI sketchiness than ones that feature larger convoys. Ensuring the safety of 4 of 6 AIs is probably going to be easier and possibly less stressful for the player than protecting a single AI which will get dog-piled by enemies, caught on a wall, or otherwise waylaid.
  • The article talks a bit about an EverQuest 2 mission which involves escorting an invincible dog — a clever way to mine a bit of drama from players who don’t pay too much attention to what’s going on. However, the article doesn’t really talk about what I believe is a primary reason for why most escort missions are dire — completely helpless “convoys.” If the convoy can shoot back at enemies (or can assist the player by taking out certain kinds of enemies), the group being escorted feels less like a complete ball and chain. I personally felt that escorting survivors in Dead Rising was way more palatable than typical escort missions because you could arm them, they could help each other out to a limited extent, and, once you discovered the benefits of the “go to the reticule” command, were fairly capable at defending themselves.
  • Another idea would be to reverse the usual difficulty ramp of a mission for an escort mission — make the early part of the mission the most difficult part (particularly important for games that don’t allow saves or don’t have checkpoints). Then, the difficulty would be ramped down throughout the rest of the mission, taking advantage of this “breather” to reveal more story or otherwise change things up. While this wouldn’t necessarily make people like the escort mission more, it would make it a lot more likely that people would be able to finish it.

Okay, so maybe I was a bit optimistic in saying that escort missions could truly be fun, but I still think that they can be much less of a burden than they currently are…

Code Size is the Enemy?

“Size is the Enemy” is a Jeff Atwood (Coding Horror) article that has made the rounds lately. It’s a response to a rambling rant by Steve Yegge about how large code bases are unwieldy, and how language choice affects the viability of software projects beyond a certain size. Early on, Jeff calls out a quote that I, too, find really amusing:

I happen to hold a hard-won minority opinion about code bases. In particular I believe, quite staunchly I might add, that the worst thing that can happen to a code base is size.

I don’t think I’ve ever encountered a programmer who truly believed that “bigger is better” with regards to codebase size. Granted, the crowd I tend to run with isn’t exactly a bunch of Perl golfers either, but no reasonable person would doubt that complexity scales superlinearly with lines of code. So, at least with regards to the sentiment that codebase size should be minimized, I find myself in agreement with both — if you can reduce the size of your code while maintaining readability, then it’s an easy win. For example, on Neverwinter Nights 2, we drastically reduced the number of scripts required by adding a parameter passing mechanism to NWScript — I actually ran the numbers and discovered that 75% of the script calls in conversations used our new, parameterized scripts rather than the one-off style of scripts from NWN1. This is a great example of reducing code size without reducing functionality, and it made things much more manageable.

I take issue with the second conclusion of Yegge’s article, though. While it’s true that functional languages can often express algorithms more eloquently than imperative languages, I don’t think this magically translates into huge maintainability wins in a monster codebase. Sure, the trivial example of reading lines out of a file makes other languages look great in comparison to hoary old C++. (I’m not sure if I’m allowed to call Java “hoary old Java” yet — after all, it’s only 12 years old or so.) But to hold up this example as proof of language superiority is missing the bigger picture — what makes an application distinctive is not how it reads lines out of a text file, but rather all the other stuff it does that no other piece of software does. The design of that “stuff” probably has more to do with maintainability than language choice ever could.

The biggest factor in the complexity of a code base, in my opinion, is the complexity of its internal interfaces. I hate to trot out the quixotic concept of the “software IC”, but thinking about an interface in terms of building it onto a chip is a decent analogy in this case. Once you get beyond a certain number of “pins,” or command multiplexers, or what have you, things get complicated. When you have 500,000 lines of this kind of “complicated,” all interacting with each other in mysterious ways, you have big trouble.

Now, I’m not advocating going gonzo with componentization, either, in spite of how delicious ravioli code sounds. I’ve seen and heard about way too many over-engineered, CORBA-gone-wild projects to make any kind of blanket statements in support of component architectures and stuff like that. But by keeping interfaces (whether internal to the code, or part of a component system) minimalist in nature, and designing them so that doing the right thing is easy, and doing the wrong thing is hard, you can maintain a good level of understandability in a codebase. I see no reason why this advantage does not scale with project size. Dividing a codebase into easily testable, well-defined components with simple interfaces is key, particularly for lone-wolf developers.

I find it very interesting that the project in Yegge’s article (Wyvern) is not just a game, but a role-playing game. I know first-hand that RPG rules systems can, by their nature, necessitate a kind of code design that leads to massive complexity. RPGs tend to carry a massive amount of state around, and have rules systems that interact with that state in often arbitrary ways. (An example of this would be a character trait that changes the order of combat resolution, or some kind of “luck” trait that allows re-rolls of certain types of skill checks. If you have many rule-changers like this, it’s almost impossible to write a clean system to handle it.) This kind of complexity is design complexity, and has nothing to do with programming languages and the features they support. For this reason, I think that even if he succeeds in his goal of removing 33% of Wyvern’s lines of code, I don’t think that the resulting code base will be any easier to maintain. (His game is a 2D Java RPG — I don’t think that it’s a stretch to say that the majority of his code is going to be related to game rules and game content.)

I think that both authors are missing a key point — namely, that if you can simplify your application or problem, you should do so. Wyvern should look more to Magic: The Gathering’s rules than D&D. (Granted, Magic has its own mind-benders, but I think that it’s fundamentally simpler than even the newer versions of D&D. Coming from a math professor, that’s what I would expect.) Granted, sometimes it’s not possible to simplify a problem any further, but in this case Wyvern appears to be a self-inflicted wound. And, finally, I am still in agreement that code size reduction is a wonderful thing, but I am less enthused about the opinions rendered in the language wars…

Merry Christmas

Merry Christmas, everyone!

I got Sandy a Tassimo Hot Beverage System, along with a little fondue maker and some new glasses for our kitchen. The Tassimo is pretty neat — we’ve only used it for hot chocolate so far (since I wasn’t sure of exactly the kind of coffee or tea Sandy would prefer), but it lives up to its billing of being fast, easy, and with minimal clean-up required. It wound up being a pretty good deal for a number of reasons:

  • We had several 20% off coupons good for any single item at Bed Bath and Beyond. Naturally, I used one of them on this.
  • It came with an additional $30 mail-in rebate.
  • It also came with a registration code for two free boxes of T-Discs (as an incentive to register it online).
  • I also got another coupon for additional free T-Discs upon purchase of 3 boxes at Bed Bath and Beyond.

The cats got some salmon treats, and some fluff balls (which they love). They also got wet food breakfast today, which Oliver always loves. Mia also got a special treat, as Sandy made her some new stuffed mice toys, which she really loves — she bats them around, throws them up in the air, chases them, and carries them around in her mouth. It’s very cute.

As for me, I got a Logitech Harmony 880 remote control, Halo 3, an Anaheim Arsenal jersey, and some other assorted knick-knacks from Sandy. My brother Ray had also earlier given me Guild Wars, NBA Street Homecourt, and BioShock. The biggest problem at this point is going to be finding enough time to plow through all of these games!

Snatching Victory From the Jaws of Defeat

On Friday night, the Arsenal triumphed 133-130 over the Colorado 14ers in one of the stranger finishes that I’ve ever seen to a basketball game. The Arsenal forced overtime after trailing for the entire 4th quarter (and almost the entire second half) on a tip-in by Jamaal Thomas after an intentional free throw miss. Then, Kedrick Brown fouled out early in overtime, leaving the Arsenal with only four players on the floor. (The Arsenal only dressed 9 players for the game, had two earlier foul-outs, plus a two-technical ejection of Ivan Johnson, and an injury to Guillermo Diaz that kept him from returning in the game.) Yet, somehow, the Arsenal managed to pull out a win over a team that’s leading the Southwest Division. I’ve never actually seen the situation where a team is forced to play with less than 5 on the floor — I didn’t actually know what would happen in that case, never having tested that in the old standby, videogame basketball.

An exciting win like this, over one of the better teams in the league, gives me hope that the Arsenal can claw their way back to respectability. Granted, they’re still 4 games below .500 and have yet to win on the road, but we’re only about a quarter of the way through the season, so there’s still plenty of time to turn things around. One issue that I’ve brought up before, and which continued to bedevil the Arsenal in this game, is that they are drastically undersized. If you look at the box score, they got absolutely pounded on the boards, and unless they can find some kind of way to play through that, I worry that they’ll continue to give up lots of boards and easy inside buckets.