Microsoft has dozens of buildings on its main campus, and teams are sometimes split across different buildings. Early in my career, a teammate from another building reported a bug with a certain feature. I couldn't reproduce the problem, so I walked across campus to watch her reproduce the bug. Instantly, we figured it out—she was invoking the feature by right clicking the GUI, while I was invoking the feature by double-clicking the GUI. It never occurred to either of us to mention how we were invoking the feature since both methods should have worked identically. But in this particular case, one method caused the bug and the other did not. That's the day I learned even the best repro steps invariably omit some details, and there's no substitute for seeing something with your own eyes.
But I'm sure you've already discovered that for yourself. Watching someone reproduce the bug makes it far easier for you to duplicate it on your computer. If nothing else, watching the repro steps lets you eliminate the possibility of user error. Seeing the bug also highlights any repro steps the user neglected to mention. Wouldn't customer issues be remarkably easier to debug if you could actually see the customer reproduce the problem each time? Of course, you could accomplish this by flying an engineer to each customer, but that's expensive. Great news—collaboration features from.NET and third parties might make viewing customer issues from the comfort of your own office a reality.
The absolute best-case scenario is if the customer's Windows domain is configured so that you can set up a Windows trust from your domain. In that case, you can use.NET's remote debugger to see everything about the customer's problem, just as if it were occurring on your own computer. But don't hold your breath on this one. Remote debugging is a great technique for two computers inside the same firewall. But as we discussed earlier, this feature doesn't scale to the Internet very well. Unfortunately, I've found the number of customers for whom remote debugging is an option to be so small that I usually don't even bother asking anymore.
On the other hand, there exist third-party tools that are more practical to use. My favorite is a web-based tool named WebEx OnCall. Except for a slight time lag caused by network delays, using WebEx OnCall is almost identical to actually being at the customer's site. Without having to preinstall any software, you can create a secure connection that allows you to see in real time everything occurring on the customer's desktop. As the customer moves her mouse or types at her keyboard, you also see the mouse move and the text appear, so you can discover the exact set of repro steps by watching as the customer demonstrates the bug. Better still, if the customer is willing, you can even take over the connection and manipulate the customer's desktop from the comfort of your own office.
It's impossible to underestimate the value of that feature. When searching for configuration bugs, developers usually don't know what they're looking for, but they'll recognize it when they see it. Rather than asking the customer to look over all the Windows Group Policy and .NET Framework Configuration settings for non-defaults, the developers could view the list for themselves. Meanwhile, the customer sees everything that is being done and therefore doesn't need to worry that private files are being stolen. If the customer ever feels uncomfortable, he can simply stop the connection.
The other advantage of controlling the user's desktop is that you can help customers do routine tasks they may not be familiar with. For example, many .NET applications fail to run because a customer had configured her Code Access Security (CAS) Policy to be prohibitively strict. (We'll discuss CAS Policies later in this chapter.) But for the customer to run your application, you may need to teach her how to change the CAS Policy. Describing that over the phone will confuse most users, but since tools like WebEx allow you to control a user's machine, you could visually walk the customer through whatever steps are necessary.
I highly recommend WebEx OnCall, but several other vendors produce fine competing products, such as PC Anywhere or PlaceNet. Even Microsoft has a few offerings. Microsoft NetMeeting provides similar functionality to WebEx OnCall, and Microsoft Windows Remote Desktop (formerly known as Terminal Server) allows you to remotely log in to any Windows server if you have a valid user account on that machine. Windows XP even includes an entire set of APIs for building such collaboration directly into your application. But of course, not all tools are equally good—some don't work well with firewalls, or require installing software on the customer's machine, or offer little security. You should try out each product before committing to a purchase.