Herding Cats

For those of you who are tired of City of Heroes posts and who haven't been tracking my technical blog, a bunch of posts there lately have been more thoughtful than technical. You might want to check them out.

Don't those titles alone make you want to check them out?

Technorati tags: ,
19. June 2007 20:37 by Jacob | Comments (0) | Permalink

The Rabid Guide to City of Heroes Travel Powers

Our regular gaming group has recently decided to pick up City of Heroes for our regular Tuesday night games mostly because grouping requirements in D&D Online are simply too unwieldy. I had canceled my DDO account relatively early so I haven't been in the Tuesday night games for a while. Well, City of Heroes is another matter entirely and I foresee being a regular attendant.

Yay! CoH!

Now, you have to understand that City of Heroes is one of my favorite MMOGs and one I only stopped playing because I lacked a decent super group to play with. It's also one of only two MMOGs where I've ever reached the end-game--ADD and extended alt-itis generally combine to keep me from the top.

At any rate, I've played enough City of Heroes to have learned a bit and I thought I'd post this brief guide to travel powers.

Moving Around

There are four ways to get around CoH quickly: fly, jump, run, and teleport. Each travel power comes in a set of four powers. You can choose from the first two of these four when you reach level 6. The first two powers in the different travel areas are pretty minor and don't really help you get around at all. It's the third power that's the speedster. In order to select this third power, however, you have to be level 14 and have chosen one of the first two powers at some time.

So here's what all the noobs want to know: which travel power is best? Well, that's a good question, so here's my opinionated take on the CoH travel powers.

Running - "I am da FLASH."

Running is the fastest of all the travel powers over the long haul. It includes an "ignore me" component so bad guys will leave you alone as you run past. This is a good thing because the streets of Paragon City are dangerous. Running is also alone among the travel powers that lacks any kind of vertical component. This is its single biggest drawback and probably the reason the devs made it so speedy. Paragon City isn't kind to the street-bound, though you'll find small ramps and other geographical features that help ameliorate this somewhat. It takes some skill navigating very narrow ledges at very high speed, though, so this is not a choice for the dexterity-challenged. The other two powers in this pool aren't anything to write home about, either. One gives you another attack (hint: any class that needs attacks doesn't need any extra attacks after about level 8) and the other makes your attacks refresh faster. That second seems like it'd be attractive, but since it doesn't include regenerating endurance any faster, it's mostly a fast way to hit zero end.

Jumping - "Able to leap semi-tall buildings in a try or two."

Jumping is by far my favorite. It's the second fastest over the long haul, so it's a decent choice if you want to get where you are going very fast. Jumping gets you over all but the tallest obstacles with ease, though some targets are easier to hit if you're trying to maintain your overhead view. Since falling damage is so negligible, you really don't have to worry about those steep drop-offs or bridge tops. One of the first powers in this pool is an extra attack (see above) but the other, Combat Jumping, is a handy little defensive ability that also increases your jump distance very slightly. I keep Combat Jumping going during missions and then switch out to Super Jump when we're done.

The thing I like about jumping, though, is that it's just fun. Choosing to go for that next building or deciding to take a shorter hop on top of a large crane keeps you occupied while you're en route. It means you can't just auto-run and forget for long distances, though, but really flying is the only travel power where you can do this.

Flying - "It's a bird! Or a plane! Or, nah, just another latex-wearing goombah."

Flying is an excellent choice for anyone who wants to keep out of the way of the bad guys and can do their thing from a distance. The main reason for this is that fly has (in addition to a useless attack) a handy hover as one of its first two powers. A lot of bad guys have weak distance attacks, so this is useful for big battles with muscle-bound Brunos. In addition, flight makes it possible to go to any location no matter how high or isolated it might be with a minimum of fuss. Flight is the slowest movement power, but it's steady and reliable. Further, as I mentioned above, if it's going to be a while, hit auto-run and point yourself in the right direction and you can chat with your team or super group on your way. Long flights can run down your endurance, though, so it's tempting to slot some extra reductions there.

