Well, Gee.

Caliban Darklock wrote this in the early morning:

When IE7 crashed on me this morning, it was a terribly uncommon occurrence, and when I dutifully sent the error information to Microsoft, I was pleased to see that it came back with a link I could follow for more information. So I clicked the link.

This problem was caused by Windows, which was created by Microsoft Corporation. Currently, there is no solution for the problem that you reported.

This didn’t help me avoid the problem, but I did find it simply hysterical and laugh for several minutes, which rather improved my mood.

Not Job!

Caliban Darklock wrote this mid-afternoon:

Infospace has decided to withdraw their offer of employment, explaining that they really didn’t want to hire someone who was trying to move up into project management; they need someone who would be content to spend the next five to ten years making no appreciable forward progress in their career.

That actually explains a lot.

New Job; Great Interview

Caliban Darklock wrote this mid-morning:

I start my new job at Infospace on August 4th. I have no clue what my title will be; I’m going to be working in the test department, but also doing some development.

The interview process was grueling. My first contact was my future manager, followed by an aggressive and very bright developer who grilled me on C# concepts and was clearly pleased that he got to move into the more advanced territory.

We had one extensive argument over abstract classes which turned out to be a misunderstanding. I said an abstract class lacks implementation. He said an abstract class might have implementation. I responded that it must lack some implementation, and he insisted that an abstract class could be completely implemented. We argued intensely about this for some time before the equivocation fallacy came up: when I say “abstract class”, I mean a class which has one or more abstract methods. He means a class which is actually declared as abstract, an ultimately arbitrary distinction. Once we figured out the misunderstanding, the argument rapidly turned into vigorous head-nodding and retrospective agreement with one another’s points.

And that was awesome.

Looking back over the two decades of my career, I calculated that I’ve spent approximately 600 hours in interviews. Half of those hours were at Microsoft within the past two years. The end result of this is that I’m perfectly comfortable in interviews - they’re such a familiar experience by this time (occupying roughly half a day out of every week during the past two years), I don’t have any of the nervousness or anxiety I used to experience earlier in my career. I can walk into an interview, sit down, and just talk. I know pretty much what they’re going to ask, what they want to hear, and whether I can provide it. I can even call out my limitations beforehand without worrying about it - “I’m not great at the theoretical parts of OOP,” I said at one point. “Explain what OOP is,” my interviewer responded. “Abstraction, polymorphism, encapsulation, and inheritance,” I replied. He asked about abstraction; I described abstraction. He asked about inheritance; I described inheritance. He asked about multiple inheritance in C#; I said there was multiple inheritance of interfaces, but not classes. He slyly asked whether you inherit an interface, or implement an interface; I replied that this was just syntactic sugar, and under the hood you’re still inheriting. And that’s when he sat up and started asking the hard questions.

Ultimately, we came down to a coding test where I had to rotate a 4×4 matrix with the optimum number of comparisons. I got that question at Microsoft once, and I couldn’t answer it, but armed with the recollection of what didn’t work before - I managed to solve it. (I think the resulting code might actually be useful in a quaternion transform, but I’m not sure; I’ll have to test it.) Since I’ve had this question twice in interviews, I’m not going to give away the answer here, because it’s a tough question that’s both fun to solve and a great representation of abstract thinking.

After this, I was confronted by a member of the test team who looked way too much like Shaggy from Scooby-Doo. He was even wearing that ugly pea-green T-shirt. I had to restrain myself from asking him to say “Zoiks!” just once. His questions revolved around not only creation of test cases, but - in a radical departure from other test interviews I’ve had - how to manage test cases. What if something isn’t in the specification? What if the specification is simply wrong? What if there’s a contradictory requirement? What if management refuses to fix a bug that I’m sure is important? How do your test suites change when switching from black-box to white-box testing? There was the inevitable “how would you test this” question - a calculator, which was somewhat more interesting than Microsoft’s usual “soda can” or “Slinky” examples - where I focused primarily on things that almost certainly wouldn’t be in the specification.

