All this proves is that Valve does not have any playtesters and the designers don't even play the game, which is a bad sign.
I think comments like this are unfair. Do you know how many lines of code is in TF2? I made a new MOD in Source SDK, with absolutely no changes: this will get you a game similar to HL2 which means no multiple classes, no complex shaders, no special weapons, bonk cola, sentry guns with three levels, etc:
Code:
2857 text files.
2842 unique files.
37 files ignored.
http://cloc.sourceforge.net v 1.07 T=33.0 s (85.0 files/s, 36825.1 lines/s)
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
C++ 1375 157641 147403 633205
C/C++ Header 1428 59654 42771 174149
C 1 85 85 164
Perl 1 12 3 48
Teamcenter def 1 0 0 8
-------------------------------------------------------------------------------
SUM: 2806 217392 190262 807574
-------------------------------------------------------------------------------
Barebones code for a Source game, with no updates, upgrades, or real features is 800,000 lines of code and 200,000 lines of documentation. And those lines constantly cross-reference each other, so if you change one line here, a line over there that everyone forgot existed suddenly breaks. And games like TF2 and L4D HEAVILY modify those lines of code. And adding weapons adds a couple thousand lines of code. And fixing bugs causes more lines of code, where you're checking issues with other lines of code.
Programming is a mess.
Valve, unlike, say, Linux distros, don't have millions of people looking at their code... until they push a patch. They've got a handful of playtesters who are constantly playing TF2, and a handful of developers who test their stuff in TF2.
I used to work in development. The problem with a developer testing his own code is that he knows how it's supposed to work. I'd write a program, and then test it tomorrow, after I'd slept. Why? Because if I tested it today, I'd still have in my head EXACTLY what it was I wrote, and so I'd test EXACTLY what I wrote. If it tweaked something else, or broke something else, I wouldn't know, because what I wrote worked exactly the way it should.
And then you have the playtesters. I know many people dream of being a playtester. I'd love to do it for a bit... but imagine: your job is to play a game, over and over and over and over and over and over and over again, far beyond the time when you've learned the plot. But you can't enjoy it; your job is to BREAK it. So you're constantly trying to build teles in stupid places, trying to jump off ledges at different heights to see if it kills you; you're not playing... you are BREAKING.
Here's a challenge for you: Sit down and start up TF2. Join a map, and test EVERY GUN from EVERY CLASS against EVERY OTHER CLASS from a minimum of six angles (above, below, front, left, right, back). It'll take you a few hours; mindnumbing boring hours. I can personally imagine a playtester, having sat through mindnumbing hour after mindnumbing hour of jumping off cliffs to fail to notice that when he shoots a scout he doesn't slow down as much as he should.
Now, having worked in development, you have something called a ship date. Valve is fameous for VALVE TIME; we revile them for it. But then shipping day comes, and the code is sent out. Then, suddenly, you go to your boss and say "Dude! Don't ship! I just discovered a tiny bug* that causes Natasha does 25% damage, not 75% damage!" Too late! It's already been pushed!
But you also can't shove out a patch EVERY TIME a developer finds a bug. You know how expensive that would be? Would you want a 5 minute delay EVERY TIME you opened TF2 to download another patch that tweaks the velocity of engineer shotgun shells when underwater on well at 50% health? So, they have to bundle up fixes.
And then we have community maps. Valve can't test all their software on every community map in the world. The double-jump fix broke Blackmesa. But that's because Dragonhill TUNED Blackmesa based on assumptions about double-jumping ability. But Valve's maps are not tuned that way, so Valve didn't think to check it. You remember that test with the guns I proposed earlier? Mr Playtester, please do that test on EVERY MAP. Over EVERY CONTROL POINT. Also do it while you are holding intel. Also while they are holding intel. Do it while you are both holding intel. Do it while they are airborne. Do it while you're airborne. Do it while you are both airborne.
Also, remember that there are tens of convars, from gravity to party mode, that can all break in an update.
Also remember that many servers run Sourcemod, or something similar, and all those can break.
Lemmie tell you: you haven't had stress until (1) you're under fire in a war zone for real, (2) you discover you forgot to put on pants for a job interview, or (3) patch day.
Also, I just tried to run TF2:
March 6, 2009 - Team Fortress 2 Update Released
Updates to Team Fortress 2 have been released. The updates will be applied automatically when your Steam client is restarted. The specific changes include:
Team Fortress 2
- You can now duck twice in the air. Scout double jumps reset the in-air jump counts
- Increased the jump velocity to account for the tuned bounding box sizes. Jump height should now match the prior-to-last-update heights
- Added "tf_clamp_airducks" convar, set to 1 by default
- Setting it to 0 will remove all constraints on ducking while in the air. Useful for servers running RJ challenge maps
[-]March 5, 2009 - Team Fortress 2 Update Released
Updates to Team Fortress 2 have been released. The updates will be applied automatically when your Steam client is restarted. The specific changes include:
24 hour turn around to fix a bad bug? NICE. Bet it sucked to be a dev at Valve yesterday.
Valve pushed their update to the real world. Developers nerviously drank their sodas at their desk, hoping that their specific code works. Thousands of people download the patch. Engineers desparaptely search their code, hoping for the best. The first bug report comes in, and every developer pulls up "blame" on that chunk of code, hoping their name doesn't appear. The developer who handled the Natasha code for the update feels his blood run cold. The guy who engineered the jump-duck patch gasps for air, as his car payment and house payment strangle him in terror for his job. Fingers fly over the keyboards to fix it. Playtesters are called in from their crash room on emergency call to test patches.
Remember! Not only did they test the old patch that broke it... THEY HAVE TO TEST THE PATCH THAT FIXES IT. Except the fix has to be out NOW! You're boss is at your desk hourly asking for updates. The Valve boards are screaming for your blood, your job, burning you in effigy. The testers test code updates as fast as they can. The quality control guys are scrutinizing every line checked in. And that developer that screwed up? Yeah, he doesn't want to screw up again, and so he's checking EVERYTHING.
And guess what?
This patch is going to effect some long lost code already marked gold, developed by some developer who no longer works at Valve, who quit and now works at a florist in Georgia, glad to be away from that high stress environment.
Could we please stop beating up the dev teams and testing teams? Their jobs are hard enough without people griping at them for human error. When was the last time you THANKED the dev team for a patch?
DEV TEAM SCREWS UP: You guys suck.
DEV TEAM FIXES IT: About time.
DEV TEAM DOES IT RIGHT: NERF NOW!
DEV TEAM DOES IT ALMOST RIGHT: I can't believe these guys suck so much. Don't they even test it?
* It's this easy to break code (pseudocode):
GOOD CODE:
File WeaponDefs.h:
Code:
#define NATASHA_DAMAGE_REDUCTION = .75
File Server/OMG/LOL/ROFL/minigun_damage.c
Code:
minigun_damage=(getgun()!=HEAVY_GUN_NATASHA) ?
HEAVY_MINIGUN_DAMAGE : HEAVY_MINIGUN_DAMAGE*NATASHA_DAMAGE_REDUCTION
See if the gun is natasha; if it is, multiply the gun damage by .75
BROKE:
File WeaponDefs.h:
Code:
#define NATASHA_DAMAGE_REDUCTION = .75
File Server/OMG/LOL/ROFL/minigun_damage.c
Code:
minigun_damage=(getgun()=HEAVY_GUN_NATASHA) ?
HEAVY_MINIGUN_DAMAGE : HEAVY_MINIGUN_DAMAGE*NATASHA_DAMAGE_REDUCTION
TYPO FAIL. For want of an equals sign...
BROKEN AGAIN:
File WeaponDefs.h:
Code:
#define NATASHA_DAMAGE_REDUCTION = .25
// Is this the amount left or the amount subtracted?
// Looks like amount subtracted in source file
// Client/OMG/LOL/ROFL/minigun_damage_estimate.c
File Server/OMG/LOL/ROFL/minigun_damage.c
Code:
minigun_damage=!(getgun()==HEAVY_GUN_NATASHA) ?
HEAVY_MINIGUN_DAMAGE : HEAVY_MINIGUN_DAMAGE*NATASHA_DAMAGE_REDUCTION
Assume that the #define for NATASHA_DAMAGE_REDUCTION is used in three or two files, and due to a misunderstanding, the developer of FILE_A used it like it was supposed to (damage left), but the developer for FILE_B used it the wrong way (damage subtracted). A new developer, working on FILE_B after the original dev quit to work as a florist, discovers that his code keeps breaking. He changes the #define... problem solved!... for him. But now it breaks the other code. But the other code has already been called "gold," so nobody keeps checking that code (You can't scan a million or two lines of code for EVERY change... it gets too difficult and ridiculous.)