Teleport - "Now you see me..."

Teleporting has, by far, the most useful non-combat group ability in the game: Teleport Friend. This power allows you to teleport someone in your group to you, cutting those selling trips down immensely (unless your teleporter is the one dinking around). It means that someone across the zone in the Hallows can be right back at the mission entrance in nothing flat.

Unfortunately, teleporting as a means of travel yourself is both tedious and confusing. It's the fastest short-term means of travel (which can be handy if you're in trouble and have to exit fast), but eats endurance with lightning speed as well. When you first get the power, you have a hard time making it a km without exhausting your endurance entirely. In addition, you have only a second or two of built-in hover between the time you pop in somewhere and when you start falling. That means you have to choose your next location fast which makes cornering a real pain. To make matters worse, some objects aren't nearly as insubstantial as they seem. I've arrived more than once with an astonishingly close view of tree leaves telling me that I wasn't were I thought I would be.

Conclusion

I have semi-permanent characters with each of these powers. My decision tree looks something like this.

  • If I'm a blaster, flight, hands down.
  • If this character will group a lot, I'll pick up teleport.
  • Finally, I go by character concept. If it's a character I want to be speedy, I'll choose running. Generally, though, this has only really happened once so I'll tend to default to jumping. It's my favorite for no reason beyond that jumping from rooftop to rooftop is a kick.
Technorati tags: , ,
1. June 2007 09:57 by Jacob | Comments (5) | Permalink

Windows Media Player 11 Sucks

I've been reserving judgement on Windows Media Player and the whole Digital Rights Management issue for a couple months now. I mean, when Microsoft updated to version 11 and people began complaining about how adding the DRM made it less stable and prone to lockup, I figured this stuff would be worked out and that at least it provided a baseline capability that people can use as a starting point.

Until today, that is. Judgement has been rendered and Windows Media Player is officially found wanting. Not just wanting. It is not merely inadequate. WMP 11 has officially, in my book, entered the realm of Software that Sucks.

The last two days, I downloaded two videos that I wanted to view. Neither one is anything tricky. Indeed, they're both wmv files (Microsoft's own video format) with nothing abnormal about them. Neither will play without throwing up this error. Note: both are using Microsoft's own codec (Windows Media Video 9). An hour plus spent online looking for a solution to this problem reveals that I am far from the only person with the problem. Based on what I've read, it looks to me like WMP is choking on my built-in sound card from HP.

Now, I have a relative hate on for HP, so normally I'd be happy to blame them for their crappy hardware. The thing is, well, just out of curiosity, I downloaded WinAmp to see what it could do with the files. I haven't installed WinAmp in years, but hey, it might work, right?

It did. Worked a charm. No trouble playing either video.

To sum up: Microsoft can't play its own format on my machine, but its competitors can. That, my friends, is sucky software.

21. May 2007 15:50 by Jacob | Comments (13) | Permalink

Update

Well, I created a new post over at my new IT blog. If you're here for the IT stuff, pop on over...

Yes, I am having a tough time adjusting...

9. May 2007 14:30 by Jacob | Comments (0) | Permalink

Lord of the Rings Online - A Review

For many significant events in my life, I remember when they occurred by where my family was living at the time. We were in an un-air-conditioned house in Phoenix, Arizona in the summer I first read the Lord of the Rings. I clearly recall both the library and the corner I'd sit in at home while I read it. I devoured the whole trilogy in a couple of days and I remember that it as a friend in an area where I had none.

It'll come as no surprise, then, that I jumped at the chance to play the new MMOG, The Lord of the Rings Online: Shadows of Angmar. I have to say, Turbine has done an incredible job bringing Middle-Earth alive.

The Good

There's a lot of good things in this game. Turbine learned a lot from their predecessors and have implemented many of the things that keep a game from sucking.

Stealing From World of Warcraft