He seemed surprised by this, so I explained at one point that there are many obvious test cases I’d skipped, like “does each number key produce the right number” and “does 5 - 3 equal 2″. Most people can see that a calculator should operate properly as a calculator, but I wanted to concentrate on the test cases that most people wouldn’t consider: impact resistance, battery life, tactile feedback of the keys, stability on slanted surfaces, vibration tolerance, environmental factors. So I did a quick rundown of the generic things any calculator should do, and he appeared satisfied with that.

The lead developer came up next, and focused more on the “soft” aspects of the position. How would I deal with other people, where did I want to go with my career, that sort of thing. He seemed surprised that I’m pointing myself in the direction of project management, and asked why I thought testing was the right route to pursue that. I pointed out that writing a test plan is a project, and managing a test team is a project, and coordinating a test effort is a project, and no matter what specific discipline you happen to choose it is fundamentally composed of encapsulated projects. The abilities and skills used to manage a project in its entirety simply don’t differ significantly from the abilities and skills used to manage the individual subprojects of which it is composed.

Finally, I spoke with my future manager again, who informed me that everyone was impressed but he couldn’t say anything official just yet. I was escorted to the elevators, went down to my car, and called the recruiter handling the position so I could tell him things went well. In the time it took me to reach the car (less than five minutes), they had already called him to make an offer and establish a start date.

I guess they like me. The feeling’s mutual; it seems like a really great company, and I’m sure it’ll be a blast working there.

XNA Community Games

Caliban Darklock wrote this in the early evening:

So Microsoft has this whole XNA initiative, and one of the things they’re unveiling for Holiday ‘08 is the Community Games portal where XNA Creators’ Club members ($99 annually, $49 for three months) can put their XNA games on XBox LIVE for anyone and everyone who has an XBox 360 to download.

Trouble is, you can’t put your game up there and charge nothing for it. You’re required to charge 200 points for a 50 MB game, and 400 for a 150 MB game. You may also opt to charge 400 points for a 50 MB game, or 800 points for a game of either size. The revenue split is 70% and paid quarterly; at the current rate of 1.25 cents per point, this means you can earn $1.75, $3.50, or $7.00 per copy sold, depending on your price point. Microsoft can also position and promote your game, for an additional 10% to 30% of revenue - reducing your cut to a minimum of $1.00 to $4.00 - under conditions that aren’t entirely clear.

Now, first off, this is a generous revenue split. Good luck getting anything even close to this from a normal publisher or distributor. One of the better avenues I’ve researched - Reflexive Games - gives you the same 40% Microsoft is offering at the bottom end of their scale, but never goes above that.

But what really chaps my arse is the sheer number of people who can’t stop whinging about the inability to offer their games on XBox LIVE for free.

I am so incredibly jazzed about XNA, I can’t stop gushing about it. I’ve constructed a pretty decent 2D Breakout-style game that’s actually fun to play. I don’t have to worry about the details of getting sprites on the screen and sorting them and rendering transparency; XNA handles all that for me. It took me just over a week to build a working game. Now here comes Microsoft to say that for under $100, I can publish that game on XBox LIVE before the end of the year and actually get paid for it. That rules. This has changed everything - I’ve had this dream of building an indie game studio for over a decade, and now here’s exactly the channel I need to make that dream a reality.

But the community is divided over the relatively minor point that you can’t give your game away for free over that same channel.

And that’s rather a shame.

Much Smartness

Caliban Darklock wrote this around lunchtime:

It is with some shame that I read this article on warnings.

I know this. I have known this for years. I have, indeed, lectured people on the superiority of “Undo” to warnings.

And yet, through all those years, I have continued to instinctively and automatically add warnings to my programs for one and only one reason.

It’s easier.

Adding a warning to a program is laughably easy. You say “this could do something bad”, and type something like “if(CreateOKCancelDialog(”Are you sure?”)!=ID_OK) break;” and you’re done.

It’s not as easy to make an “Undo” framework part of your foundation. When we start, the application is small, there are few operations, nobody really makes mistakes. It grows, we add more functionality, it becomes more complex. We don’t notice. We’re frogs in the boiling water. We find other people confused, and we create a training program, because it’s easy. This works for a while, but not forever. Eventually, “Undo” becomes unequivocally the Right Thing, and then it’s too complicated and there’s no time and it can’t be helped.

