September 30, 2004
I admit it: I didn't watch the candidate's debate tonight. I had two reasons:
(1) My mind is already made up.
(2) Contemplating the sick feeling I will get in the pit of my stomach when I wake up the day after Election Day and read about who won makes me break out in hives. I get enough existential dread when I think about being forced to program in Tcl without adding politics to the mix.
So, I ask those of you who watched, who won? Did it change your mind? Do you think it changed anyone's mind? What surprised you, if anything?
Add your comments below.
September 29, 2004
The number of people that know how to effectively debug and triage problems in a complex software product is upsettingly small.
I don't know why this is. Debugging has always seemed to me a very simple, straightforward task. Start at the top: figure out if the problem is reliably reproducible. If it is, start eliminating codepaths. It's basically the Holmes Principle applied -- when you've eliminated every other explanation as impossible, whatever is left, however improbable, is the explanation. Of course there are some bugs that are harder than others -- usually, the worst are the ones where you can't actually describe the conditions under which it happens. But even if we forget about those, I still see people who should know better whose preferred approach seems to be simply flailing at the problem until it goes away.
Computers, and software, are complex things. No one can keep the entirety of a complex software product in their mind at once when debugging. The desire to simplify the problem solving regimen is understandable, and even correct. But there's a right way and a wrong way to do it. The right way, as I described it, is to break the problem down into subcomponents and perform tests that either validate or eliminate a hypothesis about that subcomponent. Here are some of the wrong ways.
- Magical Thinking - This is something the Mac community had a lock on for many many years. Every time someone asks me "Did you zap your PRAM?" I want to punch them in the face. "Zapping the PRAM" was recommended as the solution to every problem from system lockups, to color profile mismatches, heartbreak, psoriasis, and as a substitute for Apple developing an operating system with protected memory and virtual addressing. You get magical thinking in the Windows world as well, of course -- "Defrag your hard disk!" say people who are diagnosing a problem while using NTFS. "Run Norton!" "Scan for viruses!" Why do they say these things? Well, they worked once. Maybe that'll work again!
- Denial/Blame the Victim - Yes, naive Slashdot addicts and new Linux users, I'm looking at you. "That never happens to me. You must be doing something wrong," is not, in fact, a useful thing to say. Ever. Inevitably, if these people are or become developers, they're the guys who write code that doesn't check for errors because "that error is really unlikely."
- Broken Logic - "Aristotle and Plato are both Men. A Man killed Sophocles. Aristotle did not kill Sophocles. Therefore, Plato killed Sophocles." You'd think you wouldn't see this sort of logic in the real world. But you'd be wrong. The most clear cases of this are when you see someone jump to a conclusion when they eliminate one possibility. What about the other possibilities? It's one thing to pick a hypothesis to test next, and it's quite another to declare "Through the process of elimination, the bug is here" -- when you haven't actually eliminated the other likely candidates.
- Punish Good Deeds - Figure out which person on your project is the best at triaging bugs. Declare that the bug is in their code. Then they have to debug the problem for you in order to prove that it's not.
- Print statements everywhere! - Ok, really, we've all done this at some time or another, but it should be a last resort. Particularly in a multithreaded system, anything you do that might change the timing can make debugging harder, not easier.
There's an old saying "If architects built buildings the way programmers wrote programs, the first woodpecker that came along would destroy civilization." I'd suggest a corollary: "if doctors diagnosed patients the way programmers debug programs, no one would ever risk going in to a hospital."
I should also admit that I'm blurring the lines between "triage," which is coming up with a rough idea of what component of a software system is failing, with "debugging," or fixing the bugs. One is really a special case of, or a part of, the other. I'd argue that getting triage wrong is worse than getting a bug fix wrong, because of the inherently timewasting nature of misclassified bugs.
So I've given you some sarcastic ranting about how not to triage problems. How about some constructive suggestions? I've already talked about trying to ensure that you can reproduce problems, but that won't be possible for every bug. What else can we do?
- Always have a hypothesis - Hypothesize what is going wrong early, and often. Don't get attached to your hypotheses. Expect to be wrong most of the time, at least early on. A good hypothesis is one that you can construct a test to disprove.
- Triage bugs to your limit - There's nothing wrong with talking to other people about a bug, or asking for help. But when a bug comes your way, you should not hand it off to someone else until you can give a narrative of what you think is happening, and why you can't trace it any further. It's all just code. Even if it's code you're not familiar with, most problems you encounter will be of a pattern you've seen before. And if you find a type of error you haven't seen before, congratulations! You're learning something new.
- Write everything down - Keep a running explanation in your bug tracking system of what tests you're trying, what machines you're using, what your results are, theories, conversations, etc. If the bug is handed off to someone else, they'll appreciate it, and even if it isn't you'll be able to search that database later when the exact same bug crops up in a different place.
- Use the best tools - Learn how to use every tool at your disposal, and master it. Debuggers, profilers, and fault injection are your friends.
September 27, 2004
What time is it?
venti skim no-foam vault
Every problem, however, is also an opportunity. I propose that CIBC Bank purchase Coffee Time, thus adding the latter's roster of delicious and inexpensive treats to their bank's portfolio. In these highly competitive times, the ability to draw in new customers through any means cannot be dismissed. And Coffee Time will benefit as well, as CIBC's large customer base discovers the delights of a walnut cruller and a large black coffee while waiting on line to make a deposit.
Do not be dissuaded by the naysayers and small-minded ones who throw out trivial objections -- "Oh, but banking and coffee shops are different," they will whine. "What about your customers who don't drink coffee?" they will mewl. They'll tell you that basing a merger simply on the color of your logos is "crazy." To which I say: "HA! Crazy like a fox!" Think of the most successful financiers you know. Think of stockbrokers, think of floor traders. Is there even one that doesn't drink coffee? Of course not. Coffee is bold. Coffee is strong. Just as currency is the lifeblood of our economy, my friends, so too coffee is the...um, lymph. Coffee Time is one of the most productive lymph nodes. With one fell swoop, you can grab that lymph node and squeeze! Sure, they'll laugh at you now, but when their banks are closing because you've got the best
lymph coffee, well, they'll be singing a different tune, I promise you.
Gentlemen of the Boards of Directors of CIBC Bank and Coffee Time -- I thank you, capitalism thanks you, and the people of Canada thank you.
September 24, 2004
I've heard about Retsina for years, but it was not until recently, at a Greek restaurant on Danforth in Toronto, that I actually got to taste it.
It tastes like rosemary wine.
That's not a bad thing.
Rosemary, of course, is a member of the pine family, and Retsina is treated with pine tree resin; hence the taste.
It's a light white wine, similar in body to a Frascati or a Pino Grigio. Behind the rosemary/pine nose and taste, there's a vegetal, grassy flavor, and a slightly medicinal, bitter tang. I could see some people not liking it, but like the hoppy finish in a good beer, I found that the bitterness cleansed my palette and readied me for the next sip, or the next taste of food. This is definitely a wine to drink with food.
Not something I'd drink every day, but it makes a nice wine for a warm summer day.
September 23, 2004
Bonjour Brioche is a breakfast place in Toronto. It's inconveniently situated on Queen Street East about midway between downtown and the Beaches, at the corner of Queen and Broadview. It's small, cluttered, and there's usually a wait to get in. The hours are annoying and too short. And it has some of the best bread you'll ever have.
The croissant is superb. The baguette transcends belief. The coffee is good. Amusingly, the brioche they are named for is only just sort of OK -- if you're in the mood for a pastry, skip it and get the croissant instead.
Bonjour Brioche sports a full breakfast menu, so if you want an omelette, or some bacon, or some scrambled eggs, smoked salmon, and caviar, no problem. Their non-pastry breakfasts are good, but kind of miss the point. The highlight of any of the omelettes, inevitably, is the piece of baguette that comes with it.
One notable item on the menu is the "baked French toast." This is somewhat of a misnomer. It's really a slab of bread pudding about the size of a loaf of bread. It is loaded with cinnamon, and sugar, and butter. In a pinch, it could be used to feed a family of four for an entire night. It's a bit overwhelming, but is definitely worth convincing someone else at your table to order.
My recommendation? Just get a whole baguette and some butter and homemade preserves. This is not intended as an insult to the rest of their breakfast food, which ranges from serviceable to good. Rather, it's an indication of how excellent their baguettes are. There's a belief I hear expressed that you can only get good baguettes in France. That's false. The main issue with baguettes is that they are breads with minimal fat, and high surface area. This means that the amount of time in which a baguette is truly fresh can be measured in a small number of hours. Baguettes are consistently better in France not because of some unknown mysterious secret baguette-making technique, but simply because, being smarter about food, they eat more of them and the ones you get are, usually, fresher.
There are also a variety of fruit tarts and quiche. All are excellent. If you're in Toronto over the weekend, and don't mind waiting for your breakfast, it's definitely worth a visit.
I considered making a short film of my last trip to Bonjour Brioche, but realized that they were too busy to talk to me, so basically all you would have had was a movie of me eating food that was better than whatever you're eating right now. So I skipped it. My new plan is to contact them and ask them to let me spend a night in their kitchen and film them while they bake bread. That would be a good short film.
Bonjour Brioche is closed on Mondays. Other days, they open at 8 am and close at 5 on Tuesday through Friday, 4 on Saturday, and 3 on Sunday.
September 22, 2004
Don't be fooled. This is easy. You just have to follow a few simple rules and you too can make a beef stir fry that will show up the dishes at P.F. Chang's as the chewey carboard crap that they are.
First, the typical chinese stir fry starts with flank steak. I don't know why, but it's what my mom did, and she's generally right.
Second, cut the meat as thin as you can across the grain. This is critical. If you cut with the grain, you get rubber biscuit. I'm assuming for the rest of this piece that you started with about 1/2 to 1 pound of meat.
Third, marinate for a while in a mix of soy, sherry and chopped ginger. A while is around a half hour.
Now, heat your pan. Any pan will do. I like the small non-stick omlette pans. My mom always used a cast iron frying pan. You can use a Wok if you must, but it's not critical. When the pan is hot, add oil. I usually have olive oil, so that's what I use even though it's sort of wrong. Add about a teaspoon or two of corn starch to the meat and mix it around. Toss the coated meat in the pan and mix it around so the meat isn't all stuck together. Toss in more ginger, some salt, and pepper.
The fourth secret is as critical as the second. Let the meat cook until it starts to make its own gravy in the pan. Do not under any circumstances add any liquid of any kind to the pan. If you do this, you will get rubber beef.
When the meat is done, it will expel some juices back into the pan and give you a nice sauce. At this point you can add oyster sauce or something if you like that. You can also toss in cut up green onion and wilt it with the meat.
Otherwise, just throw the meat on a plate. You are done.
The meat should be tender and coated evenly with a nice brown sauce that is not gloppy.
To make the classic variation on this dish, take the meat out of the pan just before it is done. Throw garlic, scallion and big chunks of tomatoes into the pan. Cook until the tomatoes start to fall apart. Add the meat back in. Mix and take out of the pan. Don't cook the meat with the tomatoes too long or it will get tough (see point 4).
This is all you need to know about beef stir fry.
September 21, 2004
Everett Kaser had one great idea for a game.
He's taken that one idea, and leveraged it into many, many games. Which of them you play is a matter of taste. But if you don't own at least one Kaser game, you're missing out on the most addictive puzzlers since Sokoban.
Rewind to 1990: my friend Nerak hands me a floppy with a DOS shareware version of Kaser's great idea: the game Sherlock. Have you ever heard those logic puzzles that begin: "Doctor so-and-so needed to seat 12 people at the dinner table. The lawyer wants the vegetarian dish, and won't sit next to the doctor. The man with the yellow hat wants roast beef. Red wine is being served to the person who has the chicken..." (and so on, and so on, and so on). Sherlock is a more abstract version of that puzzle.
The main playing board is a 6x6 matrix of cells. When the puzzle is solved, each cell will contain a single icon. When you start playing, each cell has 6 small icons representing the possible inhabitants of that cell. Cells are grouped into rows. So, for example, the 6 cells in the top rows are all faces; to "solve" this row, each of the 6 possible faces must be put in its proper cell. With the default icon set, from top to bottom, the rows were faces, houses, numbers, fruits, road signs, and letters. (More recent versions of Sherlock allow the player to customize the board size from as small as 3x3 to as large as 8x8.)
Arrayed around the main board are the clues. There are a few different sorts of clues, all in pictographs. I find that as I read them, I translate them into words in my head: "The 'No Parking' sign is in the same column as the face which looks like a big lemon head." "The green house is between the strawberry and the number '3'." "The letter 'H' must be to the left of the Egyptian Headdress Guy." You'll quickly learn there are corollaries to the different rules that let you make progress quickly (for example, if the green house is between the strawberry and the number 3, then logically it can't be in columns 1 or 6, which are not 'between' anything).
To help you keep track of what possibilities are available, you can right click on a 'small' icon (or a clue) to dismiss it from consideration. Left-clicking on an icon is an assertion that you believe you know where it belongs.
To call Sherlock an addiction is to underestimate it. Every game is different. Every game is fun. I have been playing Sherlock for more than 10 years. I'll be playing it forever.
Kaser, knowing a good thing when he saw it, took the Sherlock idea and ran with it. The first sequel was called Dinner with Moriarty, and was a more elaborate (and slightly less abstract) version of the same game:
The nefarious Professor Moriarty is giving a dinner party. As luck would have it, YOU have been invited. Professor Moriarty and his guests are seated about the table, and each person is eating a different food on a different colored plate and drinking a different drink. It's your task to determine WHERE Moriarty is seated (along with everyone else) and which person he's poisoning.The core mechanics of Moriarty are the same as Sherlock, although the board configuration differs and there are some slightly different types of clues.
There are other variations, as well. There's Honeycomb Hotel (Sherlock tilted diagonally and with the addition of borders between cells that you must deduce.) There's Latin Squares, a particularly vicious variation which adds affinity groups which span multiple rows and columns. There's Occam's Quilt, in which every cell has not only an icon, but also a background color and a background pattern, only one of which must match with its neighbors. These are generally harder games. Any given Sherlock puzzle is always solvable -- somehow -- given the provided clues. It's about straightforward deduction. Honeycomb Hotel and Latin Squares, however, will often generate puzzles which require the player to make forward progress by making an assumption and then eliminating that assumption as invalid when they discover a contradiction (the games provide an in-game mechanism to make reverting to the move before you made your assumption simple).
Kaser has created some other great games in addition to his deductive masterpieces: Descarte's Enigma, in particular, is a great implementation of the "Paint by Numbers" or "Nonogram" puzzle. But it is with Sherlock and its kin that my addiction rests. Until Cliff Johnston releases A Fool and His Money later this fall, I'll be clicking my way through Kaserland, one small deduction after another.
Regrettably, Kaser's games are only for Windows (and in some cases PocketPC). If you can track down a DOS version of Sherlock it runs fine on Mac OS X under DOSBox. Sherlock is available at Kaser's web site, as are demos of all of his other fine games. You can purchase full versions on line, as well. Enjoy.
And remember: I warned you.
September 20, 2004
Back from Toronto, with new tales to tell. This week, expect to see some or all of the following items:
- The best baguette on Queen Street
- Why is coffee in Toronto so uniformly bad?
- A proposal for Canadian banking reform.
- Retsina: the other white wine
...and, when they're done, book reviews of Persepolis 2: The Story of a Return, In the Shadow of No Towers, and the most recent of Jasper Fforde's "Thursday Next" books, Something Rotten.
September 18, 2004
In an earlier article, I outlined my general thoughts on digital cameras. In that article, I noted that digital cameras fall into two basic categories: point and shoot cameras, and digital SLRs. At the time, my main camera had been a Nikon D100. So I thought now I'd write a more specific piece about that body and its more recent cousin, the D70.
The Nikon D100 handles and shoots basically like a high quality mid-end Nikon film body, except that it captures digital files instead of slides or negatives. Light goes in one end, hits a sensor, and out the other comes a digital representation of what the camera was looking at. I will forego the particulars and specifications of the body because you can google for that.
Instead, I'll concentrate on what I like and dislike.
- Shoots just like a normal film camera.
- Starting with the raw CCD data, this camera makes files that I've made into prints that are better than any color prints I have ever had made from 35mm slide or negative film. This is especially true at higher ISO values, like 400 or 800.
- Shoots just like a normal film camera.
There isn't much more to say than that. The thing is awesome. Now here are my picky whiny quibbles:
- The Nikon RAW (NEF) files are ludicrously large. Unlike the Canon bodies, when you shoot RAW files with the D100, there is no compression. Somehow they left a hardware compression pipeline out of the image processing hardware. This means I have to put up with 10MB NEF files instead of the 5MB files that you'd get with a Canon. The big files also take a long time to write to storage, so when the camera's memory buffer fills, the wait is long.
The memory buffer in the camera only fits 4 NEF frames. And, when it fills, it takes a long time before you can shoot another frame.
The big NEF files make you want to shoot JPEG, but in camera JPEGs don't always come out right, so you really want the NEF file too. The D100 makes you choose.
I've never been happy with the JPEG files that D100 makes. They seem to be soft and noisy at the same time, especially at higher ISO speeds. Also, the color always seemed off. Maybe I just never got it tuned right.
Setting ISO, white balance, and image quality and other things on the D100 requires that you put the camera in "set this parameter" mode. In this mode, the shooting engine of the camera is locked out. You have to put the camera back into shooting mode to shoot. This blows.
The interface for zooming in playback mode is a bit clunky.
I don't like the little knob that sets the metering mode. I like the little button that my old Nikon 8008s had.
The flash sync is too slow to do fill flash out doors under most conditions.
The viewfinder is not as nice as the better ones on Nikon's film bodies. This turns out not to be a huge problem.
Summary: The D70 is the D100 with most of the above quibbles fixed.
The only thing that isn't really improved in the D70 is the viewfinder and the interface for changing some autofocus modes that I never change. Here is a more detailed summary:
NEF files are now compressed in hardware. So they are nice and small.
The D70 has a NEF+JPEG mode that shoots a NEF file and a proof JPEG at the same time. Perfect! If a good picture requires some touchup, you have the NEF file. When the JPEG works out well, you can put the proof right on the web and even make 8x10 or bigger prints from it.
The D70 writes to the card faster than the D100. So even though the memory buffer still only fits four frames, with a fast CF card you can shoot NEF files at almost 1fps, which is a lot better than what the D100 could do.
In camera JPEG files seem somewhat better than what the D100 did. But this might just be the piece of mind that comes from knowing I have the NEF file around.
In playback mode, hitting "Enter" now puts you right into a zoomed view. This is nice because most of the time it lets you quickly evaluate sharpness, which is all you do with this mode anyway.
ISO, WB, and such are now set using a button+dial interface in shooting mode.
They put the metering mode button back where it was on the 8008s. Yay!
Flash sync is now 1/500th! Take that Hasselblad wankers. This is great for fill flash.
The viewfinder is not better, but it's not worse either.
All this, and they fixed the flash system too. Although I have to buy a new flash to get the new features.
First, the NEF+JPEG isn't as useful as I'd hoped. The JPEG files are not tagged with the right color space, and they are full size. I like to make proof JPEG files that are half size. Also, the new NEF files preview very quickly at nearly full resolution (apparently the preview image embedded in the NEF is now a full sized JPEG instead of the teeny tiny one the D100 put in), so I don't really need JPEG files for quick proofing. They are mostly just useful for my dual catalog workflow.
Second, the lens hood casts a shadow. I never noticed this before with my D100.
This article is also at my main web site, so I'm gonna link to it here to up my google points: here you go.
September 17, 2004
I'm still in my office, rather than on my way to Toronto, because Pittsburgh -- inland though it is -- has had its own close, personal, and somewhat intimate encounter with Hurricane Ivan. To call what has happened here "flooding" is somewhat of an understatement.
17 September 2004, is officially the rainiest day in Pittsburgh's recorded history, with 5.08 inches falling in a single day.
Small Japanese sedans are floating through the streets. Highways are closed. Basements are flooded. And, most tragic of all, the traditional Friday Night Pizza has not been delivered to my place of employment. While realizing that you can't go home does tend to focus the mind on fixing the bugs -- since there's nothing else to do -- the gnawing hunger tends to distract.
It's not just raining cats and dogs here; the cats and dogs themselves are actually spitting and drooling as they tumble from the sky. I still have plans to try to get to Toronto tomorrow -- the room, alas, has been booked and paid for -- but won't be surprised if the highways are blocked. Somewhere on Yonge street there is a hot dog with my name on it, though. I shall persevere, and find a way.
September 15, 2004
For those of you who might want to play Sims 2, you could do worse than to read Tilt's mini-review of his first exposure to it.
September 14, 2004
I've never liked The Sims, despite trying to play it at least three times a year for the past few years.
I think a big part of this is the mise en scene. I can read books, cook, take out the garbage, go to work and shower all by myself; the idea of playing a game where I shepherd a little avatar through these activities feels just a little too meta.
I also find playing The Sims to be a fundamentally emotionally stressful experience in a way that, say, playing a fighting game isn't. Getting beaten up by some guy with a sword? I can handle that. Setting the kitchen on fire, however, is a blow from which I'm not sure my delicate psyche can recover. I don't know how to use a sword in real life, so it's no big deal if my videogame self makes a mistake. But I spent several long, long years learning how to urinate in the toilet rather then the floor, and having to relearn this skill just to play a game doesn't please me.
I think part of my problem is that I like games more than toys. The Sims feels like more of a toy to me -- and I am not using the word "toy" in a disparaging sense. Rather than having objectives, scoring, and winning conditions, the Sims just kind of is. That's not to my taste.
But (clearly!) a lot of people like that aspect of it. Jenna, for example, really enjoys the feeling of omnipotence the game brings to her:
It's a control thing. I tend to play it more when my life feels less controlled, or when I'm broke. At least I can make *their* lives work, kinda thing. More than anything, I mess around with their houses. Shopping without spending real money, you get the idea. It's satisfying to me when I can keep everything running smoothly.So for some people, the game is a stress-release, and for others, like me, it's a stress-generator. Dave Rochberg is a fellow Sims-hater who finds the game makes his blood pressure go up:
Twenty minutes into the game, my character desperately needed to pee and his carpool showed up outside the door and started honking. I thought "I'm capable of generating this sort of stress in real life" and I've never played since. Want my copy?Personal to Dave: no.
One of the interesting aspects of The Sims is that a lot of people who love the game don't actually play it. I'm being a little cute here, but what I mean is: by one estimate, about 25% of the people who play the Sims never actually "run" the simulator. They spend the majority of their time building their house, planting flowers, buying furniture, and creating a little virtual world, without actually getting engaged in the "activities" the Sims pursue. I think Sue, while not strictly embodying this way of playing, reveals some of the attitude:
I think it all started with the God complex...'So, you're telling me that I can create little people and then tell them what to do? And if I tire of them, I can lock them in a box and watch them die a slow, lingering death? Sweet!'The splendiferous Tilt weighs in as well. Tilt is the anti-Susan. Where she sees the game as something beside the point, he is focused on levelling up his little Tiltettes until they are earth-destroying monsters able to rake in the simoleans and seduce their neighbors at will:
I'll admit that, in it's pure form, the Sims is a tedious, repetitive game that holds no interest to anyone, but there are few folks who actually play the game the way it was built. There are cheat codes galore (including programs users have created that allow you change everything about your sims at will), millions of fan sites are available for downloading new content (outfits, furniture and other decorations) and more. Anyone who actually plays the game (get up, shower, eat, go to work, come home, shower, eat, raise a skill point, go to sleep) is missing out on the actual fun.
Now, I'm mainly an architect and landscape/interior designer. I get my kicks building new homes, vacation spots, stores, etc. and making them look cool. I may also enjoy occasionally creating photo album stories, but I'll deny it in public. I doubt this is a convincing argument, since you either love the game or hate it (my boyfriend can't understand the fascination), but it keeps me happy and that's enough for me.
For me, The Sims are like the absolute essence -- the potent, purified, crack-like absolute evil, that by all means, should NOT be microwaved -- of CRPGs. You've got a little avatar (or possibly a party) that start out unable to cook even a simple meal or screw in a lightbulb without facing the threat of imminent death. You've got little quests: get to work on time; don't get lonely; don't wet yourself. You've got the promise of interesting objects to acquire or new areas to unlock, and never quite enough time in the virtual day to do them before once again you've got pee, eat, or work. It's that horrifying, fascinating, and satisfying death trap: the karmic hamster wheel of unending 30-minutes-or-less short term rewards.Does this mean that Tilt has already tired of Doom 3? Only amazon.com knows for sure.
(This, by the way, is also what's causing me to obsess about City of Heroes, you rat bastard.)
I think what makes The Sims so fascinating to such a broad range of people is the very everydayness of it all. It's a sandbox that's eminently relatable-to. The irony is never lost on me that I often put off my own need to void myself in favor of helping out my little puppets; or that, on the other hand, my attentiveness to kitchen tasks often improves after one of my infrequent but epic couple-day jags of playing this stupid, stupid game. Once I thought, "maybe I'll try building my own apartment, to see how the game flow works," but then got sucked into the hours-long task of building a self-sufficient dyad and then instead of patiently accumulating simoleans, instead introducing rampant and malicious instability into the system. I've never really been drawn into the "traditional" addiction games, like Civ or SimCity, but once I start empathizing with these little bits of willful code, I end up forsaking family and friends for just a little too long, playing temporary god, voyeur, and trickster, until I burn myself out and swear (once again) "never again."
So naturally I've pre-ordered The Sims 2. I mean, holy cats, have you seen the graphic engine on that thing?
I'm not going to be joining in on the Sims 2 frenzy. I've come to accept that my brain just doesn't have whatever wire The Sims electrifies in some people. One question that has (fairly) been asked of me is: how can I reject The Sims if I'm willing to spend time growing flax in A Tale in the Desert? My answer has to do with progression. Somehow, in the latter game, I feel that I'm working towards a more tangible goal. if all I ever did was grow flax, I'd be bored with it in a week. But since the technology in the game is constantly changing, the activities you're engaging in are too; this week I'm mining, perhaps later I'll be fishing or mastering some other task. In The Sims, even though you may acquire a new item or meet a new "friend," the basic routine never changes: wake up, go to the bathroom, wash, eat, work, home, eat, clean, friends, sleep.
I think The Sims occupies a unique space in the gaming biosphere. I'm glad it exists,. But I'm also glad that I'm not playing it.
What games do people go crazy over that you don't like?
September 13, 2004
The article on The Sims, and why we love (or, in my case, hate) it goes live tomorrow. If you want to get your $0.02 in, it's now or never. Send your submissions to email@example.com.
So far, most of the submissions are from Sims
addicts aficionados. Surely, I can't be the only person out there who just Doesn't Get It? Send me your take on it.
September 11, 2004
In addition to an orgy of Madden Football, I've been playing a lot of RPG titles lately. I'm still in the early stages of both Knights of the Old Republic and Mario and Luigi, the latter of which I've already written about.
These two games seem completely different. Mario is a sort of platformer/RPG hybrid, while KOTOR is described as an epic story with complex character development. These characterizations may be true, but I think if you look past surface elements like presentation, graphics and combat engines, you find that they are really the same game.
For those who haven't played the games, here is a summary of what goes on in each one.
In Mario and Luigi, you control both brothers at the same time. They are sent on a quest to rescue the Voice of Princess Peach. The voice has been kidnapped by Cackletta who has also stolen a trinket of great power and plans to use the voice to unleash death and destruction on all the kingdoms of the land. Or something. Mario and Luigi have to travel to the Bean-Bean kingdom, rescue the Voice and save the world.
In KOTOR, you start out as a second rate nothing officer on a Republic ship that crashes on some shithole planet out in the middle of nowhere. You must go on a quest to first rescue a warrior who plays a central role in the current war that the Republic is involved in and in doing so start a journey toward your ultimate fate as a powerful Jedi who will turn the tide and save the galaxy (or not). KOTOR introduces a twist in the classic quest structure by allowing you to play the bad guy if you want. But ultimately, assuming you've picked a path, and that path is light side (which everyone does first), both games basically have the same high level structure. The light/dark side twist mostly serves as theoretical replay value.
But, the similarities between these two games goes far beyond high level structure, I think. After all, all RPG games are basically quest stories. So here are other similarities.
- Both games have turn based combat systems that also reward a good sense of timing. The combat in both games also gets deeper and more complicated as the game goes on.
- Mario lets you use various interesting cooperative attacks to defeat your enemies. The Zen of KOTOR is that you can control everyone in your party and using this to your strategic advantage is crucial in winning battles.
- In both games, you eventually get force powers, er semi-magical, attacks to compliment your mad melee skills.
- In KOTOR, you collect credits to buy medpacs and stuff. In Mario you obtain coins to buy magic mushrooms and stuff.
- Both games have annoying mini-games that you have to suffer through once in a while.
- Both games take you through a wide variety of settings, all of which are visually distinctive. In Mario, it's various areas of Bean-Bean. In KOTOR, it's different planets.
- While both games provide diversions, the structure of each is essentially a linear walk through the story, although Mario doesn't really have side quests per se.
Having not played many computer RPG titles in my past, I found these similarities to be rather striking, but more seasoned gamers probably think I'm a raving lunatic for making such a big deal of the obvious. But, perhaps the more interesting story here is how each game takes this basic shell and wraps it in a completely different style.
Mario and Luigi is completely light hearted and utterly lacking in pretension. What it has is a wide variety of colorful and enjoyable settings, game-play that is so tight it is almost perfect, and a design and balance that allows the player to be challenged but hardly ever die, even when they suck as badly as me. As I've written before, the combat and puzzles, in particular, are marvels of gameplay design and an almost perect mix of real time and turn based mechanics. I mean, how can you not love a game that lets you control *two* main characters at once and makes it easier than most games make controlling just one.
KOTOR's gameplay is not nearly as well tuned as Mario. You find yourself fighting with the controls and screaming in anguish as your little computer people run around like morons doing things you didn't tell them to do. The game also takes itself just a bit too seriously. But, it makes up for this by weaving a more complicated tale and manages to almost make you believe that your actions have had some effect on the narrative, even though it's a lie. Not many games make you feel guilty for playing the bad guy, so this is not a non-trivial achievement.
September 10, 2004
In a press conference today, NASA Director Sean O'Keefe announced the preliminary findings of the Genesis space probe. Genesis, which succesfully engaged on a 3-year mission to explore the solar winds before crashing to Earth when a parachute failed to open, was salvaged from the Utah desert and moved to the clean room facilities of the Jet Propulsion Lab in Pasadena, California.
"Thanks to the hard work of the recovery team," said O'Keefe, "we have completed the processing and analysis of approximately 98% of the samples, and can now announce our preliminary results: the 'solar wind' that is blowing from our Sun is composed primarily of dirt."
"The majority of the solar wind is silicon dioxide, comprised of particles ranging in size from 0.063 to 2 mm, but a variety of other compounds and substances are present in trace amounts, including alumina, ions of potassium and magnesium, and nitrogen. Surprisingly, the particles we found -- despite their extraterrestrial origin -- are very similar to topsoil samples taken in southern Utah. While I don't want to wax philosophical, this coincidence does emphasize that the Earth is, indeed, a child of the Sun. It really makes you marvel at the complexity of our Universe."
In addition to determining the chemical composition of the solar wind, NASA has announced other findings as well. "Many of the gold, sapphire, silicon, and diamond wafers inside the Genesis capsule were shattered, as if they had suffered some sort of blow, or severe impact. This leads us to conclude that the solar wind is stronger than we had previously imagined, and presents a potential risk to near-Solar spaceflight. This may affect the design of future spacecraft."
O'Keefe was reluctant to discuss the crash itself, which has been the latest in a string of embarassing equipment failures at NASA. "Our engineers are still studying the data. Our current best theory is that the constant buffeting during reentry caused either an overabundance of bogons or a temporary dearth of relions in the parachute release mechanism. Some of our best quantum bogodynamicists are pursuing this path now, but really, it's far too soon to say for certain what caused the event."Inquiries about this article may be directed to firstname.lastname@example.org.
September 08, 2004
In my article Software Development Considered Harmful, I talked about a number of mistakes that are often made by developers who should know better. I'd like to expand on one of them here.
Never send a human to do a robot's job.
A lot of the code we have to write to make programs run on modern platforms is code that can be more effectively generated by programs than by a human. This is particularly true of things like XML files or other structured data. Let me put it simply: if you're editing a file that contains structured data by hand, you're making a mistake. You're editing the Info.plist in a Macintosh application bundle by hand using vi? You're making a mistake. Editing your DNS/BIND zone info files by hand? You're making a mistake. Creating RSS feeds by hand? You're making a mistake.
I'm overstating the case a little, of course, but not by much.
I generally see this sort of mistake made by two classes of people. The first are sysadmins who don't have access to adequate tools and don't have the desire or ability to learn how to write them themselves. I mostly sympathize with these folks, whose only option is basically "hope someone else writes a tool that does what I need." (When I was in this position, it motivated me to learn to program, but I understand that not everyone wants or needs to learn a new skill.)
The second group of people I have less patience with: developers who somehow have gotten the idea that it's more impressive to start a fire by banging two rocks together than by using a match. These are people who know that tools exist to do what they are doing, who know that the tools will do a better job than them, more consistently, at generating provably correct output, but who still dive in anyway because they don't want to bother learning a new tool.
You see this a lot with developers who want to write an app for Mac OS X who have come from a pure Unix background. Yes, OS X is BSD under the covers. Yes, there's a shell prompt. Yes, it is conceivable that you can write an application that requires the user to install (non-framework) shared libraries and wants to create .rc files and acts like a Unix app, and doesn't require you to build an Xcode project, or use the Property List editor to create a property list. But just because something is conceivable doesn't mean it's a good idea. Xcode (or Codewarrior, or some IDE that has robots to do the drudge work for you) is the correct solution. If you start writing shell scripts and makefiles to solve a problem that was solved long ago by someone else, you're screwing up.
There is no other side to this coin: if you reject superior tools because of some misplaced Slashdot-begotten "artisan" ethos, you are saying that you think it is more important to work on boring, stupid problems that other people have already solved than it is to work on something important. How many bugs lingered on in Linux because of Linus's completely irrational and wrongheaded belief that using a kernel debugger means you're less of a man? (Or the belief that a number of developers who worked on Linux's old TCP stacks had that memory copies are effectively free; but that's the subject of a rant for another time.) There are other examples, of course, but suffice it to say that this isn't a theoretical concern. I see developers trying to end-run around Apple's admittedly ugly and clumsy IDE and toolset (or, on the Windows side, Visual C++) all the time. It always causes more pain than it saves.
We all like to gripe about users being dumb, but in some ways users are extremely smart. In particular, many users grew up watching Sesame Street. They are extremely good at playing "which one of these is not like the other? Which one of these does not belong?" Every platform has its own natural development environment. The more you, as a developer, diverge from that development environment, the more likely your app is going to feel "different" from other applications on that platform. If you're writing an app for an X windows environment, where everything being inconsistent and utterly broken is the norm, that's not such a big deal. If you're writing an app for the Windows or Mac OS environments, where users expect applications to look and behave in a consistent way, it's the kiss of death.
There's a corollary to this discussion, which is that some of the best use of a developer's time is spent writing code to generate code. I love generated code, because when I find and fix a bug in the code generator, I've really fixed every possible instantiation of that bug in one fell swoop. And often, debugging generated code is easier than debugging handrolled code, because you tend to have the same bug in many places, which usually makes it easier to reproduce.
It's fine to eschew the use of sophisticated tools for personal projects because you want to know what's going on under the hood. But if you're going to give that car to someone else to drive, be a responsible mechanic, and use the best tools you have available.
Let the robots write the boring code, so that you can focus on the problems that really need your intellect.
September 07, 2004
I want to like The Sims.
A large number of people whose opinions I respect adore the game. The graphic sensibility in it is bouncy and fun. The sound design and music are top-notch. The game has a sense of whimsy and humor. The ideas are clever, and the amount of customization you can do to your characters and their surroundings is practically unlimited.
And it bores me. It bores me to tears.
I'm preparing an article on why I feel this way about The Sims, but want to enlist some help from others who have played it. I'm particularly interested in those of you who do like the game: why do you like it? What absorbs you? When you play the game, what do you spend your time actually doing? I'm looking for just a couple of paragraphs that summarize these aspects of your experience in The Sims. Submissions from those of you who dislike the game are welcome, as well. Please email your submissions to email@example.com.
September 06, 2004
The kids section is fun, everything is hands on, and the staff is (as should be expected) friendly and knowledgable. Three cheers for genius (and CMU grad) Meredyth for giving me the tour. Plenty of Birkenstocks were in evidence, as was lots of brand new, shiny merchandise. I don't even need a new Mac and I found myself glad that I left my wallet in the car.
I believe psu may be following up with some photos of the opening day's line soon.
Update from psu
Here is my picture of the line. This is from about 1/2 of the way in, and you can almost see the head of it three blocks up. The car in the foreground is iconic, I think.
September 03, 2004
"The power output of an engine [equals] the size of the bangs, times the number of bangs per minute that you can manage to get."
Keith Duckworth -- Cosworth Engineering
Before his second careers as an author, commentator and announcer for Speedvision, Steve Matchett was perhaps best known for being one of the Benetton mechanics who caught fire at the German Grand Prix in 1994 (you should really watch the video for the full effect -- it's quite stunning that no one was killed.)
In The Chariot Makers, Matchett discusses his final trip to New York to work for Speedvision, around the tragic events of September 11th. Stuck in an Air France executive lounge with some wealthy and quite stereotyped British men (I half-expected to see "Pip! Pip! Cheerio, old boy!" whenever I turned a page), Steve and our public school lads pass the time by trying to build -- on paper -- the perfect Formula 1 car. In doing this, he takes us on a tour of the great leaps grand prix technology has made over the years (the first monocoque, the first carbon-fibre chassis, and so on) and also explains some of the tradeoffs that go in to building such a beast.
Matchett deliberately eschews the maths behind the mechanics, and goes directly for metaphor and example whenever possible. His written voice is, in fact, very much like the spoken voice he uses when commenting on races:
Blasting around the race track, a Formula 1 car sticks to the ground in exactly the same way that an aircraft doesn't... When the amount of lift generated by [an aircraft's] wings exceeds the aircraft's weight it will take-off. In the case of our Formula 1 car, the very last thing we want is for it to take-off. For, although this will certainly focus the driver's attention, it also has the tendency to sap his confidence.The Chariot Makers is about on par with Matchett's earlier book The Mechanic's Tale, which covered his experiences seeking (and getting) a job as a mechanic for a Grand Prix team. It's far superior to his initial foray into writing, Life in the Fast Lane, a somewhat breathless and obsequious catalogue of Benetton's 1994 season. Matchett is at his best when he is focusing on the technology and how it relates to the driver and the team. If he sometimes tries a little too hard to tell a story ("I say, Steve, old lad..."), we can forgive him because it's so clear that he is completely in love with the subject matter.
My one serious complaint about the book is that it desperately needs a bibliography. I understand -- and agree with -- Matchett's decision to not go into to excessive mechanical detail, but for those of us who wanted to delve further into the subject mattter, some pointer to other resources (other than "Get a job with an F1 team") would have been valuable.
Pip pip, cheerio, Steve.
You can find The Chariot Makers at Amazon.com, or at your local bookstore.
September 01, 2004
Cafe Anatolia is in a food court. An ugly food court, with a Chik-Fil-A, a greasy looking taco place, and an ice cream stand. There's nothing enjoyable about the surroundings. Don't take a date here if you care about ambience.
However, if your date cares about food, you could do a lot worse. There's a number of options on chafing dishes, available for inspection. I had stir fry beef, bulgur cooked with cumin and tomato paste, and turkish style leeks, along with a "shepherd's salad." The owner generously tried to cram about 4 other dishes on my plate, but I declined. Total damage: $5.50.
The food was good. If you've ever had Indian food from one of Sree's stands, I'd put it on about the same level: not high cuisine. Not even medium cuisine. This is the sort of food that you might get from a street vendor on a cold winter day -- but a street vendor you'd return to again and again. The main notes of everything I had were tomato, cumin, and to a lesser extent turmeric. I left satisfied and plan to return.
Turkish food is fairly underrepresented in Pittsburgh, so if you're like me it's refreshing to have a new spice palette on your palate. The stir-fry beef was OK, but not notably distinct (which makes sense, since it is clearly there as the 'meat' half of the formula that unadventurous businesspeople downtown are likely to try for lunch). The Turkish-style leeks were great. Braised until they were butter-soft in a light tomato broth, with sweet peppers and spiced with cumin, I want to try to reproduce this at home. I don't use leeks nearly enough in my own cooking -- they go in every stock and broth I make, but I generally don't present them as a vegetable on their own. Now I have a plan to do so.
The bulgur was an interesting alternative to rice (which is also available, if that's your style). The tomato lent it a nice tang, and it served as a good base to the other dishes. The shepherd's salad was primarily tomato and cilantro -- think tabooleh without the grain.
And, of paramount importance, the Turkish coffee was excellent.
It may just be the ethnic equivalent of the neighborhood hamburger joint, but there is no shame in that. I'll be going back to Cafe Anatolia. If you find yourself downtown with no lunch plans, give them a try.