First off, LotRO lifted some of the best ideas from WoW. Bonus XP from time spent offline, an easy death penalty, blanketing the world in quests, mailboxes, global auction houses, and easy point-to-point transportation all found their way into the game. Essentially, all of those things that make it easy for casual players to feel welcome for the half-hour chunks of time they can afford to spend in a game.

This is a noticeable difference from the attitude of Vanguard where the harder-core you are the better they like it.

No Whack-a-Mole

I would think this would be a given in new MMOGs, but apparently it isn't so I'll just state here that there is no wanton killing of innocent wildlife required in LotRO. There are not only plenty of quests of your level to ensure that you never have to wander aimlessly killing stuff to make that next level, but your quests are easy to find because your mini-map has markers for quest-givers. I had no idea how much of a pain it is having to search for people who have a quest for you or what a difference it makes that people with something for you to do are clearly marked on the overhead map.

Even boring whack-a-mole quests are few and far between. This isn't an accident. I played a week or two in beta around Christmas last year. One of the things that struck me then was how solid the game was so far from release. More interesting was that completing quests often popped up a questionnaire asking how fun that quest was with both a 1-5 scale and a place for comments. What a concept! I've played other betas and can't recall ever seeing anything like it. The fruits are obvious, but only in contrast from having played both then and now. They seem to have spent a not insignificant amount of time fine-tuning the fun. This is a good idea that I hope it gets copied.

Minor Innovations

In addition to the tried-and-true, LotRO does some interesting new things.

The Bunny Slope

The most notable is the use of separate spaces in the beginning game. Your first quest is entirely solo and gets you into the story based on your beginning race. After that first quest, you enter a noob area for characters levels 1-6(ish). There are actually two of these staging areas, one for dwarves and elves and one for the hobbits and humans. After you finish this area, you hit another solo quest. It's only after this second solo quest that you end up in your race-segregated "global" starting area.

Cutting up your experience in this way would feel arbitrary if it weren't for what Turbine does with the story. The troll frozen by Gandalf in your first solo adventure is a statue when you later explore that cave on a quest. The village you only just managed to save (but not before it was almost destroyed by bandits) is a shadow of its former self later as it rebuilds. One of the farmers you warned to enter the safety of the city walls is being mourned by his comrades.

It's not a truly dynamic world, but it's light-years more dynamic than other MMOGs. This story-based growth makes you feel like a part of the history of the world in a remarkable way.

Tank-Healer-Mage

The other thing LotRO does well is mess around with some of what we've come to expect from class build-out. Healing, tanking, and blasting are pretty well split up among the classes in a way that is internally consistent but that doesn't follow the pattern other games use to force certain roles on grouping. What this means is that you don't have people looking for a healer or a tank, they're just looking for others to fill out their group.

This is a good thing.

Best Use of Licensed Content

 By far Turbine's greatest success is in their use of the license, though. This is most noticeable if you play a hobbit, but all of the races do an excellent job with their quests lending to what you'd expect if you were to step into the books. The elves are full of existential ennui, the dwarves with active distrust of all things non-dwarfish, the humans with restless energy, and the hobbits with home, hearth, and village.

In addition, the writing is good. Good intentions aren't always assumed nor are successful quest results un-alloyed or cloying—sometimes the widow has to be told that her son really did run off to become a bandit.

Also, how cool is it to hang with Aragorn?

The Bad

No game is going to be an unmitigated success—not to a reviewer at any rate. LotRO is no exception.

A License Cuts Two Ways

If you don't like the books, then this game isn't for you. Further, if the traits of a specific race annoy you, don't, under any circumstances, play that race. If you don't want to deal with petty jealousies, self-important trivialities, and a preoccupation with food, don't play a hobbit. I enjoyed it, but that's because the writing was so evocative of the settings in the books and the quests were extremely creative. Meeting Lobelia Sackville-Baggins is not a treat. Samwise's Gaffer is kind of a pathetic whiner. Delivering mail on a deadline while dodging nosey hobbits is a new kind of quest, but one not everyone is going to enjoy (it was my favorite, though).