We need undo. Period. End of story. That’s what has to sit at the bottom of the application from day one, because we are going to need it. We should know that. Stop it with the warnings! Undo! If you don’t have it, you need it, build it! If you do have it, use it!

Those of you who work with me are going to start hearing a lot more of this.

More Thoughts on Argument Passing

Caliban Darklock wrote this terribly early in the morning:

Giving some more thought to my argument with Orochimaru last week, I’ve coalesced an idea.

Whenever you are going to pass information over the network, strong typing on the sender side is irrelevant.

It doesn’t matter what the other side did, once you retrieve data from the network, it is to be treated as potentially hostile regardless of other factors. That means you need to directly verify and validate everything you get. You need to establish what the data is supposed to be, whether it was provided in the proper format, and whether the data itself is acceptable.

There are, of course, a great many ways to do this. But in the end, you still do the same things: establish the purpose of the data item, identify the rules regulating that data item’s permissible content, and verify that the data itself meets those rules. There is simply no way to avoid this. You can make the sender jump through a great many hoops to give you something that he has already validated, but all this allows you to do is create a mismatch between his rules and yours. You never actually avoid the necessity of validating the data against your own rules. It’s a false economy.

Your Free Software Company Probably Sucks

Caliban Darklock wrote this terribly early in the morning:

I frequently try to help out small businesses who are getting their start in the hectic world of free software. They usually have a setup where you can download the software (which generally goes on a web site) free for personal use, but if you use it commercially, you have to buy a license. Frequently, the personal-use license comes with certain advertising and link requirements. Meanwhile, the commercial-use license loudly proclaims the high level of service and support you can expect.

I don’t trust marketing materials. I want you to walk your talk. So my first order of business is to ask for support in the form of a custom license before I buy.

My thinking goes like this. Right now, you don’t have my money. Provide me this special consideration, and I will give you money. That’s what we call an incentive. Once you have my money, you don’t have incentives anymore unless you continue to charge money for your service. Your level of commitment to my satisfaction will naturally and necessarily decrease after I buy my license.

So I’ll ask something like “hey, can I get a commercial-use license that has the same advertising and link requirements as the personal use license?” - and that’s frequently the only practical difference between the two. So what I’m asking is “how much of a discount will you give me for perpetual advertising?”, and I’m not particularly worried about it. What I’m trying to find out is, how much do you value your commercial customers?

A commercial customer, after all, doesn’t just have one domain. I have over a dozen. I host thirty more. If you charge $50 for a license, I’m in a good position to make you as much as $2,000 if I like your software. People also recommend software to people like themselves. Whereas Bob down the street is going to talk to Joe down the street who would get your software free for personal use, Caliban the owner of Darklock talks to Sam the owner of Aevum who would pay $50 for it. I’m a much better business opportunity than the average random dumbass who logs onto your web site.

The best possible response - the one I expect from a truly professional company - is “we’d be happy to give you that custom license, but we can’t discount the software for you”. But the response I get is almost always a demand that I explain why I want this license because it’s a stupid request.

Strike one. Don’t call your prospective customer stupid.

When I explain that I want it in the license so I don’t have to account for it specifically in the terms of sale for the site if I ever sell it, they respond that if I sell the site I shouldn’t care what the new owner does.

Strike two. Don’t tell your prospective customer how to run his business.

When I observe that this is hardly a high level of service and support, they respond that I shouldn’t expect service and support for weird things nobody else wants.

Strike three. Don’t tell your prospective customer he’s the one with the problem.

Now, as far as they’re concerned, this is $50. They don’t care. “I’m not modifying our license agreement for a lousy $50!” It doesn’t occur to them that people frequently ask me how to build web sites. It doesn’t occur to them that I personally have five other places I want to install their software. It doesn’t even cross their minds that when someone says “what do you think of this software?” I’m going to tell that person what complete jerks they were when I wanted a custom license.

And if they’d just copied and pasted one little paragraph from the free license to the commercial license, they would have had a customer. It’s thirty seconds of effort. If you won’t invest thirty seconds editing a license for $50, how can I trust you to invest four hours fixing a compatibility issue with IE7 for nothing?

