12-22-04If I look at my hourly salary (before tax) as if I had a 40 hour work week, it looks really good. I go wow, it seems like I could just work a few hours and be able to do things like buy a nice dinner. Then I look at it in terms of the actual # of hours I work (probably about 55/week on average), after tax, and suddenly it looks like shit. All of a sudden that ridiculous sandwich from across the street looks way too expensive. Plumbers, city workers, etc. all make more per hour than me, and I work way harder, not just in terms of hours, but in terms of stress and intensity of work. Cursed ambition and desire to do something productive with my life!
On the other hand, if you actually think about working for minimum wage, it's mind boggling. Think about it - $6/hour, for 8 hours, gives you $50 a day. I spend nearly that much on food on many days! $50 a day, for your rent, health care, utilities, clothes, transportation, food, everything!? My god, what's the point of even going to work if you make so little. That's $1 for 10 minutes of work. You surely make more money begging. If you ever have any hope of making decent money, then it's foolish to work for minimum wage. eg. if you're a kid in college - don't work some stupid job, just get loans. You'll easily pay them off later, and it's better to just have that time to enjoy. If you don't understand this, think of the value of an hour of leisure. Maybe it's $20. Thus, if you earn $40/hour, you're effectively getting a +$20 value for that hour, since you're losing an hour of your life in exchange for the work you're doing. If you work for $10/hour, you are losing $10 each hour! That is, the value of your life that you are giving up for that hour is worth more than what they are paying you. If you really think your life is only worth $6/hour, that's very sad.
12-22-04In the last rant I wrote about optimization and life decisions. There are two related things I've been thinking about a lot recently.
Responsibility and impulsiveness. This is sort of an interesting and difficult life trade-off. On the one hand, if you are wise in your decisions, you can avoid regrets - note that this does not necessarilly mean you are just a cautious stick in the mud, you still might make decisions like running away with the Circus or doing drugs or whatever, it's just that you actually thought about it, you saw the consequences, and decided that was the good thing to do. To be bold & thoughtful is difficult, but it is in some ways great. One problem with this is that making wise decisions takes time, and by taking that time, you will miss many opportunities, especially in social situations where split-second reactions are important. On the other hand, if you are impulsive and don't consider your actions carefully, you are liberated in a way, free from considering consequences, and you can do a lot more fun wild things; the disadvantage is you will wind up doing a lot of things that cause you trouble and pain, and of course you risk a small chance of very bad things like injury or jail. Finding a good balance here is almost impossible, because once you start considering what the right balance is, you've fallen into the careful/thoughtful camp. Of course, what many people do is behave very carefully most of the time, and then get themselves drunk to free themselves from that thought and allow themselves to be impulsive. This is of course very silly - if impulsiveness is good and fun, then it's good all the time, and you should do it when sober too.
The other thing I've been thinking about a lot is the way very small differences in the way you weight various outcomes in decision making lead to very large differences in behavior. Let's imagine you're making decisions as I described previously, by considering the choices and generating an EV based on your perceptual rating of the value of the various outcomes. If we were all perfectly smart, we would still make different choices, because the way we rate the outcomes is different. As a simple example, you have people who generally find confrontation to be very unpleasant. So, any outcome involving confrontation they would rate very negative, and that biases their whole decision making to avoid those situations. Every normal person enjoys good times and doesn't like bad times, but even small differences in how you rate them lead to very large behavior variation. For example, someone might really enjoy the good times (as opposed to neutral times), and not care too much about bad times - this person is more likely to make decisions that have a chance of going very good or very bad, such as running off to Vegas with a stranger; someone else might not rate the good times very high, but rate the bad times very low - this person will have totally different behavior, making decisions based primarily on avoiding the bad times, so they're more likely to just stay home all the time and watch TV.
12-16-04Every day in life, with almost every action, I consider mathematical optimization of the outcomes. Of course mathematics is the basis of everything - math is just abstract expression and formalism for dealing with things. The most obvious cases are if you're making decisions about investing - how do you maximize your return? But that's even getting complicated, because in life your overall goal is maximizing your happiness (with uneven weighting factors - eg. it's not a pure EV, but more on that later). Of course you can optimize with things like route planning on your drive to work; if you turn one way or another, what's the expected time? You have to consider the probability of hitting red lights, the probability of hitting traffic; eg. one path might take roughly 15 minutes always, another way might be 10 minutes 75% of the time, but it crosses a train track, so it takes 30 minutes 25% of the time, so the average time there is also 15 minutes. But now we also remember that our overall goal is optimizing happiness, and that's not a straight weight. Let's say the 15 minute path is the baseline, so that's the 0 happiness point. If you go the other way and get a 10 minute trip, that might be a +1 happiness score (that sets the scaling factor). If you go that way and hit traffic and get a 30 minute trip, that might give you a -5 happiness (the value here depends on your exact personality - how much do you enjoy being in your car? how angry does traffic make you? how much do you need those 15 minutes on that day?). One thing I always think about is the idea of pipelining, latency, parallelization. These are software optimization ideas, but anyone who's good at time management (like a chef) thinks about them. Let's say I want to make a meal - how long will it take? Well, if I have lots of people to help, then the limitting factor is the longest serial path - eg. any things that can be done simultaneously without dependencies, I split out to a lot of people (of course then there's also the overhead of the splitting and bringing back together). Even the longest serial path may have long steps that are low bandwidth (eg. not much work) but high latency (won't be done for a long time), like waiting for something to bake. During that time I can divert my processor (myself) to other tasks without slowing down the longest serial path. This stuff is all sort of very obvious, but hardly anyone thinks about these things and uses them in their daily life. When I wake up in the morning - I need to get to work as quickly as possible and still do some things. First I start the water boiling, then that has long latency, so I prep everything for the coffee, get my toast out (but don't push it down), by that time the water has boiled so I start dripping the coffee; while it's dripping I can usually run around and get my brief case together and ready to go, then push down the toast (again, latency) so it will finish about the same time as the coffee; start sipping the coffee and check the morning emails (I turned on the computer earlier so it would be all ready to go when I'm ready for it); deal with the mails, then hop over to the shower, turn it on so it starts warming (more latency), and while that's going assemble my clothes and put the brief case next to them; hop in the shower, throw on the clothes and run out the door. How can you be in a rush and yet sit around and wait for long latency operations to finish? There are two things that makes all this optimization even more interesting in real life. First of all, there's the non-even weighting. The exact rating of various possibilities depends on your personality. For example, let's say you have one job offer for $100k/year. You have another job offer for $300k/year, but it's all in stock options, so there's a 50% chance the company goes under and it's worth nothing. Now, in the second case, your EV is $150k/year, so with straight rating, that's the obvious choice. For most people, the first choice is better, because the rating for income is very uneven - eg. for most people it's very important to make at least $30k , then pretty important to make $50k, then each dollar after that is less important - eg. it's something like a log scale. However, if you don't mind being broke, then maybe the second choice is right for you. The other thing that really makes this optimization interesting in real life is that the process of doing the optimization is part of your life, and your overall goal is to maximize your happiness. For example, things like picking up pennies are generally bad for you financially if you make much money at all (the time spent is not worth the money made), but if you enjoy picking up pennies, then by all means, do it. If you really don't enjoy thinking about optimization, then it may be optimal for you to make poor decisions in an absolute sense, because you improve your happiness by not thinking about the decisions. For me personally, I usually enjoy doing correct optimization, but I like to be able to do things like go out on the town and just not think about it. Note that this is seperate from counting your contemplation time as part of the optimization problem - eg. you could just buy a video card at best buy for $300 , or you could probably find it online for $200 , but the time wasted searching for the best deal and going through the ordering, etc. is not worth the savings (or even if it's still a win, it's a much smaller win that it seems on paper). That's just part of what you should consider when optimizing, and actually if you consider that and decide not to do further contemplation, you have in fact optimized.
12-15-04Finally watched "Wag the Dog" last night. Kind of a crappy movie; DeNiro is really a rather bad actor, and Anne Heche is horrendous. As political satire, it's rather thin. The "dirty tricks" that they use to cover up the sex scandal are really very tame in comparison to the real things done by Nixon's crew, and more recently by Rove et.al. Sort of as a funny historical side bar - you remember when Clinton was in the shit over the whole Lewinski thing, and he ordered those missile strikes at a supposed "Al Qaeda" weapons lab in Africa? At the time no one knew anything about Al Qaeda, and many people accused Clinton of trying a "Wag the Dog" distraction technique. Turns out, Clinton was actually pursuing legitimate and important terrorism deterence, which our wise Bush derided and stopped doing when he took office. Anyhoo, one thing really bugged me in Wag the Dog - that stupid quote at the beginning. It's something like - "Why does a dog wag it's tail? Because it's smarter. If the tail were smarter, the tail would wag the dog". Wow, aside from being trite and pedantic, that's just wrong. The dog wags the tail because it's bigger, brains have nothing to do with it. The side that's bigger and stronger always controls the side that's smaller and weaker.
12-09-04I find myself more and more boring every day. I say things that are pretty reasonable, and reasonable things are bland. It's much more fun to say things that are extreme, ridiculous, not true, but controversial. I used to say offensive extreme things, that I basically believe to be true - like Republicans are corrupt, cheap people are fools, the Bible is fiction, etc. etc. Now, I find that lots of people that I really like would be offended by those comments, so I don't make them. I used to think that if you were dumb enough to be offended by something stupid like that, then fuck you; now I know that good people are rare, and they usually have many flaws, and driving them away does no good. So, I find myself unable to say anything interesting. I'm also crippled by having thought about almost every subject extensively; I don't mean to brag, it's just that I spend every waking moment in thought on all sorts of subjects, so almost anything that someone says to me, I've already thought of. It makes it really tough to have a conversation with someone. Of course, in those cases that I meet someone who's really done some deep thinking on issues that I haven't mastered, like at Game-Tech recently, I crave their wisdom, I want to drink deeply from the fountain of their thoughts, like a man who's been lost in the desert these many months.
Being a geek is really stupid. Did you hang out with other geeks in high school, play computer games and D&D ? Yeah, maybe we went to good colleges, maybe we have good jobs now, are we happy? We like to pretend we're so smart and superior to the "jocks", but they were out there living life, having fun - the whole point of life is to maximize your total enjoyment - we have failed miserably. Being a geek is really dumb.
12-07-04Another process note about code development - we try to keep everyone in the company basically on the main line in perforce at all times. Letting people go off on branches (or even just not sync for a while), or hold modified files open - all of these have caused us huge problems, because someone will report a problem, and you don't know if that problem is something weird on their box or a real problem on the main line. We also try to make everyone in content wipe their xbox and sync to perforce daily. Before we did these we would have tons of problems where someone would report a bug, we'd have to go investigate it - and hey, they just didn't sync, or they had a bunch of files open for edit, etc.
Coders have a bad habit of holding big change lists open as work in progress for a long time. I try to kill that - check it in, or revert it. Either it goes in the main line or it doesn't belong on your system. We also try to get people to check in often - once a feature is working or crash-free, check it in, even if it's not done, then keep checking in the little improvements. Also, we fire builds after each check-in. If there are problems, I want to find them right away, not the next day when everyone syncs. As always, the goal is to isolate the problem - if one guy checks in, fires a build, uh-oh, it failed, he can fix it real quick before too many coders sync to the broken build. Another little thing that helps here is whenever you are adding files or changing the project, go ahead and add empty files to p4 and put them in the project, and check that in so the project changes are done. Then check the files back out and work on them just as edits.
12-07-04I enjoy something about getting in shape the old school way - pushups, pullups, situps, running, medecine balls, running through tires. Avoid the gym, avoid pilates and yoga and machines, all that fru-fru crap, just go sweat and move your own body around.
12-06-04I basically never blame the development team for their failures or mistakes. If a team was not directed to do the right thing, how can you blame them for doing the wrong thing? If there were not policies and procedures in place for smooth execution, how can you expect them to work smoothly? 99% of these breakdowns are from management and leads - if there isn't good direction and procedure, it IS their fault. Yes, it would be nice if the team members would take care of their shit even if they're not directed to, but that's above and beyond the call of duty - yes, it makes my life much easier when guys take care of themselves, but I don't expect that. Sure, sometimes people are told to do the right thing and still don't do it, but even then that's often management's fault, because they're pulled in different directions by different people, they're distracted, etc.
12-06-04I don't believe that good people do bad things. I believe bad people do bad things. Also, I don't believe that difficult circumstances are an excuse for bad behavior. Difficult circumstances are the test that reveal your true character. Anybody can be nice when everything's going well, it's when the shit hits the fan that you need to step up. Now, I don't expect everyone to be perfect all the time - it's about how the handle the shit. Certainly I have plenty of weaknesses myself; when I'm stressed I get very snippy and rude, sometimes I just can't handle a situation and I run away from it. Those behaviors suck, but I also try to get a hold of myself and go back to it and apologize after the fact. If the shit hits the fan, and you turn on the people who are trying to help you - that I can never forgive; if, in the moment of trial, you abandon your friends and screw your neighbor and save yourself, you are a bad person and I want nothing to do with you.
12-06-04A couple of followups on my talk at game-tech :
First and mainly, I think I made a mistake in presenting the reason for robustness and decoupling. Robustness is the idea that the game never goes down, even with horribly broken use, and decoupling is the idea that when someone horribly breaks one system, the other systems keep running so people can still work. These are not just important for small teams or with junior people, they're always important. We acheive these things primarily by making the engine and code resilient to even fatal errors. There are other ways to meet these goals, namely Branches (source-control branches, so people work in isolation until their work is stable, then they merge to the main tree), and Build Escrow (in which the coder's build first goes through test approval before going to the content team). Branches and Build Escrow are both good, but they only work once the game is reasonably well established. We were building the code base from scratch, and rapidly iterating on design trying to hit milestones and demos, so it was frequently important to be able to code up a feature in the morning, deliver it to design and have it done by evening. For larger teams, the ideas of robustness and decoupling are even more important. This is part of the idea of overall team productivity. If a programmer takes the time to make his code extra safe, maybe it takes him 5% or 10% more time. If he does not, and he checks in code that breaks the build for the entire company, he's costing 100% of the work of maybe 50 other people. That's a catastrophic loss of productivity, even if it only happens once every hundred days it's a disaster. Most games these days are "design limitted", that is, the things that really prevent you from shipping a great game on time are in design, so it's silly to save coder time and potentially cost a lot of designer time.
What are the disadvantages of a clean self-protecting C++ coding style? Well, the compile times are slightly slonger, but our build is around 10 minutes and Halo 2's is around 7 minutes, so the difference is not very big. Also, that has more to do with arranging your headers well, we're currently sloppy about that, we could do much better to hide implementations. Having more clean separation of modules and opaque interfaces around whole systems would help that immensely. A related problem is that things like smart pointers and classes used in scopes forces you to put some things in the headers; you can't have a pure C-style hidden interface without doing a lot of work with pimpls and such. A lot of people think it takes too much time to code this way - that's just not the case; once you get used to it, the additional time needed is totally negligible, and is more than made up for with the time savings of having nice templates and classes that automate so many operations for you. The only two real disadvantages that I know of are - 1) when you hire new people, you have to teach them your base classes and your system; our system forms a sort of meta-language on top of C++, which is mostly enforced through compiler errors, but there are some things that you just have to know to do; 2) the protections seem to make people lazy, both in code and content; the protections are supposed to be in addition to proper testing and good algorithms, etc, not instead of them.
A little thing - the hierarchical allocation parser can obviously be used on things other than memory size; you can do it on allocation count, you can do it on CPU usage, vert count, etc. It's a nice way to track anything and figure out where it's coming from. This is especially nice with a "long frame tracker". To do the long frame tracking, you just run the tracking stats every frame, and you reset them to zero between frames. Then, as soon as you see a frame that you consider long, eg. longer than 1/20th of a second for example, you log the stats for that frame.
12-04-04I was just away at the Game Tech conference, giving a talk on OSW. It was really interesting to see the talks on Halo 2 and Half-Life 2, mainly to see that they really aren't do anything we aren't. I look up to those games immensely, and I always imagine in the back of my head that maybe they have some amazing technology or process or something that is helping them be so superior. In fact, their tech/engine process is very similar to ours and the goals are mostly pretty similar, though there are some differences in philosophy. Mainly we at OW just can't trust anyone on the team to do things right if left to their own devices - we have to enforce a lot of structure and rules through the code, whereas Valve and Bungie can be more flexible, because they have the process and responsibility in other departments that makes that possible. The biggest differences between OW and those two H2's are - A) their teams are huge, and B) they have good process outside of code. We at OW have a big company - almost 50 people - but we only have about 20 in game production (!!), whereas Valve and Bungie both have over 50 people in actual production (and a fraction of the admin staff!). Also, it's not like the H2's are really these ivory towers - their tools still have a lot of problems; in Halo 2's case, they were way behind schedule and the game suffered badly, mainly due to game design, in HL2's case, they just took a really long time. Both of them really managed to make great games I think because the core direction was good - eg. the base mechanics are identical to the previous games, so everyone on the team knows how to do that and agrees on it, and then the core philosophy of game design was good - for HL2, it's fully interactive, immersive, for Halo 2, it's systems-based gameplay, etc. Compare that to us where our direction didn't really crystallize until a few months before shipping.
I had to come back from the talk a bit early because we're trying to go gold here (maybe today!). We had four crash bugs when I got back (!!). Only one of them was found by the lovely EA test, and three of them were found by us internally, despite the fact that we have basically no internal test department at all. Lovely. The four crashes were - 1) XACT seems to have a bug with auto release cues and a bad linked list walk, 2) we had a resource registration bug in our code that caused a null deref in a very rare case (only on the DVD build), 3) one crash in the granny "UUU" department, 4) another crash in granny, again UUU/paging related. Amazingly, we fixed them all in like one hour. The UUU bugs in particular have been with us for a long time, and we never had a repro, and in fact I thought maybe they were fixed, but suddenly they came back. In fact, the previous fix I thought I'd done was a total red herring. When I did the fix, I also put in lots of catching to detect if the error happened again. It turns out that my check/catch code was being hit, and the damn content team was seeing those errors reported and skipping past them without telling us or sending us the logs. This has been going on for months, so we could have easily fixed this bug long ago. In general, our whole company and content departments are extremely unaware of how their behavior affects us. In code, we have to start first and crunch hard to get the engine and tools going; then we all work hard, and the content guys slip and slip and finish way late, and then we in code have to continue crunching to finish up. We try to make the code super robust so they can work, we try to put in error checking to help them and to help us find errors and fix them early so we don't wind up with crash bugs at the last minute. It's extremely bad to be making these fixes so late - we've had weeks of test, and we're making these fixes now, so all that testing has not tested these fixes. Also, our producers at OW and EA have become totally irresponsible. They're obviously sick of working on the game and with each other, they just want to kick the game to manufacturing, they don't really care if it's tested right; we make these fixes, they just want to play through it once, call it good and send it out. So, anyhoo, we found these UUU crashes which were tricky little buggers - we've known there was a problem for months and could never find it. I think it was just having those couple of days away at Game-Tech that made it possible. When you work 6 or 7 days a week for months, your brain just gets fried, you can't think straight. Game-Tech was intense, but it was still a break from coding, so I came back with a bit of a clear mind and was able to see the problem. Getting that time away is so valuable for intellectual labor, it's hard to quantify what a productivity boost you get.
11-21-04I was telling Andy yesterday the sky renderer I really wanted to do for Stranger's Wrath - scrolling cloud layers like we have now, but make them normal maps (currently they're A8 alpha-only to save space), and do a shader that colors them by normal and where they are on the sky, so you can get things like sunset effects where the clouds are purple on one side, then dark overhead, then get red as they go in front of the sun; as they pass in front of the sun, the clouds should pick up glare and get written into the glare buffer for bloom filtering.
11-20-04The Stranger's Wrath code is possibly the most stable and robust game code base ever; certainly it's by far the most stable I've ever seen. On the entire project, we've only had two persistent nasty crash bugs - one was from Granny (a licensed library), and another is from XACT (the XBox audio library). Both of those libraries fail to follow our guidelines of being self-checking, input-validating, etc. For example, XACT will simply crash any time you play sounds with an index out of bounds, which can happen easily due to people have different revisions of the content. It's been extremely important for us to have this level of stability. We are able to take the development build and deliver it as a fully stable milestone in about 1 days' notice. Generally the bad bugs we have to fix are "stop playthrough" bugs, not crash bugs, and quite often the "stop playthrough" is just a design issue, that eg. this door doesn't open so you can't move on. We had to deliver numerous demos to publishers, to MS, to EA, to press, and it was all reasonably easy because we could go from full development to a stable build so quickly. In fact, it encouraged some practices I wasn't too fond of - the design team would frequently work on demos until the day before delivery, so we only got one day of content lock to test & fix code. In the past I've always wanted closer to a week of content lock to make sure we get a stable build.
I would discourage all programmers from relying on repro for bugs. I don't use repros unless it's a strange bug or needs a specific case to test, etc. Generally I try to fix bugs just by looking at the code. When someone describes a bug to me, I think of where in the code that problem could be caused, then I simply go and look at that part of the code. You can look at that code and see how it might break, and 99% of the time you can spot the bug just by looking and making sure it's robust. Even if you don't spot the bug, if you have a good idea where it is, you just add some more asserts and self-checks and logs in that part of the code, and hopefully those will trip in the future and give you more information, and they can stay there to make sure the code seems strong. Another thing that I emphasize is to look at how the bug happened and try to prevent that from happening in the future. Look at the buggy code - how did that get in? Was it reviewed? Did both people involved actually understand that bit of code? Did they talk to the original author? Did they test it? Did they have good asserts checking the code? I try to not only fix the bug, but also fix the behavior that made the bug. Sure, sometimes you just have mistakes that make bugs and everyone was doing the right thing, but that's actually rare compared to bugs made from someone trying to be too fast or sloppy (often me). Repro is sort of a crutch for bugs. I don't like to fix the code for one specific repro case - I like to make the code bulletproof for all possible break cases.
It's funny to me that we (Oddworld) and Bungie use the absolute opposite coding styles, and yet the result is extremely similar. We use heavy C++, dynamic allocation, multiple inheritance, STL. They use almost straight C, macros, function pointers instead of inheritance, no dynamic allocation at all, etc. In the end, we both push the XBox very hard, running the GPU to the limit, using all the 64 megs of RAM to the fullest. I know they don't believe that we use the hardware or memory optimally (in reality, we do stall on L2 cache misses because of our polymorphism, but that's maybe 3% of CPU time lost), and we don't believe they can possibly develop rapidly and robustly, but probably we're both wrong. However, our situations are very different, and I can't imagine their style would work here. We've had to hack in crazy new features on a daily basis; if I want to make some types of objects support some new interface, I can just define that interface and dynamic_cast to it at the query point; I don't have to push my crazy feature up to the base class.
11-20-04The testing we've gotten from EA has been really terrible. We've not gotten a single decent focus test or play test from them. When we ask them for play test feedback, they have some exec assigned to the project play the game and send us notes. Uh, thanks, but no thanks - have you guys ever made a video game before? Have you ever heard of getting people in the target demographic to play the game, maybe tape video of them? Of course, Oddworld also failed to do it themselves. So, we're left with our own play-throughs to tweak the game. I think we've done a decent job, but it's hard to tell, because we're also so jilted from playing the game for the last 3 years, there might be really major flaws that a new eye would perceive that we don't see. Our bug test has been pretty poor too; I don't know what the deal is, but the testers seem really junior. They enter bugs without decent repro steps; when we question them about it repeatedly, they wind up completely changing the repro steps and describing a totally other bug. They also have failed to find all sorts of major bugs, which we had to find and enter ourselves. In fact, here we are a few days from Beta, and we're still finding major bugs in house and they're not finding much of anything significant. I don't know if EA test sucks in general, or if we've just been given the "C team" because we're not one of EA's darlings at the moment.
11-17-04In the development of Stranger's Wrath, we had various people on the team who really wanted to make a shooter, so they tried to push that on the game, we had people who wanted to make an RPG, so they pushed that on the game. We had basically no one actually looking at the cool strong unique elements of the game and trying to make them richer. Probably the strongest unique element in the game is the 3rd person fast run and ramming. It wound up being not really a major element because it wasn't played up. Things that would have jazzed it up - hold a button to lower your head which prevents you from turning but makes your ram blow guys to pieces; the ram should create fear in guys who see it coming - some just panic and stand still, others dive out of the way, etc; make your 1st person weapons more complementary to ramming, eg. a freeze shot, a slow-down shot, etc.; make other ramming and anti-ramming enemies, like a Matador boss who side-steps you, other enemies that are very fast and ram, like a goat-demon.
Some really cool scenarious with the fast run & ram might have been: a chase - some giant guy that you can't kill chases after you; you just have to run away, ala the big rock in Raiders of the Lost Ark; chasing down enemies who are fleeing (we did get some of this) or a carriage hijacking or something - in a big level, a carriage is speeding away with the outlaw boss in it, you have to run up along side it, while his goons on top shoot at you; you can ram it and bump it, you have to get up to speed with it and try to jump in. In general, the enemy could've had fast vehicle you have to run along side of.
Often when I suggest ideas, the designers say "I didn't think that was possible in the engine". Well, it probably isn't, but it easily could have been. Engine features are made based on what's needed for the game. The design has to be done (considering the schedule) based on what will work, not what does work.
11-16-04We were originally scheduled to ship about a year before we actually are. There's certainly no good reason why we didn't make that date, but various things came up, like having to make demos and sign a new publisher, and the fact that we had no game design or designers for the whole first year of dev. Oh well, minor issues. Anyway, shipping at the wrong date really screws up development. If I had known our actual ship date, we would have done things very differently - better renderer (with dynamic lighting), better physics (maybe a real licensed physics engine), better tools, better animation system & pipeline, etc. - all those things were cut to make the original ship date. For the whole last half of development (18 months) we were in the mode of "we have to ship in two months", and that deadline was continually moved back. Well, if you only have two months to go, you have to be in feature freeze, so we had lots of problems with pipeline, etc. that we couldn't fix. The result was that everyone was working less efficiently than they needed to. When you know your real schedule you can do proper planning - heavy tools work in the first 25%, finish the engine by the next 25%, finish the features in the next 25%, and polish in the last 25%.
11-16-04I would have loved to have taken the "Live Ammo" concept to the extreme - everything in the "Stranger's Wrath" universe could be alive. There are some famous scifi artists who do this, I forget their names. Anyhoo, the cars are animals, tanks are turtles (for their armor, of course), instead of a boat you ride like a loch ness monster, your crossbow is a living creature, everything is wet and soft and shiny and slithering and alive. The live ammo could talk to you all the time, run around on your body, steer through the air, etc.
11-16-04I hate "Just Too Late" algorithms on a deep moral level. The so-called "Just in Time" compiling is really JTL. If it was really JIT, it would be ready to go when I need it. Instead, I ask the app to run, and then I have to wait while JIT does its thing, then I get to go. That's sort of like if you asked a nurse in an operating room for a scalpel, and she goes, "oh, I've got it just in time, let me go get it from the supply cabinet" - No! That's Just Too Late! It looks to me like Halo 2's paging is JTL. Resources request residency when they are used, which means they don't actually become resident until after they're needed. The worst case for this kind of thing is when the camera is jumping all over the places, the resources you need keep changing, and the paging can never catch up with what's actually needed. We try to do all our paging with a true "JIT" system, which means they become resident just in time before they are needed, so the user never actually sees them non-resident. To do this you need good foreknowledge of what will be needed, which is generally pretty easy in gameplay because the user can only run around coherently - you can't teleport to arbitrary random spots, so I know what's near you and what direction you're going and I can anticipate the needed resources. In cinematics it's really easy, because the whole thing is hard-coded, you can compute exactly what's needed at what time and store a timeline track of when things should page in and out.
11-15-04"Oddworld : Stranger's Wrath" stories - we have great big seamless levels. The state of the whole world is persistent, so if you drop a coin somewhere in the game, then play for hours and go back to it, the coin is still there. In the shipping game, the levels are pretty linear. We imagined them as being more like an RPG, with exploration, and big wild spaces, spawning persistent enemies you could kill for money and resources. We have towns, but we imagined big towns like hubs for the levels. You could stock up in town, talk to people, then go out on missions, go back to town and stock up, finish the mission, etc. We still have some of that, but not much.
We have various different character types and races. In the shipping game, they basically never mix. We originally planned on mixing them, and wrote most of the code for that. Part of the original vision was a sort of play of the races and their interaction - like, you have the oppressed races and their oppressors, you have rednecks and city folk, and they sort of interact and mix and talk to each other and you can interact with them and manipulate their reactions, etc. Most of the races are in the shipping game, and they have their character and whatnot, but they don't interact.
With a lot of features we had a sort of chicken/egg problem. We'd sort of do a feature, like supporting moving collision and animated objects. I always imagined levels where there were giant gears and pistons and you could run around on them - avoid getting smashed yourself, and knock your enemies into getting smashed. Nobody ever implemented anything like this and there was no call from design to improve the "moving collision" code, so we didn't work on it. The result was the code is rather sketchy and unpolished, because it just wasn't a priority. The design guys tend to try to use what works and exists, so they never used moving collision much. This is why coherent direction and cross-department vision is so important, you need someone in design who knows what's useful and what's not, and you need someone in code who knows what can be done and what can't, and they need to get together and agree; then the game needs to be designed based on the features that will exist, not the features that do exist.
Everything takes us 5X longer than most game devs, because every feature has to be extremely polished. A game like GTA:SA could never be done here - their controls suck, it glitches like crazy, but they have tons of features. We would take one of their features and spend years tweaking and polishing it. Obviously GTA:SA is very successful, but I find it intolerable to play. I think the optimal game dev model is somewhere in between, but much closer to GTA. Basically polish doesn't matter much except on the player controls. The game should be responsive and solid so far as controls are concerned, but if it looks like crap, glitches, pops, the animations are terrible, no one cares (well, the average consumer doesn't care), and it's a waste of dev time. In a way, that makes me sad, because I have a very high quality standard and like to work on solid product, but it just doesn't pay in the marketplace.
11-15-04"Oddworld : Stranger's Wrath" is almost done. I think it's a very good game. Not nearly as good as it could have been, not as good as Halo 2 or Half Life 2 (probably, we'll see), and of course we're just talking about the single player, they have great multiplayer and we have none, but still one of the better single player experiences in the last year. Our lovely friends at EA are doing almost zero marketting for us, so I thought I'd do some here -
Clearly the semi-innovative thing about it is the 1st to 3rd person gameplay. This is the first game I know of that has a really fully functional 1st person shooter and a 3rd person platformer/melee/driving put together, and quite seamless and smooth where you can switch back & forth and it feels good and natural. You actually switch in combat to do various moves, unlike some games where you move in 3rd and snipe in 1st, etc. The 1st and 3rd are also actually different, it's not like Heretic or Everquest or something where you can use either view, but the 3rd person is really just 1st person on a stick behind the axis of rotation.
In 1st person, the game is basically a shooter, but the weapons are a bit quirky. Many of the weapons are not basic damage weapons, they're tools for manipulating the enemies, and you can combine them in sequences for "combos". One of the basic combos is just to freeze a guy with bees so you can lay a thudslug or boombat on him. Another common one is to skunk a mob then drop a boombat in the middle of them. There are also lots of environmental traps that you can make use of; there's lots of knocking guys through glass to their death, things like that.
In 3rd person, the game is like a platformer/adventure/driving/melee game. Here, you are fast, very fast, and control sort of like a car or motorcycle (actually the controls morph from standard walking at low speed to more like a car at high speed). You can ram and meelee. One move few people know is that if you jump before you ram a guy, you keep your velocity and go through him - very useful.
One of my favorite things about the game is the twist. I won't give it away (we've asked all the press to keep it a secret), but part way through, there's a big story twist. That's pretty standard in movies and games, but there's a difference - the play actually changes a lot as well. Unlike most games where you get a story twist, or play as the enemy, and the gameplay is basically identical, here the whole feel of the gameplay changes a lot, the pacing changes. It's a cinematic thing, there's a shift and suddenly the feel is different for the 3rd act building to the climax. In the beginning, you're a bounty hunter, in the end?
11-14-04Halo 2's first level (tutorial) is pretty horrible. It's ugly, the play is nothing that wasn't in Halo 1, it really doesn't sell the game. After that, the game gets much better. This is such a huge and common mistake - for them, it's okay because they have such hype they don't need to sell new players, and people will get past the beginning. For most games, like mine, if the first level is bad, no one will play farther. I think our tutorial now is actually pretty good so far as tutorials go. It's not as good as Sly Cooper or Halo 1, which both do the right thing - put you straight into gameplay, and introduce the controls gradually over the duration of the first gameplay level, as you need them.
Halo 2 actually reminds me a lot of "Colony Wars". That was a great game! Great music, story, voice acting, and beautiful graphics.
11-14-04Wow, Halo 2 is really good. This is the first video game I've played till 3 AM in a long time. The first level looks like shit, but after that the graphics are mostly beautiful. Sometimes the shaders and lighting are just fantastic; I wouldn't say they were super realistic, but they're very beautiful. The gameplay is rather monotonous, it is pretty much the same thing the whole time - take cover, shoot, reload, repeat. The vehicles are ok, but I hate the way they do the controls like a 1st person cam; I'd rather have cars that drive like cars, not like strafing people. The flying vehicles really feel bad/weird to me with those darn controls. The cinematics are amazing; the graphical quality in the cines is awesome (if you ignore the horrible LOD and paging pops!); the basic renderer doesn't impress me as much as all the custom anims and effects and fancy background and matte work that they did for the cines. In general the level design is very good and the integration of the story and the levels is very smooth, coherent, solid.
11-13-04I saw a tiny bit of that history of Video Games thing on PBS; I think maybe it's old, but it was ok. In one bit, Jason Rubin is talking about why video games are great. He says something like - "In real life, I'll never be on a pro sports team, I'll never be able to drive a Formula 1 car, but with video games I can do those things, and that's what makes video games great" (he chooses not to say "in real life, I'll never get the pleasure of running around with a machine gun and spraying bullets into other mens' heads"). Anyway, that's all well and good, but I find it incredibly boring and sad. I don't want video games that let me do things other humans do - I want video games that let me do things no man has ever done! Let me drive a car 1000 miles an hour through the cities of the moon, then take a swim in the oceans of mercury (the metal, not the planet), let me grow enormous and consume the stars, or grow small and fight bacteria. I'm sick of all this real world sim shit.
11-10-04I think one of the big mistakes people in game dev make is they put their best programmers on core engine technology, like rendering or networking, etc. Yes, that stuff is important, but once it's reasonably good, the user can't really feel the difference between good and great renderer programming. On the other hand, things like controls, camera, motion, input, latency, animation, these things provide direct feedback to the play experience, and even small improvements can make a big difference in the sensation of quality. Those are the things that really make a game feel polished and good, that make it like a Nintendo or Naughty Dog game - clean, responsive, pleasant to interface with.
Engine coding is fun because the technology is challenging, the algorithms are interesting. It's frustrating because an engine in itself doesn't show up on the screen - you need people to use it well, which rarely happens. Gameplay coding is fun because you can do features all alone and get cool results in the actual game. Gameplay coding is frustrating because you do 3 features that are cut for every 1 that's used, and you have to spend tons of time polishing silly little features and eventualities that the player will never notice.
11-9-04Halo 2 is out; I haven't seen it yet, but I see Halo 2 as sort a quiet insult to us game developers. Any game company that's half competent should be able to make Halo 2. This is not intended as an insult to Bungie, I have much respect for them, they're one of the best studios around, but basically Halo 2 is not very innovative in terms of gameplay or technology. Sure, some of their tech is fancy, but not in a way that's really important to the quality of the game. Yes, the gameplay is well polished, but it's just a shooter, they don't do anything that hasn't been done many times before. And yet, it's one of the best games of the year, and almost no other game company could make a game as good. This isn't so much because Halo 2 is so good - Halo 2 is the level of quality any game could be - it's because all other games are so *bad*. Bungie gets their priorities right - improve the things that will make the experience better (the networking, the match-making, the basic controls), and not other things. They make time for actual focus ("usability") testing, which almost no other game dev does. On the other hand, I'm not sure how they do it, because all the stories I've heard about development at Bungie sound just as F'ed up as anywhere else - stories of ridiculous gameplay features that they try that don't make it into the shipping game, stories of going off on pointless tangents, only to scramble back to your core gameplay (cut levels) at the last minute and kick out a game.
11-8-04I used to hate Tony Dungy when he was coach of the Bucs. He's kind of a quiet guy, and I hate quiet coaches; I like in-your-face, yelling, angry coaches, like Bill Cowher and Bill Parcells. But, these days, I have lots of respect for Tony. He went into Indianapolis, and he saw the talent he had there, and he didn't force his style of football on them, he went with what the team had to offer. The worst coaches are the ones who bring a "system" and try to put it in place regardless of the team they have. The best coaches look at their talent and devise a way to win with those people. Tony Dungy went from a defense-first, no-score team, to a super scoring team with no defense, and I respect that.
11-8-04Businesses are all shit-sucking scamming bastards. Sports Illustrated gave me a free subscription, and now they're using semi-illegal schemes to make it hard for me to cancel, by making it difficult and time-consuming. The fucking city of SLO gave me the most ridiculous parking ticket ever for crossing the lines in parking spot (at the end of a row, when other cars were already shifted) - the ticket was for $30, it was upheld on appeal, and now to fight it further I have to pay a court processing fee of $25. My damn bank charges me $3 for an ATM withdrawal from any other bank, even though it's free for them.
11-8-04I'm doing my damndest to ensure that all the little horrible things are right in our game - the load times are quick, the GUI's are ergonomic, the frame rate is solid, the latency is low, the game is responsive and nice to the user. These are some of the most important things in games, but producers will never give you time to work on them, and directors & publishers will happilly sacrifice them in exchange for some unneeded feature.
Non-skippable cinematics are just an insult to the player. It tells the player "we don't give a damn what you want to do, we're going to force you to sit there and watch this". There's nothing else like it in media - if I watch TV, I can change the channel - can you imagine a show that prevented you from changing the channel away? I would never watch that show. Can you imagine a DVD that turns off your skip and fast-forward? It's my DVD player, in my house, I'll skip if I want to. (in fact DVD's do have those non-skippable intros which are infuriating). With a book or magazine, you can turn the page any time you want; if the story gets boring, you can jump ahead, but you can also go back if you want. A game is not a movie in a theatre, it's an interactive experience that the user is creating for themselves, they should be allowed to craft that experience for themselves. Now, some people take that too far and ruin the game - the game universe should still have a rule set and logic, and even if people want to do things outside of that, they can't, but they can try (eg. the player might want to drive a future mech tank in your fantasy RPG, don't let them!). You see, that's part of the content, which the game developer should control, the user should be in control of the medium, the mechanism for viewing the content.
11-7-04One of the basic important things in management is to correctly identify the people who are doing well and those who are not. If management goes around praising people who are actually doing a bad job, and chastizing those who are really doing the work, that not only pisses off the people who are doing the work, it creates a bad atmosphere for the entire team - they see that good work is not rewarded. Usually when this happens, the people who are incorrectly rewarded are friends of management, or charismatic, or liars who take credit for others' work, etc.
11-7-04It would be fun to work on a 3d engine that's all physically accurate lighting. So far as I know, such a thing has never been done, and is even rarely done in pre-rendered CG. We still can't do realtime radiosity, so we have to hack the rendering equation in various ways. One thing we can simulate quite well now is a semi-static environment, where the radiosity effects are precomputed in various ways and the direct lighting effects are evaluated in real time in various ways. The main flaws with these approaches are that the dynamic objects don't interact with the render equation well, eg. they don't contribute to the radiosity solution correctly, and the less static the world is, the less correct the lighting can be. The biggest thing for physically accurate lighting in 3d hardware is floating point buffers; this lets you capture the massive differences in brightness between lit and unlit areas. You of course then need an exposure function to simulate the aperture of the eye or a camera.
11-7-04A good director should be able to see the game with the eyes of someone who's never seen it before. Often there's some major feature or character which it seems horrible to cut - but that's just because we've been through the development of that thing, and it seems important to us; if someone saw the game and never knew that thing was supposed to be there, they would have no idea something was missing. It's such a simple point, but everyone gets it wrong; the game should not be directed based on what you the developer think would be cool, but by what a typical player who didn't make the game would feel was missing or would actually perceive as improving the game.
11-7-04The parable of the painter. There once was a painter; he wanted to do great masterworks of oil, but he struggled in that world, and took to painting houses. Still, he strove to be the greatest house painter that ever was. He saw the other house painters - using spray guns and cheap paint, and he thought their work denigrated the art of house painting. And so, he tried to prove himself on every job. He would go into the house, survey it, but the houses were never right - too old, the walls too small, the materials too cheap - what sort of canvas was that for his work? With many complaints, he would get to work. The painter would carefully remove all the furniture, strip the old paint, usually he would find some bad plaster and tear it out and replace it - perhaps the ridge of a stud was poking through, he'd try to smooth it out. Weeks into the job, the home owners would be nagging him, and he would say - if you want quality, this is the time you have to take. So, he would start on the undercoats. He would lay perfect, even white undercoats; usually there would be an imperfection or two, so he'd lay another coat. But by this time the homeowner was always at wits end - "we need our house back!" they'd cry, and tell him to finish in a day or get out. Panic! The painter would work fast, throwing the paint up on the wall any way he could - the special paint that was supposed to mix for three hours - no time for that. When he was done the paint was in goopy smears all over, an uneven ugly job, and he was despondent - "cursed homeowners" he'd think "didn't give me enough time for the job". Finally, despite his many mediocre jobs, the painter found a perfect client (for he had some esteem among the bourgeois, more for his attitude than his work) - "give my house the best paint job anyone has ever seen - and you can have six months to do it". Oh happy day for our painter! He surveyed the house and emptied it, and began to study the walls, taking color samples of the lawn, the roof, the furniture. He ordered special custom paints, and planned. Weeks went by and he planned and re-planned, and finally started to improve the walls - we need spackle here, all this drywall here has to be replaced, there's a leaky pipe here, the mortar in these brings isn't perfect - soon he was tearing up the house improving the walls, trying to make the perfect canvas for his work. Another month went by and the homeowner returned to see the house in shambles - "what are you doing?" he cried, and hired a crew to fix the walls. He threatened to fire the painter, but the painter convinced him "just give me another chance, I'll wrap it up". The painter started on the base coats; he was working along, doing coat after coat, making the perfect even white; he was most of the way through, then he noticed the white at the end wasn't the same as the white at the beginning! He was taking so long, the base coat was discoloring in the air, so each day's work was slightly different. That would never do! He stripped it all off, and started over; this time he applied a first coat to the whole house, then a second coat, then a third, so it was all even. Another month past, and he began the color. He started painting, but after a few days of looking at the color, he realized it wasn't perfect for the house. So, he mixed a new one, ordered it, and had to wait for it to come. He started again with the new one, he was content, working along. Then, one day, he visited a friend and saw his work - he was painting with gold flake, and holographic colors, and everyone was talking about it. Damn! thought the painter - this is a new standard, my work can't compete, I have to be on this level. So he stripped his work again and ordered this new high-tech paint. He began painting with it, but it clumped and ran; he didn't know the technique, and his base coat was the wrong type! But then the homeowner arrived - the six months were up - "show me my amazing home!" he bellowed. The painter was aghast, he stalled the owner and ran to the home and tried to throw the paint on the walls again, but it just made splashes and blobs and a horrible mess, even worse than any of his previous jobs where he didn't have enough time to perfect them. The moral is - parables are stupid.
11-4-04Game difficulty has a form of relativity. If you are in a car looking at another car, and you both keep speeding up, you don't feel fast - you feel like you are still. In our game (Stranger) at the moment, we introduce a new set of harder enemies, and we give the player upgraded weapons at exactly the same time. The result is that the difficulty doesn't change at all, it feels just the same as before. Good games will typically introduce the harder enemies before they give you upgraded ammo. This gives you a chance to perceive that they are harder, to go "whoa, that guy is tough". Then you get more powerful yourself, and difficulty comes back to the sweet spot. RPG's all are built on this principle - you go into a new area, and it's really tough at first, then you start to level up, at some point it probably becomes pretty easy as you are now more powerful, then you go to the next area and the process happens again. The difficulty oscillated up and down across the sweet spot, which gives you the perception of movement, of getting more powerful.
A related note is that for difficulty to remain in the sweet spot (I've been assuming you know about the sweet spot - the spot where it's challenging, but not frustrating, where it takes a little while to beat, but not too long), for difficult to remain in the sweet spot as you play, it must ramp up over the course of the game. The reason is that the player is getting better at the game. If you don't give them harder challenges, they don't really have a chance to experience the fact that they're getting better. Some of the old jumping platforms were really good at this ramp. The later levels would have just felt impossible at first, but if you actually play through the whole game to them, they feel fine.
11-3-04I'm trying not to even think about the election. I want to pretend it didn't happen. My overall feeling is of disgust, not just for Bush and his cronies, but for the people who voted for him. I'm totally disappointed in America. How can you all be so blind? How can you let yourself be lied to and manipulated? This bastard has taken the deaths of Americans on 9/11 and twisted it and lied about it as a way to seize power and do all manner of unbelievable unreasonable things.
11-1-04I hate John Carmack. I've never met the guy, so he might be the nicest guy in the world, but I'd still hate him. He's probably the only video game programmer in the world who can get girls based on his work. He is the only VGP that's interviewed in the major press, he's like a rock star. That would all be okay if he really deserved it now, but I don't see it. Yeah, his early stuff was great, he did the right thing at the right time, and very few people could have gotten real-time 3d going the way he did back in the day. His new stuff, however, is very ordinary; I'd say Quake is the last thing he did that's really special; in fact, since then, he's been trailing the technology and gameplay leaders in most ways. There are quite a few programmers that I'd put in the same class as Carmack, like Butcher and Stelly, probably others. The other thing is that he did get very lucky with Id. If he would have done the Doom engine and had crap artists and crap level designers and crazy gameplay ideas coming from all directions, the game would have sucked, and noone would have remembered it. Maybe he would have still been famous in the VGP community, but not in the world at large. Instead, he got lucky, and got some really talented guys working around him, and they made games back in those days that really defined the genre.
11-1-04Born again Christians really scare me. I respect the ideals of Christianity, and I'm sure there are plenty of evangelical born-again Christians (EBACs) who are good people, but most are not. EBACs are really a fascist belief system . They can justify any action in the name of their belief. They believe any action by another EBAC is good, and any pain caused to non-believers can be rationalized. Independent thought and questioning is discouraged, you should believe. Any sort of hippocracy or personal flaws can be ignored as long as you believe. For an EBAC, belief in Jesus becomes a justification and excuse for any action, and makes them "good" no matter what their actions may be, since the lord forgives all.
11-1-04To all the leads who hurt their company by using plain C (or plain C++) and stay away from language features that would help them -
If you're working in some file, and you need to perform some operation, like say a "partial sort" to take the N highest elements of a set to the front, and you code that up your self - you are just wasting a huge amount of time. Not only are you wasting the time to write it, but the time to debug it, the time for someone else to review it, fix bugs in it, learn it, etc. etc. If you're worried about build times, you can isolate the STL usage into cpp files.
Similarly, not using exceptions is just silly. Exceptions have almost no penalty for use, there's only upside. Even if you don't want to throw your own, catching the hardware exceptions (access violations, float invalid ops) is clearly good. This is what has allowed us to keep the game running almost all the time, even when people check in broken code, which is inevitable. People write buggy code, and if that is allowed to bring down the game, you are wasting massive amounts of time. Once you are doing catches for hardware exceptions, you may as well start throwing as well. Throw reduces errors by forcing the caller to deal with it; ordinary error returns can be easily ignored. Any time that continuing to execute will crash the game, you throw, and the game keeps running - just the broken portion stops working.
The next point is using self-checking classes. Rather than using blind data with structs and pointers and such, you use classes which enforce their own correctness with asserts & exceptions and such. Again, on a large team, this is just clearly a win. Documentation and comments are always ignored; the only way to enforce correct coding is if the code itself screams when you use it wrong.
Once you are using all these self-checking classes, it's hard to avoid templates and containers and such. Perhaps you could, and there's nothing wrong with that, but it's certainly easier.
Garbage collection is similar. GC is clearly good, manually managed pointers are clearly bad. Now, if you have some fancy automatic GC solution that's robust and simple and debugged (such as, maybe you are using Managed C++), ok, fine. If not, smart pointers are a very simple, low-overhead, easy to write & debug way to do GC. This is actually related to all the other points; smart pointers or GC pointers are just examples of types that check & handle themselves and clean themselves up when they go out of scope.
In general, objects that close themselves and clean themselves up are clearly good; forcing the user to do it is always worse. Once you start doing that, use of tight scopes is clearly good. It restricts the lifetimes of variables, which reduces bugs.
Now, I just have no idea how to write software without polymorphism. Even my very first C apps had polymorphism; eg. you have some base type (Object) and many different variants. If you're going to do polymorphism, you should do it in the language. Some home-brew with function pointers and manual casting is just worse, because it's not safe. There are some very rare cases where home-brew could be beneficial, such as very deep in a performance-critical section where you want to avoid the virtual functions, but this is quite rare.
10-27-04One issue I like to think about is "real productivity". That is not just "productivity" in the sense of how much work is getting done per hour, or per dollar, or per 'effort'. Rather, it's productivity *times* how much of that work is actually useful towards the end product. You may have guys slaving away, but not efficiently, so of course their productivity is low. You may also have very productive guys, but they tend to do work that's maybe only 50% needed, so their real productivity is also low.
10-27-04Most game companies work in this ridiculous two-phase style. In the first phase, no one is thinking about shipping, and people spend time on all kinds of silly pointless ideas that never make into the game, or that are just so un-important in the game. In the second phase, they go "oh shit, we need to ship", and then you start cutting all kinds of really important features, or half-assing them. The result is that you wind up with games that have like beautiful explosion fx, but where you can't save anywhere because they never got around to writing the save game feature and had to cut it.
The two-phase style is not just about scheduling and focus. We also see it with oversight. In the first phase, people are just sort of doing tasks and they get checked off the list, and nobody verifies them. The executives and directors and such as paying very little attention to development, which of course is hurting production efficiency. In the second phase, oversight goes crazy, suddenly the directors want to verify every bug fix. This also severely hurts productivity.
10-27-04Part of the whole idea of Oddworld-style robust coding is to make the error or exception occur at the spot of the bug. In a normal codebase, someone might screw up a pointer, or write some invalid floats, or stomp on memory, whatever, and then the crash occurs later in some other code. We try to catch these ops and verify objects after operations, so that if something is wrong, we see it immediately in the spot that caused the problem.
10-26-04You can't miss every single one of your milestones and think you're on track. You can't be late all through the project and then be on time to ship. The complete lack of reason & rationality in management is just insane to me. Maybe I should write a book on producing with some very simple step by step rules and guidelines.
10-24-04More news from the back page - the defense department has now quietly denied several attempts to investigate the chain of command in the Abu Ghraib prison scandal. There's mounting evidence that the torture was ordered from the top, perhaps as high as Rumsfeld, but they refuse to provide any of the commanders for interviews. Now, in the trial of some of the soldiers who committed the abuse, the judge has refused to summon those soldiers' commanders (as their lawyers requested). There's no possible reason to refuse the summons other than to protect the department and cover up the chain of command. In other news from the back page - Dick Cheney the other night told some ridiculous lie that the Flu vaccine shortage was caused by not low prices on flu vaccine, that the drug companies didn't make enough money on it so there weren't enough suppliers; in fact, that's complete nonsense; there are over 30 suppliers world-wide, and no other 1st world country has a shortage. The only reason we have a shortage is because we only have a few approved suppliers, which is one of the many government subsidies for private business. The government is not allowed to negotiate freely to buy the things it needs, it's locked into certain suppliers at certain prices, which is a totally corrupt way of pumping them money. Thanks to the supposedly-Laissez-faire Republicans, this same form of subsidy has been written into the prescription drug law.
10-23-04Russia has signed the Kyoto treaty on emissions reductions, which ratifies it. The freaking Russians have shown more maturity and un-selfishness than the supposedly great and magnanimous Americans. We are now the only major nation to not have signed it. God forbid we ever make our business profits a little lower to save the lives of people all over the world.
10-20-04There are two great things about baseball that basically no other game has - 1) there are no fouls; there are no refs; it's basically impossible for the outcome of the game to depend on refs calling fouls. Sure, the umps sometimes call a tag wrong, but that's not really a foul, there's no replay, etc. 2) in reasonably close games, every single moment is tense; that is, the game can be decided on almost any play, if someone makes a big error or hits a home run or whatever, almost every pitch is decisive; contrast to most sports that have long periods of boredom and brief spikes of excitement.
10-20-04I love it when people take social statements that are kind of sarcastic, and just take them wrong and use them as anthems. "Born in the USA" is a classic; it's a song about a vietnam vet and how his country has pissed on him, and he's like begging for some respect, and it's become like a patriotic anthem. The movies "Scarface" and "Taxi Driver" are classic too; people idolize Pacino and Deniro as tough guys, they want to be like them; of course in both movies the heros are sort of insane losers and their lives spiral into disaster. The masters of this were Dire Straits; almost all of their songs are sarcastic or tongue-in-cheek, but you see people singing along with the straight message.
10-19-04The reality of the fervent Bush supporters is many fold -
There are the people who really just have no idea what's going on in the world. These people still think Saddam had nukes and was helping Al Qaeda. They think "Clear Skies" actually is a pro-environment program. Well, you can't blame them all that much, because the media and the administration constantly lie at them. Something like 50% of the population is in this group.
There are the absolute wacko Christians. I'm not talking about your ordinary Christians. I mean people who believe that Angels really exist and come down to earth, people who literally believe in a fiery hell, people who believe the world will come to an end and final judgement will take place in the next 100 years. This is roughly a shocking 20% of the population.
There are people who are afraid of all foreigners. In their mind "moslem" and "islamic terrorist" are roughly the same thing; and those Chinese, they're communist right? Hell, we invaded Iraq, and I don't care if they had weapons or dictators or what, this is a Crusade - it's a war between civilizations.
There are the people who just want their money. This is a wide group, consisting of business and labor groups that want various shelters and protections and tax breaks that Bush has given (such as for cotton growers, the steel industry, all agribusiness, pharma, aerospace, etc. etc.). It consists of many of the rich, who want their lower taxes (so low, that many of the super-rich (like Dick Cheney) pay around a 5% tax on their total income). It also consists of foolish people in lower tax brackets, who will take a $400 tax break and lose $2000 of government programs (these are the same people who pay for $20 for discount club memberships in order to save $2).
10-19-04We need a new law in place, that the president is required to go before Congress and answer questions, ala the Brittish "Prime Minister's Minutes". He must answer all questions truthfully; any questions which would cross into classified information can be deferred, but still must be answered behind closed doors to the congress.
10-18-04I'm doing a talk at the "Game Tech" Seminar on December 2. It'll be about how we made the engine and game behind "Stranger", with emphasis on specific things that I think we've done well in code that people can benefit from. This seminar is very good, the quality of people attending and speaking is very high, it's much more useful than GDC. Just the people you get to talk to at lunch make it worth it. I'm definitely the odd man out talking about games - Chris will talk about Halo 2, Jay will talk about Half Life 2, and Andrew will talk about The Sims 2 - all huge games that I would love to hear about, then I get to talk about this damn Oddworld game that failed to make it to the PS2, etc. It's also a bit of a challenge to keep my talk from being preachy, like "you all are bad programmers; use C++ and STL and exceptions and get with fucking reality".
10-17-04Ever since WW2, our government has had the spectre of "Communism" as an excuse for doing anything they wanted, and the "Cold War" was a permanent state of war which granted the president extra-constitutional powers. Worried about some hippie liberals exposing illegal activity in the government? Call them communists and bug them and have the FBI watch them and spread false news articles about them. Some democratically elected government is not cooperating with your demands? Call them communist and sponsor a coup, or arms rebels to fight against them. This has been de-facto American practice from Truman to Reagan. Now we have "Terrorism".
10-16-04Celebrex, Vioxx, and Bextra are pain-killers in the COX-2 family. These drugs increase the risk of heart attack. They are no more effective at reducing pain than Aspirin or Ibuprofen, and no gentler on the stomach than Ibuprofen (Aspirin does have bad side effects for some people, but for most people it has very beneficial side effects, actually reducing the risk of heart attack). These drugs cost roughly $3 a pill. Ibuprofen costs roughly 10 cents a pill. In total, these drugs have cost the US health care market roughly $20 billion dollars in the last 5 years.
Prozac and other mental health drugs have never been shown to be beneficial in impartial long-term studies, and yet they continue to be heavily prescribed. Seratonin-inhibitors (SSRI's) have now been shown to greatly increase the suicide rate (in addition to their many previously known side effects). The negative studies were intentionally not published. The entire psychiatric drug industry is a scam, since the doctors really have no idea what they're doing, and placebos are extremely effective at treating all the mild psychoses. I can't easily find total numbers for Prozac proficts, but it was around $3 billion/year at peak, so something like $10-20 billion over the life of the drug seems reasonable. (of course Prozac was also relabeled Serafem and sold under that name for a while).
Drug companies *each* pay roughly $15,000 of semi-legal incentives to doctors to encourage them to prescribe their drugs. In the old days (5-10 years ago), they used to actually send checks to doctors that said "I recommend this drug" on it, you sign it and send it back, they deposit it for you. They aren't so obvious any more, but they give grants for "trials", fly doctors to conferences, hire them for speaking engagements, buy them dinners, take them to shows, etc.
A lot of the problem is not just that the doctors are corrupt and taking the kickbacks from drug companies, it's that the doctors don't have time to independently research every drug they prescribe. They see all this marketing from drug companies (drug companies market to doctors directly with tax-deductible funds), and they believe it. The drug companies publish a bunch of positive clinical trials (they are not required to publish them all, so they just do 100 and pick the good ones), so the drug looks good. The next problem comes with the HMO's, which offer prescription advice. The HMO's really are corrupt and in league with the pharma companies.
How do we solve this? First of all, we need some good trial lawyers to sue these bastards to straighten them out ;) Second, you require all drug studies to be supervised by some independent body (like the FDA); you require all studies to be published whether they are positive or not. Next, you make it illegal for drug companies to offer any prescription incentives to doctors or HMO's. You have the FDA prepare summaries of effectiveness and side effects for all drugs, and this should be the primary prescription guide for doctors. In the end, the system has to be reformed in some way to give doctors and HMO's more incentive to choose the cheaper alternatives. This is a hard problem. It's hard to restrict the pharma companies without infringing on their rights to free speech. One key point is a principle of Chomsky - the rights of corporations should not ever be protected over the rights of individuals. The big "prescription drug benefit" that our government now provides is yet another big benefit for big business, not for people.
10-14-04Immediately after Britain and the US opened Libya, Shell and BP announced deals to develop oil fields in Libya. Now the EU has announced deals to sell modern arms to Libya. So, Ghaddafi was a terrible terrorist, but he's apologized and now we can sell him weapons.
Dick Cheney at Halliburton has always pushed for the US to drop sanctions on Iran. He also pushed for us to drop sanctions on Iraq.
Within twenty five years, only six countries will have all the oil reserves in the world - Iraq, Iran, Venezuala, Saudi Arabia, Kuwait, and United Arab Emirates. Saudi Arabia has by far the most.
Saudi ARAMCO promo site (this site
is really sick, they're a Saudi promo site and they show all these pictures of US presidents hanging out with the
In 2020, the middle east will have all the oil , with Iraq being the #2 or #3 player, and China and India and others very thirsty for crude.
Oil in the Iraq wars
10-14-04Modern art's ridiculous. There's a lack of real judgement, and the critics are all such buffoons, they hoo and ha over the most terrible works. If an artist sets up an exhibition and doesn't tell the critics what the art is, they might start fawning over the "starkness of the fluourescent lights, which speaks to our isolation", or the "rattling of the air conditioner, like the sound of a tin cup on jail cell bars", before the artists points out, "no, it's the linoleum floor, that's my work". Yes, there was once a place for this. You had realism, you had impressionism, etc. and then people started making deconstructionist statements. The thing about "statements" is they only need to be made once. Hey, a blank canvas is art too if I hang it in a museum; ok, wow, that made me think - now NEVER do that again! Hey, a foam toilet is art, well, sort of, but isn't it just stupid? Found objects - every thing in the world is art, yes, good, now stop charging me money to see it. Wow, you can make beautiful color with splatters; hmm.. didn't someone already make this statement? Let's move on. I think this stuff appeals to a very pretentious false-intelligentsia who enjoy going to the same sort of art shows over and over and acting like they "get it" and they're so far beyond ordinary people, when in fact it's really a very safe repetition that's not actually challenging.
10-12-04Creepy blast from the past : when Kerry was speaking for VVAW against the war, a Republican attack group was set up by Nixon for this guy John O'Neil to smear Kerry. O'Neil probably had his own ideas, but it was engineered by Colson and Haldeman, who were Nixon's right hand attack dogs, the engineers of the Watergate enterprises. Now, many people think of Watergate as this one event where the Republicans were breaking into the Watergate hotel to bug the democrats - it's not. That was just the final event in a long string of illegal bugging, manipulation, false news articles, false protestors, support for opposing candidates, illegal financing for campaigning from public funds, etc. etc. (of course, O'Neil is the guy now behind the Swift Boat nonsense which is smearing Kerry, and now he's supported underhandedly by Rove/Bush et.al.).
10-10-04Hip-Hop is sort of a great metaphor for America in general. You get these kids from the inner city who are dirt-poor, live in government housing, get poor educations. Some of them have some talent, or some luck, and become a hip-hop star. They've risen to riches, and live the good life. Now, they could use their fame and fortune to help people from the streets, to speak about the inequality in this country, but nah, they use their podium to tell the world how big their diamonds are, how many girls they sleep with. In the final act, their money is managed by corrupt and manipulative people, and the hip-hop star ends broke and pathetic, doing cameos on Hollywood Squares and shows at the local Indian Casino to make ends meet.
10-10-04How to fix baseball (speed up the game, and get more hits) : 1) batters are not allowed to step out of the box. Once they're in the box, the pitcher can go at any time, so no long prep ceremonies are possible. 2) pitch timer; pitchers get 20 seconds between getting the ball and having to make a pitch; failure to make a pitch in time counts as a Ball. 3) Teams get only 3 conferences on the mound per game. 4) Pitchers called in from the bull-pen have 2 minutes from the previous last pitch to the first pitch they must make. 5) Use "K-zone" or something similar, and enforce the small strike zone.
10-10-04Jesus, jesus, are you not outraged at what's happening in this country?
When judges vote along party lines, it's a mockery of our government system, a mockery of justice, a false-justice, a kangaroo court. It clearly shows they are voting based on their party and not on the facts of the matter at hand. Judges are supposed to be above that; they're supposed to defend the law and the constitution and peoples' rights. Even the Surpreme Court of the United States has become basically a partisan rubber-stamp machine; their party-line vote to interfere with the Florida election in 2000 was just a part of their recent history of voting exactly on party lines.
The 6th U.S. Circuit Court of Appeals in Cincinnati ruled on October 7 to kill a man for party politics. Paul House was sentenced to death for the murder of Carolyn Muncey over 15 years ago, and has been on death row all that time. Recent DNA evidence has exonerated him, and eyewitnesses have also cleared him and pointed at Muncey's husband, Hubert Muncey. Despite all this, the 8 republicans on the appeals court have ruled that House's conviction should stand, and he should die. Presumably this is a show of toughness and support for the death penalty - it's unconscionable! Those judges should all be stripped of their seats. The 7 democrats who voted to clear House are not necessarilly any better - they happen to be on the right side of this issue, but confronted with another partisan issue, would they just vote on party lines as well?
All presidents in recent history use their power to pack the Federal Appeals courts full of un-qualified compliant partisan judges. Judicial appointments have become merely ways for the parties to keep some power over longer spans of time. Congressional approval of judicial appointments is supposed to be a check to make sure that they are qualified and reasonably non-partisan. In recent years, the president has swept aside that approval and rammed through judges that congress won't approve - Bush avoids approval of Pickering , The Pickering Affair , Progressive judiciary watch , Politics in the Judiciary , On republican court-packing
10-10-04I keep thinking to myself - Self, wouldn't it be great if there was a news source that was truly non-partisan, that would point out the bullshit that both sides are spewing, that would not just stick to "administration sources say", that would ask the hard questions, and that would vigorously fact check their work and summarize the context? They should be well-respected and established so they can tell the truth about people in power without being shut down or run out of town. Why hasn't anyone made such an organization? Now just today I realized, wow, that's what newspapers are supposed to be. Were they ever? They certainly aren't now.
10-10-04President Bush says "I admit it, I'm a master-debater. Those trial lawyers need to get off our backs and let us practice the love with our hands!".
Kerry : This administration has not created jobs.
Bush : He's a flip-flopper!
Kerry : He claims to be pro-environment, but actually has weakened environment protection on power plants, opened our national forests to logging, done nothing to clean the air, and allowed destructive forms of strip-mining!
Bush : But he changed his mind!
Kerry : He took us into Iraq and took our focus off Al Qaeda and allowed Osama bin Laden to escape!
Bush : Doesn't he look kind of French to you?
Kerry : He said Iraq had WMD's, was trying to make nuclear weapons, and had ties to Al Qaeda, and claimed it was part of the war on terror.
Bush : I think he's a wimp; he wouldn't have the guts to use American Power
Kerry : He is using the war on terror as an excuse to dismiss all critism and take war-time powers; he's pushed the Patriot Act which does little to help security, but a lot to invade the privacy of American Citizens; he's holding Americans and others hostage in prisons around the world, with no trial, and torturing them in interrogations!
Bush : He uses big fancy words.
Kerry : He refuses to admit that he's made a single mistake!
Bush : I like cheese.
Kerry : He's cut taxes, primarily for the very rich, including huge tax cuts on dividends, capitol gains, and inheritance - that doesn't boost the economy or help any of you!
Bush : But he's a flip-flopper!
Ah, yes, well done Mr. Bush, that debate was clearly a tie.
10-8-04Cheney said "there's no doubt that Iraq has WMD's" (it doesn't). Cheney said Iraq was connected to Al Qaeda (it wasn't, really). Cheney said Saddam Hussein helped Al Qaeda prepare for the 9/11 attacks (he didn't). Cheney said Iraq was close to having nuclear weapons (it wasn't), and was buying nuclear material (he wasn't). Cheney said we would be greeted as liberators (we weren't). Bush said "Mission Accomplished" (it wasn't). Rumsfeld said we don't need more troops on the ground (we do). Bush says we have a strong coalition (we don't). They say we didn't allow Osama to escape (they did). Now Cheney says that knowing what he knows now, he still believes they did everything right and would do it all exactly the same way again.
10-7-04Wow, there was an appropriate Simpsons rerun on the other night. A three-eyed fish is found near the nuclear plant, so it becomes a scandal and inspectors check out Burns' plant. The inspectors find all kinds of gross violations and give Burns the list of things to fix. Smithers tells him it will cost him $56 million to fix. Burns is despondent - he thinks he's ruined, until Homer happens upon him, and accidentally suggests that Burns run for governor. Of course! Burns is delighted - a run for governor would only cost a few mil, and he could decide what's safe and get hose fat cats in capitol city off his back. What ensues is frighteningly like reality, as Burns spins lies and follows the directions of his campaign image staff and the people lap it up.
10-7-04Another thing that bugs me is this idea that war against an "evil" person is inherently good. NO! Just because an administration is rotten, doesn't mean war against that country is a good idea or is justified by law or moral standards. Hell, I think our administration is rotten, but that doesn't mean violence against them is justified. You have to look at two things - 1) what are the likely consequences of war? the cost, the benefit, the human toll (how many innocent people will you kill?), the political ramifications, the long term results in the target country, etc. etc. 2) you have to obey the "golden rule", set an example, obey international law - you can't just go invading anywhere you want, because that sets a standard for war to break out anywhere in the world!
10-7-04I continue to hear people say that Cheney did well in the debate, and that "Edwards got a lot of facts wrong too". We're not talking about little facts here, people! Yes, they both exaggerated the numbers slightly in technical ways, though I don't really see any points that Edwards got wrong, he just phrased some things in ways that make his argument look good. You can see all the fact garbage here - at factcheck but they seem to be very biased. The whole headline suggests both sides "mangled facts" in sort of an equal way. Bullshit - Edwards massaged some numbers, but never really outright lied - Cheney very intentionally lied and manipulated semi-truths almost constantly!!
Look, this is not some small thing. To say "they both got things wrong" is a huge distortion - that's what Fox News would say - Cheney's lies were not some small arcane points that you have to search around to find the problems - anyone who understands English knew he was lying the whole time. He was attacking Edwards with bogus points. He was saying "Edwards got his facts wrong", when in fact, Edwards was basically right and Cheney was completely wrong. It's all so unbelievable.
10-5-04The "NOW with Bill Moyers" on the 9/11 commision report was shocking. Seeing in pictures the way this administration handled the lead-up to and day of 9/11 was unbelievable; the incompetence! the laziness! the pig-headedness! However, despite being a great show, I must call out one silly sin. At one point in the episode, they are talking about the PDB entitled "Bin Laden determined to attack within this country" (PDB = Presidential Daily Briefing, not Program DataBase). When this PDB was delivered, Bush was on vacation in Crawford, TX, as he often was. As Bill reads about the PDB, they show a slow-motion clip of Bush on his ranch in the background. Yes, it's true, but that's typical sleazy negative attack-ad tactics. I know the republicans would do exactly the same, and Fox news does much worse all the time, but still, it stood out like a sore thumb of partisan production in the middle of a valuable factual program.
10-5-04Levels of robustness in coding :
- 1. Be aware of inconsistency/error conditions
- 2. Assert about them
- 3. Detect input errors and report them to the content creator, allow the game to keep running but show the pieces that are in error.
- 4. Don't allow content out of the tools that's invalid; give instructions on how to fix it.
- 5. Detect runtime logic errors (aka bugs) and report them appropriately; allow the game to keep running if possible; remove the broken objects from the sim. (this is easiest to do using exception handling).
- 6. Avoid runtime logic errors; make them impossible.
This last step is the "nirvana" of robust coding. Most people don't even know it exists, and few really see it. Basically any time you would assert(), or any time you say "oh, this must be done", get rid of that - don't assert, don't say "this must be done" - make those conditions happen automatically!
The first place to start is pointers; if you say "this pointer must be released". Don't say that. Put all your pointers in smart pointer classes that auto-release. Now you might say "make sure to use the smart pointer class". Don't say that. Have your class factory always return a smart pointer. Similarly, you might do something like take a mutex lock with EnterCriticalSection. You say "make sure you Leave". Don't say that. Hide the OS calls and make a Mutex class that lives on the stack and does Enter/Leave with its lifetime.
Any time you have an assert like ASSERT( x == y ) - get rid of one of those variables! Any time there's a relationship between state values that must hold, get rid of them!! In general, less variables makes code more robust. In a very technical sense, your variables are degrees of freedom in the state space of the simulation - the goal is to make every value in those DOF a valid state in the simulation. If you have extra variables with constraints (such as x == y), you're doing an un-necessary cover of the state space with constraints. Everyone in physics knows contraints are a pain - try to find the minimal set of variables that describe the actual free degrees of freedom. You are removing logical constraints and making it impossible to invalidate the sim state.
- ► 2014 (48)
- ► 2013 (87)
- ► 2012 (134)
- ► 2011 (237)
- ► 2010 (310)
- ► 2009 (362)
- ► 2008 (697)
- ► 2007 (394)
- ► 2006 (654)
- ► 2005 (696)
- ▼ December (14)
- 11-21-04 - 1
- 11-20-04 - 4
- 11-20-04 - 3
- 11-20-04 - 2
- 11-20-04 - 1
- 11-17-04 - 1
- 11-16-04 - 3
- 11-16-04 - 2
- 11-16-04 - 1
- 11-15-04 - 2
- 11-15-04 - 1
- 11-14-04 - 2
- 11-14-04 - 1
- 11-13-04 - 1
- 11-10-04 - 1
- 11-9-04 - 1
- 11-8-04 - 4
- 11-8-04 - 3
- 11-8-04 - 2
- 11-8-04 - 1
- 11-7-04 - 5
- 11-7-04 - 4
- 11-7-04 - 3
- 11-7-04 - 2
- 11-7-04 - 1
- 11-4-04 - 1
- 11-3-04 - 1
- 11-1-04 - 3
- 11-1-04 - 2
- 11-1-04 - 1
- 10-27-04 - 3
- 10-27-04 - 2
- 10-27-04 - 1
- 10-26-04 - 1
- 10-24-04 - 1
- 10-23-04 - 1
- 10-20-04 - 2
- 10-20-04 - 1
- 10-19-04 - 2
- 10-19-04 - 1
- 10-18-04 - 2
- 10-18-04 - 1
- 10-17-04 - 3
- 10-17-04 - 2
- 10-17-04 - 1
- 10-16-04 - 1
- 10-14-04 - 3
- 10-14-04 - 2
- 10-14-04 - 1
- 10-12-04 - 2
- 10-12-04 - 1
- 10-10-04 - 5
- 10-10-04 - 4
- 10-10-04 - 3
- 10-10-04 - 2
- 10-10-04 - 1
- 10-8-04 - 2
- 10-8-04 - 1
- 10-7-04 - 3
- 10-7-04 - 2
- 10-7-04 - 1
- 10-6-04 - 1
- 10-5-04 - 6
- 10-5-04 - 5
- 10-5-04 - 4
- 10-5-04 - 3
- ► 2003 (74)