Open source and quality

A recent SD Times column by Allen Holub questions the quality and customer focus of Tomcat specifically and open source projects in general.  The picture painted there is pretty bleak:

  • Spotty documentation
  • Condescending attitude toward non-expert users -- "arrogance, elitism, and general contempt"
  • Half-implemented features
  • Poor code quality -- "poorly structured, poorly documented and poorly written"

This is exactly the opposite of the direction that Visual Studio and .NET are going.  We have a number of efforts underway to significantly improve the quality of the product that we ship.  In my group, we've made some good strides in the Whidbey product cycle.  Some of these are engineering changes -- taking time to write tools that improve how we test the product, improving the robustness of tests so that we can spend our testers' time on higher value-add activities, etc. 

Our community work is also a part of this -- the more closely connected we are with customers, the more likely it is that we will deliver software that they love, that fits like a hand in a glove.  We are by no means done, but my hope is that we get better at this every milestone and every product cycle.

What parts of the Visual C# product do you love?  Perhaps we can do more of those, or more things in the same vein, in future product cycles.  What parts do you tolerate, dislike, or hate?  We'd love to fix those pain points.  It all starts with your feedback.  Feel free to post here or email me privately.

Happy C# coding!


Comments (24)

  1. Minh says:


    This is exactly the opposite of the direction that Visual Studio and .NET are going


    And you’re probably paid for your work, too. 🙂


    What parts do you tolerate, dislike, or hate?


    The part of the IDE that auto-hides until you mouse hover over them. Seems like a good idea at the time, I’m sure, but I’ve mistakenly activate this feature SO many time. It may not be so bad if for the majority of the time, VS freezes momentarily before popping out the Solution Explorer, Dynamic Help, etc…

    Don’t get me wrong, I love the auto-hide. But I won’t mind having to click to bring the tab back out. With the above mentioned "feature", I find myself having to purposefully avoid those tabs — they scare me now! Software shouldn’t scare people (except DOOM III).

  2. e says:

    A man writes a article about his issues with tomcat and the community that fosters around it and makes a attempt to say all open source applications are like tomcat. Then a microsoft employee picks up that article and uses it as a selling point for Microsoft’s product. I dont know which is sadder your post or his fuzzy logic.

  3. Thomas Eyde says:

    I don’t know where to start. Basicly I think C# is too static, complex and verbose. There are so much you have to type which does not add value. C# 2.0 is getting even worse with a gazillion of new keywords.

    The switch statement has got enough bashing, but still the C# team doesn’t get the point. If I write here what I think is bad, will it be fixed or will the C# team keep arguing that the path they have chosen is the right one?

    That’s a few things which pops out of my head. Will it be fixed?


    The generic syntax. If you want to change from List<Member> to List<Membership> you have to do changes in how many places? Add more types to the generic and it will start to get really painful. Include a complex generic in your public interface and things are suddenly very ugly.

    Constructor syntax. Ok, so the rename refactoring will reduce this annoyance, but there are times you want to copy an existing constructor to the new class you are working on. One thing is the pasting is ugly as the editor will not indent properly. Then you have to manually change the name of the contructor. Why is the class name used anyway? It has no purpose. You can’t use that name anywhere. Why not call it New() or Contructor()?

    Extract method refactoring. It’s not very intelligent. If the code doesn’t suit it, it will not do as you tell it. I wish it could analyze the snippet, ask me what I want to return, which parameters do I need, and if it knows the refactoring will not compile, ask me if I want to do it anyway.

    The implicit downcasting prohibiting rule. This is the only place where an implicit cast is never allowed. Strangely enough, most downcasts are done from object to some subtype. As everything inherits from object, an explicit typecast is always allowed, but you still don’t know it your code is valid until runtime. I thought compiler checks were about guaranteeing at compile time? What’s the point of enforcing a compile time rule on something which can’t be verified until runtime? But there is more. Sometimes you need to downcast from something other than object. In these cases the compiler knows if the cast is valid or not. When the cast is invalid, no explicit casts help, the compiler issues an error as it should be. Whidbey presents generics to the rescue. But if generics were introduced to remove explicit casts, it is solving the wrong problem.

    You can’t overload delegates. What is a delegate anyway? I reported this as a Whidbey bug, but I got told that a delegate is a type, not a method. So when you declare a delegate, you are really telling the compiler to create a new type in the same scope. An attempt to overload will create a new type with the same name, which is not allowed. A delegate is just syntactic sugar for the command pattern. In Whidbey, generics will come to the rescue again. But the generic delegate syntax is not elegant. My main complaint is that a delegate looks like a method signature and is used to pass methods around. But you can’t overload it, so you can’t pass overloaded methods around.

    Instansiation syntax. I have already declared my type. Why do I have to express my type again when I create the instanse? Sometimes you want to create an instanse and assign it to something uncreatable, like an interface. So what? Have the typename optional. Then you can do this:

    ArrayList list = new();

    IList anotherList = new ArrayList();

    Dictionary<string, int> map = new();

    It cleans up the generic syntax a bit, too.

    Local variables must be initialized. At the point where you have full control of your variables, you have to initialize them explicitly at least once in a part of code which is guaranteed to be executed. But class variables, which you have no control when they are initialized, if ever, you don’t have to. Everything in C# has a default value, anyway, so what’s the deal?

    out and ref parameters. Somewhat related to the enforced initialization of variables, I guess. The difference is where the initialization responsibility lies. If you didn’t have to initialize variables, this would not be an issue. As a result, you can’t initialize an out parameter inside of a try block, as parts of a try block is not guaranteed to run. The fact that an exception usually renders everything invalid and at that point it doesn’t matter which value the out parameter has, does obviously not mean anything.

  4. seer says:

    1) Deployment project (vs 2003)

    Why I can’t create setup that install framework and MSDE? Why I must use external tools to create such setup? And please don’t fix it by just adding MSDE option – I want to include my other setups also.

    2) dtq files – query for Database project (vs 2003)

    Why VS open dtq files as text files when they are not in database project? I can’t understand reason for saving questions for all this queries if it’s opened like text file.

    If I already have query in database project with more then one table and open it again after close, all relations in Diagram Pane are losed and they are present only in Grid Pane as a criteria.

  5. seer says:

    Ahh and one more thing.

    I can’t understand why VS 2005 Beta are only available to MSDN subscribers.

    In my firm I try to convience my co-workers to and the whole .NET platform as a tool which allows us develop much faster. So I thougt I show them also the direction it drive. But then, whoow, no MSDN no game.

    And don’t tell me about express version, it’s too poor for our needs.

    I hope that there will be some trial version when it will be complete product.

  6. Marc Bernard says:

    > We have a number of efforts underway to

    > significantly improve the quality of the

    > product that we ship

    I hope this starts with using Visual Studio yourselves. If I shipped a product with as many bugs as the VS IDE, I’d be looking for work…

  7. G. Man says:

    Wow, a guy asks for feedback to help make the product better its just a bunch of typical MS-bashing nonsense. Even Thomas Eyde who makes some good points, cant manage to do without a hostile attitude. But despite your good points, come on, renaming constructors? It took me longer to read your comment than I ever spent renaming constructors in the IDE.

    And the guy complaining about auto hide? Does he know you can turn it off? Some people… really makes me wonder…

    My own personal complaint is the inability to lock toolbars. I cant tell you how often I accidentally drag a toolbar somewhere and hose up the IDE. I have to "reset window layout" which resets everything. And I have seen some developers not as particular as me who have completely trashed their toolbars and dont seem to care. They have their menu bar BELOW about 7 different toolbars, most of which are just blank space anyway…

  8. There’s a comment above about beta releases only being available to MSDN subscribers. There are several SKU’s, with varying levels quality assurance, available for general download.

    Specifically, the Express SKU’s are available at beta quality (Beta, and a more recent version is available as CTP (CTP,

    More generally, here is a page that lists all of the pre-release versions that are available:

  9. Thomas, what issues do you have with "switch"? Thanks.

  10. Sean Chase says:

    I’d like to see covariant and contravariant return/parameter types. I am very excited about class diagrams in VS2005 and future "whitehorse" stuff (if I understand where it is going correctly). Right now I use Visio to get a "visual" of a design and then try to import that code. A couple of problems: I’m not a huge Visio fan and the UML diagrams aren’t nearly as nice to work with as the class diagrams in VS, then try to keep everything updated. In C#, I’m loving the syntax for working with nullable types and generics.

  11. Thomas Eyde says:

    Two things with the switch:

    1. Fall-through is not allowed, still C# demands the no-op break statement. It does nothing, but you can’t compile without it.

    2. Scoping. In my mental model, each case statement is a block and should have its own scope. Instead they share the same scope as the whole switch block. I know you can embrace each case in curly braces, but that’s not obvious and not the same.

    A comment on the comment on constructor names: The point is not how long it takes to rename them, but that you have to. And you can’t refer to those names, so they really don’t mean anything. Whenever you rename them, you are doing something which interrupts your flow.

    A comment on the comment on hostile attitude: I am sorry about that, not my intention to be hostile. And I use MS tools every day and have done so since VB3, so I am not the regular MS basher. My general feeling is that C# is moving in the wrong direction as it gets more and more keywords. It also focus too much on strictness and too less on productivity. I have also "upgraded" my VS 2005 beta 1 refresh to the beta2 dec ctp, which I feel as a downgrade. It’s slower and has a poorer user experience.

    I guess that, and the general arrogant feedback from the C# team in the past has caused some of the unintended hostileness.

    By "arrogant" I mean everytime they say: "Yes, we thought about that, but decided not to do it".

  12. Thomas Eyde says:

    But there is more…

    The += convention on event handlers. Not so much the syntax, but the behaviour. You can do a += as often as you like, but when you do a -= enough times, the event handler is suddenly null.

    How can a subtract operation set something to null? How logical is that? How many other places can you do that?

    The result is that you have to check if the handler is null, but you have never created nor destructed it. I thought one of the key ideas with events was that you know you can have listeners, but you don’t know how many, if any. And why should you care?

    Why can’t I always invoke an event, even when there are no listeners? It makes no sense that I should check if some external actor is observing or not. The event mechanism should do that.

  13. Thomas Eyde says:

    One final thing about the switch. Why do the case argument have to be constant? Being a former VB coder, i see the switch as a cleaner if-else-if. Not a big deal, as I try to avoid the switch.

    And I have more about constructors. You can’t inherit them, which is something you sometimes want. It would be nice if VS had an option to stub them.

    The calling convention to base constructors. Perhaps it’s just me, but I never get comfortable with the : base () syntax. There should at least be a cleaner way to just call the base contructor if that’s all you want. Empty constructors just feels wrong. I should be able to do something like this:

    public MyClass() : base (DateTime.Today);

    The calling order. In general it makes sense to first call the base constructor, then the derived constructor. Sometimes you want it the other way around, but you can’t change the order. I can agree that such situations suffer a bad design, but sometimes that’s what you got, with no options.

  14. Minh– you can turn off the auto-hide by using the little push-pin on the upper right of the window. When you hover over it, it will say "Auto Hide".

    It sounds like you are also giving some usability and performance feedback here as well, that the tolerances on the UI piece are not quite right (e.g., perhaps the target is too big for it to "feel" right"), or that the performance of the item is too slow.

    Please try pinning the windows and let me know if you have further feedback on this. I would be happy to pass it on to the people who work on this area.

    Also, if you have tried this in VS 2005, it would be interesting to know if any of your feedback is different from VS 2003.

  15. G. Man says:

    I agree that checking for null event handlers is totally stupid. Especially since it makes you vulnerable to race conditions, but hey that makes for good blog material I guess.

  16. Nathan says:

    " Wow, a guy asks for feedback to help make the product better its just a bunch of typical MS-bashing nonsense. "

    Unfortunately Scott was basically asking for it in the way he joined two unrelated topics. If he wanted to critise his (perceived?) lack of quality in open-source, then feel free, but the response is be rather predictable.

    If, as you say, the topic really is improving the quality of Microsoft’s software then there was really no point in mentioning open-source at all. A more humble approach of for example, talking about MS quality issues from the past would likely gain a far less hostile response.

  17. Milind Lele says:


    re. your question about dtq files…

    In Whidbey too dtq files can only be opened in the query designer. The reason is that the designer is pretty closely tied to the db project system. We had considered allowing them in any project, or even without projects, but that didn’t make the cut.

    With reference to your other question: (The joins disappear) This may be the effect of a feature called "join migration". The query designer modifies the query to a form that’s most effective, but preserves the semantics.

    Hope that helps!

    Milind Lele

    PM, VS Data

  18. Minh says:


    Please try pinning the windows and let me know if you have further feedback on this. I would be happy to pass it on to the people who work on this area.

    Also, if you have tried this in VS 2005, it would be interesting to know if any of your feedback is different from VS 2003.


    Hi Scott, Auto-Hide is an absolute must-have feature for me, I guess the "Auto-Show" is the problem, with usability issues, definitely w/ VS 2003. Maybe it’s a personal preference, but the indetermine-ness of accidentally hover over a tab is bad for me.

    BTW, I’m trying out Visual C# and things are MUCH improved, UI-wise. Though some IDE quirks ‘cuz it’s a beta. Is there a forum to report bugs & stuff?

  19. bg says:

    i hate the general flakiness of visual studio – i think its a superb product, but sometime its the little things that get to me.

    we have a few developers who always get problems with the form designer ‘losing’ designs, but there are some who never see the problem.

    we have some developers who have problems with intellisense not appearing, again some see it other don’t.

    I have a problem at the moment, which i’m going through pss with, with the ‘register for com interop’ setting which doesn’t work on my machine no what.

    Trying to enter localised strings into a resx using the built in editor is an absolute nightmare!

    don’t get me wrong on localising strings at all!

    Don’t get me wrong i love the product, its just after a few years of working on it every day things start to grind a bit!

  20. Clinton Pierce says:

    2003 was my first year using Visual Studio (the original VS.NET), and IDEs in general for programming. Until that point my IDE usually consisted of some combination vi, make, perl scripts, and shell. Visual Studio was a huge shift in the way I work.

    * I’m *still* not entirely comfortable with the build process. In make, everything was laid out right there before my eyes and I knew what was going to happen. In VS each project, each solution, has squirrelled away many config details in lots of different places which affect the build. A compilation error (due to config, not code) can send me scurrying through a half dozen twisty little screens, all alike.

    * The keyboard-for-navigation model is severely broken in most of those twisty little screens. For example, the project properties panel you *must* use the mouse to move through and use the datagrid-looking UI for changing project options. My RSI hates this.

    * I still do C programming. It’s what we do, where I work. To add a new C project I have to lie and add a C++ project, and then change much of it to be a suitable C project.

    * The general default layout of the UI I like, and it works for me. Intellisense usually works, the debugging integration is generally good, and navigation through large multi-project solutions is pretty easy.

    * When I have several projects in a solution, the tree is easier to navigate if it’s collaped. When I *close* a tab (with code) that’s open to one of those projects, it re-expands the project’s node in the tree. Cleanup after a debugging session involves: close window (x), close window (x) nauseam, collapse tree, collapse tree, collapse tree. This is annoying. I’m *closing* the code window, I really don’t need its project node expanded especially if I haven’t made any changes.

    * The product seems very stable. If I start-stop-start a C# GUI program over and over again (hundreds of times over several days) I have had spurious "out of memory" errors during compilation. The DevPartner Profiler is notorious for crashing it as well. If I stay away from those, I’m copacetic.

    Like BG said, "Don’t get me wrong, I love the product…"

  21. clintoen says:

    The Getting Started with C++ section gives advice about learning C++. Learn from our C++

    tutorials, or test your programming knowledge with the C++ MegaQuiz. You can subscribe to Code Journal, a free biweekly programming newsletter.

Skip to main content