May 04, 2008

The Four Stages of "They Stole My Game Idea!"

It's just like the four stages of death, but in a different order.

1)  Anger.  "Those ^%$#ers!  I wanted to make that game."

2)  Depression.   "Sigh.  I guess there's nothing I can do about it."

3)  Acceptance.  "On the bright side, at least now I get to play it and I don't have to develop it myself."

4)  Denial.  (Once you actually get to play it.)  "Hey, this isn't the game I wanted to make at all!"

April 30, 2008

Read my book for free, because it has Iron Man in it. Sort of.

What with the Iron Man movie coming out I thought it would be a good time to release my novel as a free pdf.  Why now?  Because Iron Man is something of a central metaphor, much as the Fantastic Four are a central metaphor in Rick Moody's The Ice Storm.  So, if you've been wanting to read my book, and the only thing stopping you was the price - go for it.

And, if you haven't been wanting to read my book - why not?  It won an honorable mention in the Writer's Digest Annual Self-Published Fiction awards.  It still has a five star average rating on Amazon.  So...it must be good.

Random side note - a friend of mine read it a few months ago and said to me, "It's a lot like Freaks and Geeks."  I'd never seen Freaks and Geeks, so I watched it, and - yeah.  A hell of a lot in common.  Geeks wanting to be burnouts.  Burnouts wanting to be geeks.  Eighties pop culture references.  So...if you liked Freaks and Geeks, you should give this a shot.  Especially now that it's free.

April 28, 2008

Reminder: IGDA Leadership Forum Proposals Due This Week

May 1st, to be precise.

If you want to give a talk at the IGDA Leadership Forum in San Francisco on November 13 & 14...submit it now!

Proposal requirements are very informal:  a few paragraphs might suffice, but a list of key takeaways or an outline will help.

April 27, 2008

Notes on Slay

Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away. -Antoine de Saint-Exupery

Slay is what happens if you take a strategy game along the lines of Civ or Wesnoth or Homm3 and remove features until the absolute minimum is left.

Which brings me to one of my pet-peeves.  A lot of people, including game reviewers, say 'depth' when they mean 'breadth'.  "This game only has one button?  Where's the depth?" Breadth usually comes from adding verbs, things to choose from, things that make nice bullet points in your marketing materials;  depth comes when the small number of verbs you have, combined, create their own variation.  Go is a game with almost no breadth - there's only one type of unit - and insane depth.  Your typical fighting game with a hundred moves, only one of which you use because it's an exploit, is the opposite.

Breadth can be the enemy of depth.  Anytime you give a player a new option to choose from you run the risk that you've created an exploit that makes all your other choices meaningless.

Slay is an old game - been around since Treyarch was half-a-dozen guys in a condo in Venice - and I didn't think too much of it back then, because it seemed too easy.  You had to really look to find one of the randomly generated countries that was challenging.  Well, maybe back then I had the AI set on a low level and didn't realize it, or maybe I've gotten stupider, or maybe Sean O'Connor has been working on the AI over the last ten years, because now it's pretty tough to beat.  I just managed to claw my way to victory on one of the small islands, and there's a whole lot left.

That said, the AI isn't on par with your typical chess AI.  You can leave a weak unit out where a stronger unit can get him, or lower your defenses, as bait, and then cut the strong unit's support.  Which is terribly satisfying!  If the AI was better, the game might be less fun...almost like the AI in a stealth game.

http://www.windowsgames.co.uk/slay.html

April 25, 2008

Manager In A Strange Land: Theory Of Drag 4

Hey, I'm back.  I'll have some news about Schizoid soon, and I have the energy to blog again.

A thing about drag.  I forgot one of the most important ways to mitigate drag, which is:  Don't Start From Scratch.  Almost nobody does, anymore - one of the first questions you ask yourself when beginning a game project is "What engine am I going to use?"  The main reason to do this is because it saves you a lot of work.  But another reason it's helpful is because you schedule more accurately - to keep using the snowball metaphor, the snowball you're rolling uphill is already nice and big:  progress starts slow and doesn't get that much slower.  In fact, a question I was asked at my IGDA talk went along these lines:  "We just do content drops into an existing engine - does this really apply to us?"  I fumbled the question at the talk, but now I'd agree and say, yes, although there will always be at least a little increase in drag as a project evolves, it may be so little as to be immaterial.