Inconsistently Inconvenient Commodities

Many of the things you want in the game are spread out in non-obvious places. Trainers are clustered in one village which can be inconvenient when all your quests are a village or two away. Auction houses are hard to find for any race over 5 feet tall as are banking facilities. I hate looking like a noob and having to ask if anyone can point me to a convenient resource.

Crafting is Half-baked

I can see that they were trying to be original like they were with classes, but their changes are a humongous PITA for crafters. Bundling crafts in groups of three is only charming in the first minute or two. Particularly when you discover that your bundle doesn't include the ability to gather the resources one of your crafts needs. Add the difficulty in finding an auction house and you have a recipe for frustration.

Also, my favorite craft had beginning items that you can't use until level 15. You start crafting around level 7.

White Guys Can't Jump

I've seen people trash the graphics in the game, but I think they're actually just fine (and in places magnificent). What sucks, though, is the animations. Your feet don't seem to quite touch the ground. Running seems uncannily, uh, smooth. I actively avoid paying attention any time my character has to jump because it just looks so awkward. It's an unfortunate contrast to go from playing my Tauren Hunter in WoW to a dwarf in LotRO. The Tauren just seems to have such weight.

The Conclusion

I'll keep this subscription until I get tired of it—aka the foreseeable future. What I'm looking for more than anything else is how it progresses from here. How often are updates? How comprehensive? Will they improve the crafting (please)? There's a lot I still want to explore. I haven't played any character past level 11 and I haven't done a lot of grouping (because pick-up groups suck and I haven't found a guild/kinship yet). There are some interesting kinks with traits, deeds and kinships I want to explore as well.

I'd definitely put it on the recommend list.

2. May 2007 11:19 by Jacob | Comments (1) | Permalink

More Cloudy Days

If you have the eye of a good copy editor, you might have noticed some volatility in the ole Tag Cloud on the right. I made some changes at the request of people on the SubText developers list and reworked some stuff—most of which is completely invisible. The biggest visible change is that I decided that assuming an even dispersion around the mean might work in natural statistics, blog post tags tend to be more of a declining curve however.

What that means is that most algorithms for displaying tag clouds use a formula that allocates about half their categories to styles that are never visible. Most tag clouds I saw had slots for up to seven different visual styles that only really displayed three or four.

Well, that's just a waste of a good idea, I say! So I mucked with the weighting formula so that I'd see more visual variation in my clouds. We'll have to see if my theory holds after scrutiny and on blogs with larger traffic.

15. April 2007 15:48 by Jacob | Comments (5) | Permalink

Cloudy Day

I just completed some SubText hacking and the results should be visible now. In addition to upgrading to version 1.9.5 (which should officially release here shortly), I implemented a new feature: Tag Clouds. I'd had enough of my feature envy from all the cool kids who had them, so I went and rolled my own. If you're at my actual site (as opposed to a feed reader), the Tag Cloud is off on the right.

This was a non-trivial feature to add. In an email conversation on the SubText developers' list a couple months ago, Phil Haack (semi-benevolent project dictator) indicated that he planned on tags being first-order objects—meaning that they'd have their own table and post cross-reference. They'd also be allowed to penetrate into other public interfaces (as they'd pretty much have to do). The main point from the majority of developers in that discussion was that they wanted Tags to be done well and fully and support all the different tag providers out there.

Like RSS and other Internet wonders, tags are fundamentally simple in concept. A tag is defined as simply any hyper link with a "rel" attribute of "tag". Something like this:

<a href="http://technorati.com/tags/competence" rel="tag">competence</a>

The biggest gotcha in this setup is that officially, the "name" of the tag is determined by the link and not by the text of the link. So if your link were like this:

<a href="http://technorati.com/tags/competence" rel="tag">incompetence</a>

 The tag is officially "competence" even though it displays "incompetence".

