Disable All You Want
I’m not one to disagree with Joel, but I actually think I will disagree (sort-of) with this post.
Personally, I have no problem with disabling menu items (graying them out), and I have no problem with showing / hiding items in context sensitive areas of your UI (be they right click menus or elsewhere). I think disabled items give a quick indication of what you can and can’t do given your location current context. How horrible would it be to think you’re inside a table and click something to format it, only to get an error saying “You can’t do that because you’re not in a table,” then you click OK, then you click in the table, then you go back to your menu. That extra error box plus OK click can get real annoying real fast, whereas grey text tells you quickly that you’re in the wrong place. Hiding items is fine too, so long as you’re hiding the items in areas the user understand are context sensitive. Right click is always assumed to be context sensitive, but properties windows, and certain toolbars could benefit significantly from some amount of context sensitivity.
I will say, though, that I absolutely agree that a disabled menu item should always be able to display a descriptive reason for why its disabled. In addition, hidden items should only be hidden from areas that are known to be context sensitive. If an item is hidden, a user should still be able to find it in the menu, find that it’s disabled, and get a reason why. I think a tool-tip or similar is sufficient for when you see the grayed out item but have no idea why it’s disabled, but of course in the desktop application world support for that can be fairly limited (last I checked) which is why almost no companies do it, which is what is irking Joel (I think).
So in conclusion, hide and disable all you want because I think even the general user can work faster seeing disabled menu items and hiding unnecessary commands. Just be sure that when you hide or disable, the user can find out quickly why you’ve hidden or disabled the item. That assertion’s nothing new, though. Chris Crawford called for that in his self-published Understanding Interactivity some 8 years ago.