And I said I was going to talk about measuring velocity.  But it's nontrivial, and I don't really have a good way to do it.  I've been looking at this old progress graph:

Schedule_pic_3

And, if you're at any given point on that graph, what do you use for velocity?  The ideal is to find a velocity that will accurately predict when you'll be at at "zero bugs."  Here are some options:

- Use when you started the project as a starting point, and your current point as the end point:  this always gives you an overly optimistic estimate.

- Use your instantaneous velocity.  This gives you a wildly fluctuating estimate.  One day, you're going to finish tomorrow.  The next day (after a slip), you're never going to finish.

- Use some amount of history.  But how much?  Something that would have been fairly good for us, though still too optimistic, would be to use the last half of the project.

I tried a bunch of stuff - moving averages, fitting curves, nothing hit.  But my math skills in this area are weak.  If someone out there can take a graph like the one above and find a good approximating/predicting curve, please let me know how.  I did ask my brother-in-law, a financial analyst, if he could use stock market momentum measuring tricks to do it, and he wasn't able to help.

In the end, my best guide was actually my eyeballs.  When we were in December, and hoping we'd be finished in January, I was able to say - "Just look at the graph.  We're looking at the end of March."

That turned out to be on the money - the first time we hit the zero bug line.  Of course, we still weren't finished yet;  a little more testing and we were right back in the red again. 

One must imagine Sisyphus happy.

January 29, 2008

Interview

I did a long-ass interview with Lars Doucet over at Tigsource.

January 28, 2008

TDD theory

Here's a theory for y'all:

"The stuff that's harder to test is the stuff that's likelier to break."

More than once I've written a bunch of tests and skipped some case because it was Special.  Of course, Special often means Touchy, and later it'll turn out to be that one case that breaks.

January 22, 2008

Inside Game Design

Just got my copy of Iain Simons' *Inside Game Design*.  There's an interview with me where I talk about Torpex and Schizoid and say funny things like, "By the time your readers see this, Schizoid will have shipped."

There's also a series of screenshots from the early days of Schizoid, from the days of circles-and-squares programmer art to when we were about halfway done, with lots of enemies and backgrounds that we ended up cutting.  Good stuff.

Oh yeah, and there are other studios in there like Valve and Harmonix, but you'll get it for the Torpex spread, right?

January 20, 2008

Manager In A Strange Land: Theory of Drag Part 3

So, yeah, hey, credit where credit's due, Clinton Keith's post was what first got me thinking about this - you can even see my comment there in his post, when Schizoid was young but we were already seeing diminishing returns.

So, what do we do about drag and diminished returns?

1) Mitigate

One reaction is - "Let's get rid of it!"  Particularly if we use the tractor-pull metaphor;  let's get out of the tractor, clean everything up, and get ready for another pull.  That idea doesn't fit so well with the snowball-up-a-hill metaphor, though.  You've been working hard to collect that snow, you're not going to get rid of it just so you can push faster. 

But still, yes, good idea - let's periodically refactor and pay down our technical debt.

That'll help mitigate the drag somewhat, but it's not going to solve it.

(Another way to mitigate is to bring back waterfall - bigger designs up-front, more rigorous planning up-front.  You'll have a less werewolfy curve, because you're A) going slow at first while you do all that planning and B) probably reduce the discovered work.  The disadvantages in waste on speculative generality and building the product-you-thought-you-wanted-but-didn't-really-want probably aren't worth it, though, so I'm not recommending this.)

2) Bring Back The Contingency Buffer

Nothing new here.  Goldratt in *Critical Chain* spends hundreds of easy-to-read pages explaining why this is a good thing, and he's echoed much more tersely by Tom DeMarco in *Slack.* 

Their message:  "Don't adjust your estimates by a fudge factor.  Instead, use that fudge factor to create a contingency buffer or pad at the end of the project."  Because when you set pessimistic goals, people take their time.  I'm not a fan of Parkinsonian scheduling (setting unrealistically tight dates) but I'm also not a fan of unrealistically loose dates either.  My favorite thing about the contingency buffer is it helps keep scope in check.  "Sure, you think you can get it done before our ship date, but can you get it done before we hit alpha?"