Which means that the core of the feature is scanning posts on insert and update to catch any tags they might contain and adding/updating the links needed for the tags in the post. All I can say is thank heavens for RegEx. It's a pain in the pinky toe to understand, learn, or debug, but you just can't beat it for parsing text. For the curious, and to open myself to ridicule, I'll give you the expressions I used (both case insensitive).

To find a link: <a(?<element>.*?href=[\"'](?<url>.*?)[\"'].*?)>.*?</a>

To figure if the link is a tag: rel=[\"']tag[\"']

Oh, be careful there if you use or copy those expressions; this was done in C# so quote characters are escaped using the \ character.

Anyway, it's done now, and I'd appreciate hearing any trouble you might have. I already caught a choke when the tag includes a "." in it. Fortunately that one just took a RegEx change in web.config so the tag display handler would pick it up. I'll create another post later detailing how to add a tag cloud to a random skin once this upgrade gets added to the SubText project officially.

13. April 2007 18:15 by Jacob | Comments (0) | Permalink

Too Much Information

Too Much InformationLike many businesses, my current employer uses Microsoft Dynamics GP for our main  accounting/inventory software. From a recent trip to Connections (the big convention for Dynamics), I learned that there were some cool data mining utilities available from Microsoft that we might be able to use. I love free stuff, and the opportunity to give our executives something to chew on for a bit (keeping them out of my hair) was one I couldn't pass up.

The Analysis Services install I managed to dig up (after much searching on Microsoft's Customer Source) went pretty easily. There are a couple of SSIS jobs included that populate an summary database with relevant data pulled from the objects you want to throw into your data warehouse. Not too shabby, even if it's an extra aggregating step. In fact, I kind of appreciate the added encapsulation and I know I'll have to restrain myself from using this database for other reports.

Anyway, the only thing left at that point was to "process" the data warehouse. That's where the data warehouse reads the "factual" information and chunks it up into nice little cubes that should have precise business-person meaning. It can take a while, so I was prepared to leave the process running a bit.

Five hours later...

We're just not so big a company that this thing should have taken five+ hours. Digging into the process that was taking so long revealed that at least one of the dimensions it was trying to process included a table join that seemed a bit fishy. It included a master-detail relationship that should have ended up with something around 500,000 rows. Checking the "Estimated Execution Plan" on the generated select statement showed that it was estimated to return closer to 2 billion rows. That's a messed-up join is what that is.

Fortunately, Visual Studio 2005 gives you some cool tools that work with Analysis Services. One of them is a wizard that you can point at a data warehouse and have it reconstruct it as a project. Checking the Data Source View "GPDataWarehouse.dsv" revealed what the problem was. Roughly half the relations in that view had split the key so that there was one for the actual relation minus the CompanyId and another with the CompanyId all by its lonesome. The effect of this is that the data warehouse would process once for the real relationship and again for the spare. Since CompanyId is the same value for all my records, what I ended up with was a data set getting ready to relate 147,698 records with every one of 11,937 records. I'll spare you digging out a calculator; that's 1,763,071,026 rows total.

Now frankly, I could have simply removed the CompanyId entirely from all relationships—CompanyId is only really relevant if your Dynamics install is trying to manage multiple companies. We aren't doing that. Still, I can be a little, uh, rigid with stuff like that so I went ahead and changed the relevant relationships to include CompanyId and simply deleted the spares. Once I deployed the project back to the data warehouse, processing it completed in a mere 15 minutes.

I suspect that the cause of this disjointed relationship is that the original warehouse was configured for SQL Server 2000 and we're using SQL Server 2005. At any rate, things are a lot happier now. I have an SSIS package that kicks off the summary database update and then processes the cube and the whole thing runs at night in 20 minutes or so.

For those who might be experiencing similar issues, I've uploaded my working Data Source View. You should be able to replace yours using SQL Server Management Studio. I selected all the options on install so it includes the Financials, Inventory, Payables, Purchases, Receivables, and Sales cubes. I'd do a backup before attempting it, but you were probably going to do that anyway...

4. April 2007 22:25 by Jacob | Comments (0) | Permalink

Vanguard - A Review

I like game systems and always have. They fascinate me. It started out with my generation's standard: D&D. I bought my first game manual in 1981 and haven't looked back since. This fascination manifests itself in a masochistic desire to explore new MMOGs when they come out. If a game claims to innovate away from the standard mob-hunt, monster bash level progression, I'm particularly interested.

So when I read that Vanguard has three separate spheres for character advancement and that you didn't need to advance at all in the "Adventure" sphere (i.e. killing stuff) to advance in the others, I was pretty much doomed. Other games have tried this before with tragic results, but Vanguard is a part of the Sony empire so I expect that the game will actually be playable. And I have to say, they did something mildly wonderful with the Craft and Diplomacy spheres. Too bad Sony is run by pointy-headed morons who can only see customers as dollars with legs.

The Good

I explored Crafting first and I have to say, they did some interesting things here. The beginning crafting quests give you everything you need to get a feel for the ropes including some minor crafting equipment. This is where I first discovered one of the best things Sigil created: sphere-specific character inventory. My crafting stuff doesn't clutter up my bags and require complex item switching to maintain, just as my adventuring gear doesn't get in the way when I craft. This is nice, though 9 players in 10 won't even be aware of the pain-that-might-have-been (which is a sign of good design).

One thing that took some getting used to in both the non-killing-stuff spheres is that they incorporate colorful "gamey" abstractions. In Diplomacy, for example, you earn "conversation cards" that you play during a conversation to determine who is "winning" a discussion. The cards interact in certain ways that make diplomacy something of a challenge. While a touch odd at first, I came to admire this solution to making these sphere's attractive. It seems that Sigil remembered what others seem to have forgotten--this is a game. If all you have to do to craft something is push a button, then crafting is going to be boring.

These "gamey" abstractions both give you opportunities for random events and introduce the possibility of failure (to be clear, I'm not actually linking those two--while you can have an awkward run of luck in crafting, success or failure is still in the hands of the player). You choose whether to continue pursuit of an "A" quality item or decide that you've had too many muscle cramps to make that feasible and be happy with a "B". This dynamic means that your brain has to be engaged as you play these spheres, keeping them fun and precluding boredom as you pursue them.

My favorite sphere, by far, was Diplomacy. The "gamey" aspects of it were the most abstract but it also had the best writing. This makes sense, but it's good to see they actually spent the money to get some quality stories. I experimented with a couple of different races and each one had some compelling diplomatic storylines with factional interplay and manipulation that pulled me in. I'm not as big a fan of the "town levers" dynamic (which allow your diplomats to boost certain aspects of towns that then give players there interesting buffs--usually with a one-hour timer). I wish they had done more diplomacy quests, but I can see how there's only so much individually crafted, unique content you can create. They could also improve the availability of information before going into a conversation, but the information is there (you just have to remember who you are talking to and what that means about their conversational proclivities). Don't let these nit picks distract here, though: this is an excellent innovation, fun to play, and others would do well to learn from Vanguard.

Finally, a class I think they did extremely well with is the bard. Vanguard has 15 different classes (which is a little excessive) so I haven't experimented with them all, but I'm always interested in what people do with bards. Bard fighting skills in Vanguard are about what you'd expect (though dual wield is a fun non-common perk), but their songs are fantastically well-done. First, you don't actually get songs as you level--you get movements, rests, embellishments, lyrics, and other pieces of songs that you then put together to craft masterpieces to your liking. This lets you fine-tune your energy expenditure and song effects in a very bard-like manner. Second, Vanguard lets you name your songs. The buff tool-tip on mouse-over actually contains your title, allowing you to be publicly creative in a very bard-like way. Nice touches, both.

The Bad

As innovative as some aspects of Vanguard are, there are aspects of the game that grate. The most obvious is that Sony chose to skimp on quality. The graphics, while nice, aren't anywhere near what you'd expect given the system specs on this thing. In addition, the voice acting is... spotty. Some of it was okay, but mostly it was pretty bare-bones (and some of it was downright cringe-worthy). I don't consider myself a voice guy--I don't normally notice voice acting in games. This was occasionally bad enough to draw my attention.

The thing that drove me to cancel my subscription and head back to World of Warcraft, though, is the stupid insistence on a death penalty. Traveling the world is a dangerous activity what with wild boars and other aggressive bad guys wandering around loose. Also, sometimes you want to go out and exercise your inner barbarian. Even though you can theoretically spend all your time in non-adventuring spheres, it remains your core gameplay and central dynamic. If it sucks, everything else is affected. And make no mistake, ramped up death penalties suck.

I truly don't get how people aren't learning from City of Heroes and World of Warcraft on this. Failure is its own penalty. Adding an XP hit and corpse retrieval is just adding insult to injury. Games put you in the position of playing the extraordinary. Games let you play a risk-taking, tough-talking, potentially swaggering larger-than-life character that takes the world on through brains, brawn, or maybe just persistence. Hitting me hard when a risk turns out badly adds suck to a game that I don't think needs to be there.

An additional suck in Vanguard is also that you run out of quests before you run out of level (even more so if you die at all). That means that some time spent running around killing random stuff is, to an extent, mandatory. Here's a tip to anyone designing games: random killing is only fun for people with a lot of time on their hands and/or psychopathic tendencies. Yeah, that's a good portion of your male teen demographic, but games aren't dominated by that group as much as you think (witness WoW's continuing phenomenal, broad-based popularity).

The death penalty suckage is particularly vivid with a player used to World of Warcraft. In WoW, quests will tend to take you places where a single "add" during a fight, while risky, isn't likely to end badly if you're careful. Hard-core players bemoan the wussification of MMOs brought by World of Warcraft, but that's because they're jerks. Well, okay, that's probably not the case, but heavy death penalties do tend to be championed by people looking to prove that they are better than all the noobs running around who have a mere hour or two a night to play.

My final gripe is that Sony, as a company, seems to be deep into self-destruct mode when it comes to pricing and marketing. In Vanguard, this is manifest through their Station Players site. You can, for $1 a month each of four "services" (or $2.99 a month for all four) have access to a couple of character information pages. Gee, thanks. This is actually a cool feature that I first noticed and loved with Planetside. Being able to check out your stats without having to be logged in opens up new obsessive horizons and gives players opportunities to be involved with your game without drawing down all the resources they would if they were logged in. It's a classic win-win for any company with half a clue. Which is why Sony is trying to extort $3/month for something other, more enlightened, companies are giving away for free.

The Conclusion

As I said above, I canceled my Vanguard subscription. I got as much play from the game as I typically do for your standard single-player releases, so I'm not upset about wasting money. It gave me some good memories and I have to admit that exploring the Diplomacy sphere still has an attraction. Unfortunately, the rest of the game seems to be targeted more for your hard core, death-penalty-loving, noob squashing l33t playaz than for someone like me. Also, a company that seems to be looking for every opportunity to squeeze the last dime from my pocket offends me. Note to Sony: you are not the only game in town and your competitors are generous with their offerings. Extorting an extra 20% a month for something others provide for free is a really bad idea™.

7. March 2007 19:33 by Jacob | Comments (5) | Permalink

Arguing Data

People have a lot of different reasons for posting blog entries. These reasons vary from financial, to personal, to professional, to I'm afraid to know more. For me, one reason I take the time when I could be doing something else is that I like to put my ideas out there to be tested. I don't really care if a majority of people agree with me so much as I want to see what other people have to say for or against certain things. The downside to this is that I'll sometimes find that an idea isn't as good as I had originally thought it was. The upside is the opportunity to refine something to be better or to discard an idea that turns out simply to be bad.

Which is why I'm glad to see Karl Seguin's response to a post I had made about DataSets. Karl's a bright guy and he has a good background in the problem domain associated with DataSet objects. He displays class, too, even when he feels I've been a bit rough in a point or two.

The School of Hard Knocks

I empathize with his experience where DataSet misuse caused much pain and suffering. I've been in similar situations and it's no fun. In a full-blown business transaction environment, DataSets have some liabilities that make them ill-suited for business-layer usage. The thing is, the opposite problem exists as well, and it's one that is more serious than people want to give it credit for: a layer of specialized, hand-crafted business objects that don't actually do anything.

I'm currently working at a place that has an extreme case of this problem. We have four entirely separate ASP.Net applications for our internal invoice processing. All four of these applications have their own set of substantially similar custom objects that are completely unique for that application. Each object doesn't do anything more than contain a group of properties that are populated from a database and write changes back to it.

I shudder to think how many hours were wasted on this travesty. It's over-complex, can't leverage any type of automated binding, doesn't track row state, and testing and debugging changes is an unmitigated pain. It's like someone attended an n-tier lecture somewhere and never bothered understanding what the point of having one actually was. Frankly, I'd prefer if the previous developers had simply put all the data access right in each individual page--at least that'd be easier to fix when something blew up.

Learning Your Craft

The thing is, my experience no more proves custom business objects wrong than Karl's experience proves DataSets wrong. That's the trouble with anecdotal experience: it feels more important than it is (it doesn't help that pain is such an efficient teacher).

The trick of learning a craft is in gaining experience that is both specific and broad. This can be tricky in a field that is as immense as software development. You really have no choice but to specialize at some point. Even narrowing it down to ".Net Framework" isn't nearly enough to constitute adequate focus for competence.

Unfortunately, Karl's point that there are a lot of lazy programmers out there is true. Anyone who has had to hire or manage programmers will confirm this. Too many developers don't bother learning enough of their craft to be considered actually competent. Faced with the need to specialize carefully, many simply give up and learn only enough to get by (and sometimes not even that much). They're content to learn the bare minimum needed to get hired. They'll learn enough of the "how" to create a program without ever bothering to learn any of the "why".

Teaching Others

I have a minor problem with Karl's explanation, though. He says, "I advocate against the use of DataSets as a counterbalance to people who blindly use them." While I understand this position, I'm not sure I can be said to appreciate it. It smacks a little of the "for your own good" school of learning; which works well enough in a parent-child or even teacher-student relationship. I'm not sure it works so well in public or general discourse.

It is hard to correct bad habits, particularly habits as widespread as DataSet misuse seems to be. As one who often has the bad habits to be corrected, though, I think that I'd prefer having the problem explained and given the context so I can understand the trade-offs being made. That would give me the opportunity to know why something is wrong, not just that something is wrong.

That'd require discussing DataSets in specific instead of general terms. I'm not sure if Karl would really want to do that, though. I mean, his specialty at CodeBetter is really ASP.Net. Expecting him to tackle ADO.Net is not just unrealistic, it could have the effect of diluting his blog posts and alienating his regular readers or getting him embroiled in things he's less interested in.

I would like to see someone respectable and wider-read than I am take on Strongly-typed DataSets in a more complete fashion, though.

Professor Microsoft

Which is why I have to agree with Karl that the blame for DataSet misuse lies squarely in Microsoft's court. I stopped counting how many official articles and examples from Microsoft included egregious misuse or abuse of DataSets. And I have yet to see any that describe how to do it right or what kinds of things to look for in determining the trade-offs between a Strongly-typed DataSet and a more formal OR/M solution, let alone ameliorating factors for each. The only articles about DataSets that I can remember that don't actually teach bad habits are articles about how bad they are. Which isn't helpful. It'd be nice to have something, somewhere that talks about using them wisely and what their strengths actually are. Maybe that should be a future blog post here...

26. February 2007 18:33 by Jacob | Comments (0) | Permalink

Recent Posts

Calendar

<<  September 2010  >>
MoTuWeThFrSaSu
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

View posts in large calendar