I used to run a pure open source contracting firm. We damn near went bankrupt. Then I became a Microsoft partner, and the world opened up for us - doing open source work. The same clients who wanted nothing to do with a pure open source solution were perfectly happy to hire us for an open source solution after we had shown them an ASP.NET proof of concept. It was a signaling device.

So, too, are the requests I make to free software companies signaling devices. I’m not some college kid who can afford to spend three weeks configuring your product. My time is money. I won’t be the one configuring it; I’ve got someone I pay to do that. Every hour he spends doing it costs me money. If your software needs to be upgraded every week, it had better not take three hours to upgrade. If I need to ask you for support, I’d better get it, and fast. If I have to play games with you, I can’t use your software.

And that’s why you still live in your mother’s basement, even though a million people use your software and think it’s the greatest.

Automated Skill Assessments

Caliban Darklock wrote this in the late evening:

Today, in the furtherance of a job qualification process, I took an automated skill assessment. I inherently distrust these. Here’s an example of the kind of question I was given.

Which SQL statement will produce blah blah result?

a) SELECT blah blah FROM Table1 JOIN Table2 blah blah

b) SELECT blah blah FROM Table1 LEFT JOIN Table2 blah blah

c) SELECT blah blah FROM Table1 RIGHT JOIN Table2 blah blah

d) SELECT blah blah FROM Table1 CROSS JOIN Table2 blah blah

Now, given the actual parameters that I’ve obfuscated with “blah blah” above, the correct answer was (b). A left join produced the desired results. But here’s the issue.

Given specific perfectly reasonable conditions of the data, any of the available options could have produced the desired result. No answer was universally wrong, but only (b) was universally right. The key factor was what one assumed about the data and its referential integrity. If you made a slightly different assumption, you could select any of the answers. And what worries me is that I don’t know what the test author’s assumptions were.

I would like to think that the author of the test knew SQL better than I do, since I don’t consider myself sufficiently qualified to write such a test, but the reality is that test authors are frequently interns or other barely-skilled people. Indeed, what if there’s just a typo in the answer key? It worries me.

That’s about it. Nothing profound here. I’m just sitting here worrying about something I can’t control, which is irrational and unproductive, but somehow I can’t stop doing it.

Investments and Solutions

Caliban Darklock wrote this mid-afternoon:

So back to the question of Solutions and Investments that I started covering this morning…

The fundamental error in most libertarian arguments I hear is the failure to clearly recognise that removing a problem is not the same as providing a solution. This isn’t in any way a criticism that libertarians don’t understand the situation; it’s simply a criticism of the way they explain the situation as they see it. Without that elucidating plan for what goes in the place of (say) our public school system, and the explicit recognition of how that system hooks into the rest of our political and economic systems, there is this vast gulf of uncertainty.

Now, I do have faith that something could go there, and that it would be a Good Idea, and that it would indeed make things better. But I am not smart enough to know what it is, and I do not trust you to be smart enough to know what it is either. I believe that if you were smart enough to know what it was, and patriotic enough to want the problem fixed for the sake of America, and humble enough not to care if you get the credit - you would tell everyone who would listen.

I don’t know which of those things are missing. I don’t know if the argument leaves this gap in the plan because the speaker doesn’t know what the solution is, or intends to somehow profit from it, or just plain demands that he get all the credit. And it doesn’t really matter, because if any of those things are the case, I don’t want him (or her) solving our nation’s problems. So what I need to hear is some assurance that the person planning to gut the system has some idea how the hell things are going to keep operating.

The libertarian rhetoric is simply too revolutionary. It’s like the Boston tea party. It may feel like a great blow for democracy when you market it properly, but it’s still theft and destruction blamed on an innocent third party. It offends me to propose we steal someone else’s property, destroy it so nobody can benefit, and then point the finger at a group we don’t like. The government belongs to the people. All of its systems belong to the people. When you propose that those who dislike a “bad” system steal it from those who do like it, then destroy it to prevent anyone from using it, and finally point the finger at the people who developed the system as though the creation itself were an invitation to steal it… there is something fundamentally immoral and unjust about that.