Speaking of alpha, game development typically already has a kind of contingency buffer built in, which we call "alpha" or "beta" or "content complete" depending on where you work.  The point where you stop "adding features" and just fix bugs or maybe polish.  (Of course, the area between bug and feature is a gray one.  (The dial is analog, was how I heard Mike McShaffry put it once.))

I have problems with alpha.  I have problems with it being defined differently everywhere you go.  I have problems with the definition frequently being murky even within a team: ask different guys on your team what alpha means and you might get different answers. 

Another problem I have with alpha is it has become too small in this day and age.  Back when I did six month projects, we tried to stop adding features a month before we shipped.  Now that we're doing three year projects, if we're being proportionate, we'd save six months - but I don't know anyone who does.

But my biggest problem with alpha is it encourages sloppiness - an "add features now, we'll fix the bugs later, in alpha" attitude.  Steve Maguire, in *Debugging The Development Process* goes to great lengths to say why that's Bad.

But one thing he doesn't say is, when alpha is treated that way, it is no longer a contingency buffer.  For it to be a contingency buffer, your goal has to be to be done by then.  Not done-except-for-bugs done.  Zero-bugs-done. Done-done-put-it-in-the-box-done. 

Schwaber doesn't really do a contingency buffer, either.  On the release burndown chart, each estimate is multiplied by a fudge factor.  Just what Goldratt says not to do.  So what happens?  At the beginning of the project, when velocity is high, those fudge factors are canceled out by your high velocity.  It looks like you're going to eat through that burndown chart in no time, and Schwaber's method predicts an optimistic release date.  Then as velocity decreases the date continually slips back.

So here's my modification to Schwaber.  Track your backlog just like Schwaber suggests.  (And include all bugs that you intend to fix in your backlog - at Torpex, we use the rule of thumb that 3 bugs equals one story point.  YMMV.)  But rather than multiplying all the estimates by a fudge factor, add a contingency buffer at the end.

At the beginning of the project, when you have no idea what your progress curve is going to look like, you could use Schwaber's "complexity assessment" to guess how big the contingency buffer should be.  I could see it going anywhere from 20% to a well-understood-requirements simple-technology project all the way to 300% for the chaos of poorly-understood-requirements and crazy tech.  (Schizoid needed at least a 150% contingency buffer, we know now.)

A problem with the contingency buffer at the end is - if you make your scheduling process visible to your publisher, which most say is a Good Thing - and your publisher sees your large contingency buffer, they're going to ask, "What the hell?  Looks like you're billing us for a game much larger than the one you've scheduled!"

So, for the schedule you show your publisher, keep the fudge factors in the original estimates rather than in a large pad at the end.  I said this at my talk and Ben Hoyt called me out - "Isn't that dishonest?" he said.  At the time I said, "Yes, I suppose," because I tend to cave during Q&A.  But in hindsight I don't think it is, really, dishonest - the fudged estimates are your "because this is a project of significant complexity" estimates, and I'd be perfectly willing to share that with a publisher.  I'd also be perfectly willing to say that, internally, we have these aggressive goals we're striving to hit, so for internal purposes we don't actually multiply in the fudge factors, but rather leave them as part of a large contingency buffer at the end, but those aggressive goals are not ones we want to be contractually bound to.  Trent Oster, in his talk, said similar things -  he also said to double your estimates and apparently at Bioware they try to work well ahead of the milestones they've promised their publisher as well.

Now, suppose you're partway into the project, and you're experiencing drag, and you realize even you underestimated your contingency buffer - you're going to sail right past that final deadline with an unfinished game.  At that point, a couple things need to happen:

- You have to have that hard conversation with your boss / publisher.  The "Please don't sue us for breach, but..." conversation.

- Add a bigger contingency buffer to your next estimate.  It's tempting to assume that everything that can go wrong already has and it's going to be smooth sailing for the rest of the way, but then you'll just have to have that hard conversation again with the next slip.

We're trying to approximate this curve:

Idealcurve

With these:

Approxes

On Schizoid, at first, our trajectory had us finishing in April, but we told Microsoft June.  Call that our 50% contingency buffer.  After our first slip, it looked like we could still get it in under the wire.  Then we started optimizing and we slipped again.  Our contingency buffer is used up.  But it was just a blip, right?  We'll start making progress again any day now!  No.  The blip dragged out and became a plateau. 

If we had been honest with ourselves at that point, say, by plotting out where our new trajectory was going to hit and adding a larger buffer to that, we would have ended up with a much more realistic estimate about when we'd be done.  An incredibly disheartening estimate, but realistic. 

And still wrong - here we are, almost February of next year, and still not done yet!  But it would have been much less wrong than what we were going with back then.

Sadly, "Less Wrong" is all I can offer. 

Next time (notice I didn't say next week - we just did more focus testing and bug triage and we can't bring ourselves to mark as much stuff "Will Not Fix" as maybe we should and now blogging is starting to feel like a luxury):  Just how do you calculate "velocity" anyway?

January 12, 2008

Manager In A Strange Land: Theory of Drag 2.5

Before I go on to Part 3 and what we can do about drag let me deal with some of the discovered work unearthed by the comments on Part 2.

* Graph Quality

Mark Nau calls me out and says he doesn't see the curves.  If we still worked in the same office I probably would ask him to help me do an actual rigorous statistical analysis of the data.  The curves are there but they look shallow and I admit I was pretty disappointed after generating the graphs that they weren't more obvious.

As for not seeing much of a bump when we brought the new programmer on, I can explain that.  He's only part-time - I'd estimate at him increasing our manpower by 25% or so.  Factor in Fristrom's Law and it's less.  He needed a ramp-up period.  And his first task was huge but greatly underestimated.  It could have shown on the graph as a simultaneous increase in scope and work, but instead it shows on the graph as an increase in neither.

But that goes to prove Mark's point - the graph isn't accurate.  I'm not able to truly tease apart work and scope, and probably won't even bother on future projects.  (Though it was nice to see that we actually have been working all these months, something that isn't obvious from the first graph.)

Still, it's not two straight lines.  Keep in mind that first graph:
Schedule_pic_2

This graph is simply the delta between the two lines in the other graph - though they don't plot out to the same point in time;  I made the graphs at different times.  If the lines in the other graph were straight, this graph's lines would be straight as well, but this is not a straight line.

* Other curves?

Jake Simpson and Simon Cooke say they see different shaped curves on their projects - they both see sine waves or something approximating sine waves.  It is possible on this project we're just looking at a portion of a big sine wave with a really large period.  Which would be a good thing, because that means at some point we'll take off like a rocket and ship!  I wouldn't be surprised, actually, if we do get a burst in the end, as we put our foot down about feature creep and the remaining bugs are all highly detailed spot fixes.  If only there was some way to predict when that change would come.

Cooke sees the opposite from us, in a way:  he sees little visual progress in the beginning, during ramp-up, later followed by a lot of visual progress.  (Much like our programmer with his big, underestimated task.)  He may be more waterfallish than we are - we tend to get something up-and-running *now* and refactor later.  For us, the "up and running now" shows up as a lot of progress, and then the refactoring shows up as drag.  (Maybe this agile stuff isn't all it's cracked up to be.)

* Feature Creep vs. Discovered Work?

How much scope increase was stuff we wanted vs. stuff we needed?

Report20080112_2

FWIW.  Red & most of green are needed.  Blue, yellow, and pink are wanted.  Call it 60-40.

Though I hesitate to call that 40% literal 'feature creep' - most of our unnecessary fixes were not "add X" but "X would be better if you do Y".  The feature was already there and we were tweaking it.

More interesting would be to see how this changes over time, but I didn't know until late in the project that you could set up Bugzilla to generate snapshot data that you can later graph.  It would be fraught with inaccuracy anyway - at the beginning of the project, p3 meant must-fix and later came to mean nice-to-fix.

I'm guessing Busse's point:  if you tighten the reins on feature creep, you can mitigate the effects of drag.

I'll try to get back on track next week, unless there are more interesting comments.