It’s a case of two wrongs don’t make a right. Yes, Britain charges too much tax on tea; yes, the public school system is fundamentally ineffective and counterproductive. But it will not make things right if we throw the tea into the harbor and shut down the schools. It will just make people angry who weren’t angry already, and it seems like that’s what the people who are already angry really want. They want everyone else to be angry, because once someone gets angry, you can point him at a target you want destroyed and he’ll just blindly direct his rage toward it.

Most libertarians aren’t angry, of course. They honestly believe in the inherent goodness of their fellow human beings, and the inherent superiority of the market, and in the long term they’re completely right to believe in those things. But some few libertarians ARE angry, and those few draw little distinction between liberty and anarchy, and in the near term it is just monumentally stupid to ignore them. There is simply too much potential for abuse in the libertarian platform. There is a great potential for good in the platform, too, and it would be irrational to ignore that - but I, for one, need assurances that there will be more of the good than of the abuse.

Virtual PC Rocks.

Caliban Darklock wrote this around lunchtime:

I missed playing Master of Orion. I dug around in my archived boxes of geeky stuff I’ve saved over the years, and I came up with the CD. Unfortunately, it doesn’t work for crap under XP… hmm, a 15 year old game that doesn’t work on XP. How unusual. But luckily, I have Microsoft Virtual PC 2007, which will let me run a whole DOS system in a virtualised environment… if I can just get DOS installed on it.

So I said to myself, “Self,” I said, “you have the install discs for damn near every operating system you’ve ever used - surely there’s a DOS install disk somewhere around here.” And sure enough, I came up with a PC-DOS 7.0 disc which was legitimately licensed. (I have OEM disks for MS-DOS 6.22, but they’re tied to the hardware that bundled them, and I’m certainly not using that.) Only trouble is, I need a floppy image to boot and load the CD driver. So I go out online and grab a DOS 6 boot disk image off someone’s web site, and it turns out to be an executable that wants to write itself to a physical floppy. I don’t have a floppy drive. What do you think I am? The only things I have that take floppies are a Mac SE and an EMAX-II sampler, and neither of those is going to be booting DOS. So I searched around some more and eventually found an IMG file for DOS 6 complete with CD-ROM drivers and a useful set of utilities.

It was pretty trivial to set up the virtual machine with a vintage-standard 32 megs of RAM and 2 GB hard disk - many programs at the time used signed integers to represent megabytes of RAM and megabytes of disk, so 64 megs of RAM frequently made things puke, as did 4 GB of disk. It was just as trivial to boot off the floppy image and get PC-DOS installed off the CD, which I ripped to an ISO for simplicity. Even ripping the MOO disc and mounting the ISO for the game install went without a hitch.

What wasn’t trivial was racking my brain to remember how to manage memory on DOS; I had to convert extended memory to expanded memory using EMM386, then load DOS in the HMA with UMB support so I could relocate the mouse and CD-ROM drivers into specific areas allocated in the EMM386 command line. MOO needs 575K of free conventional memory, and if you just throw everything up there you end up with about 540. After futzing around a little, I managed to get mem/c to show 604K free, which is about as good as it gets. I also needed to look up the stats on the SET BLASTER line so I could tell the game where the sound card was (port 220, IRQ 5, DMA 1).

After a few hours, most of it spent trying to remember the exact syntax for bizarre bits of system trivia, I managed to get a system together which happily booted PC-DOS and ran MOO. And now that I’m taking a break from the nostalgia of 320 by 200 graphics and truly stupid AI, I got to thinking about this and said to myself, “Self,” I said, “this is pretty damn cool.”

I mean, honestly - think about it. I downloaded Virtual PC free from Microsoft. So can you. I have so much computer on my desk, I can run another computer inside of it, and not only do so at a perfectly reasonable speed… but still have enough system left to run my usual applications. When I get a wild hare up my ass and want to play some game most people don’t even remember, the tools are at my fingertips and I can have it up and running the same day. The web has transformed everything. I don’t have to know someone who has a DOS boot floppy; I can just hit Windows Live Search, and it’s there. Once upon a time, it was a big deal to download a whole meg; now I have broadband. The world is different now. And while you might complain about the demise of social behavior and the new isolationism, to a geek like me, this is pretty damn cool.

You can keep your social behavior. I have Master of Orion.

Come to think of it, I have a whole bunch of other old DOS games, too…