Two Anxieties and One Unarticulated Need

Why doing nothing is sometimes the right thing to do

In several of my recent conversations with folks in and out of the community, I’ve shared some things that they found—and a lot of my readers will probably also find—surprising.

A few years back I penned (as I do) a voluminous response, regarding VB, culminating in an open letter. What may surprise you is that after writing it I really didn’t attempt to socialize it much. I shared it on Twitter but in my experience that’s not actually a VB community hotspot at all. I had initially planned to make a bigger fuss but as I considered next steps and took counsel with those I trust I came to realize that the cycle of inaction-fire-response was just as likely to produce a terrible outcome as a good one (if not more so). Also, I was sleeping a little easier.

You see, in my first 2 years post Microsoft I wrestled with (among other things) two different anxieties regarding VB. I feared that:

1. The C#/.NET org wouldn’t do anything.
2. They would do something and it would be horribly wrong.

And every few months I’d peek in on vblang and find neither an announcement that they weren’t doing anything nor any announcements that they were doing anything in particular. And strangely I’d feel relief for both.

As a side note: if either had happened in 2018 or 2019 I genuinely wouldn’t have been mentally healthy enough to handle it so “do nothing, say nothing” in this case worked out well for me at least.

The Anxieties

In my 8 years at Microsoft attending VB language design meetings and product planning meetings I was constantly pushing back against the idea that the ideal for VB.NET was to “just do what C# does”. “That’s what the customers said they want! They’ll yell at us if we don’t!” Countless discussions that “co-evolution” never meant copying. It was exhausting but a fight worth fighting and after several years eventually I’d built the credibility to really shake that idea out of the heads of those within my sphere of influence.

That idea is wrapped in arrogance and bias and short-sightedness and genuine ignorance and intellectual laziness and yes, good intentions. But good intentions don’t always yield good results.

I’ll restate this plainly because people don’t seem to believe this about me (and I say this with no malice or insult intended): I experience no jealousy toward anything C# has. C# is a phenomenal language with great tooling, but C# has never produced an end-to-end experience in language or tooling that I have wanted to make my permanent home. The “spirit of the language” is different than mine and it can’t be gently nudged into being a great or even begrudging substitute. C# can add functional features, I don’t think the F# community will ever be like, “Yeah, good enough! I’ll switch” and I don’t think adding more imperative/mutable features to F# would allow one to wholesale lift-and-shift the C# community over to F#.

That’s not to say that I dislike capabilities that come to C#. There are many things I’ve wanted before C# even thought of them, and things they’ve gotten that I’ve only been grateful to have missed, and other things I’ve wanted in a very different way than they’ve appeared in C#. But there is nothing that I want because it’s in C#. But the problem is that “everybody” thinks that’s what I would or should want and frame decisions in that way.

Examples time!

So in 2015 we were working on the first release of VB powered by Roslyn. At one point in the cycle we’re prioritizing our backlog for the compilers/languages and I note that we’re doing question-dot (?.) aka “null-conditional member access” next. My dev lead had somewhat recently (re)joined the team and hadn’t been exposed to my philosophy over the years.

He nods his head agreeingly and says, “…Right! Because of co-evolution”.

Me: “No.

Not because of co-evolution.

Because in a private discussion thread with VB MVPs they expressed to us emphatically that `?.` was a top value-add for them. It has nothing to do with C#. The fact that C# also decided to do it is purely coincidental but has absolutely zero bearing on the fact that VB is doing it. We were always going to do it and if C# decided not to do it tomorrow we’d still be doing it“.

Interestingly, there was a heated internal debate on the question-dot (?.) operator while designing it. I can’t recall if this ever went public but the team was split on whether it should be left-associative or right-associative. That is to say whether a?.b.c should mean the same thing as (a?.b).c (left) or a?(.b.c) (right). The former is more compositionally pure and that was the argument that initially led the C# LDM to push forward with left-associativity. But there’s a pitfall there because if a is null, .c will throw an exception. Instead, in order to avoid the exception you’re forced to type a?.b?.c, which is what led the VB LDM to immediately push for right-associativity. Ultimately C# swung around to the right way but it was only after escalating the debate to an executive override. I honestly didn’t expect it and was fully prepared to die on the hill that VB go its own way here despite how “easy” and “comfortable” and “safe” it is to “just do what C# does”. Fortunately that fight never came but I still maintain that it was a fight worth fighting and that it could have very easily gone the other way.

Again you might be surprised to learn that I spent half my time on that release and the one following it convincing folks that we didn’t need to do features in VB. Specifically, that we didn’t need to deprioritize capabilities that would be genuine value-adds to the VB community and the VB experience for the sake of implementing or even pursuing the many ideas that were coming out of the C# design process. The vast majority of those ideas never even made it into C# because of various problems but the impact on the VB side was that they took time and oxygen away from features and approaches that would have benefited VB greatly. But C# was considering them so we had to spend cycles deliberating how they might work in VB.

When we first reached language completeness on the Roslyn compilers and were officially ready to implement new features rather than just attaining feature parity with the native compilers written in C++, I recall a moment when my dev lead (a different one) came to me inquiring about the necessity of the VB LDM: “Maybe we’re at a place where we ought to just ya know, let the C# LDM handle it?”. You see, he truly read both the need of the VB community (and the meaning of the co-evolution strategy) to be that the C# LDM would just do its thing and then skin those features into VB. I explained that this was not the case, but it takes a lot of time and credibility (which fortunately I had) to correct that misunderstanding one person at a time across a giant organization and then across an entire community. I see now that my inability to scale myself was one of my many failings.

The last interaction that comes to mind was from a high level director within developer tools. You see, we had this private mailing list where all of our VB MVPs and trusted influencers could talk shop and give feedback to the team. And anytime anything was amiss anywhere in the .NET ecosystem with regard to VB that list would flame up with someone dramatically proclaiming that this tool or that template was the last straw and that all hope was lost unless nascent technology Y got 500 samples immediately (care to guess how many of those tools, templates, or technologies are now “dead” btw?). Anyway, I sent out a reply asking for patience and calm, as I often did (another failure of mine) and this director privately replied that it was a good response but that he didn’t really see a way out of it as the only way the VB community could ever be happy was if we did everything for VB that we did for C# (in the same way and) at the same time. I absolutely do not believe that could make the VB community happy. I don’t believe doing that ever could have made us happy.

That mindset is like a virus running rampant through both the halls of Microsoft and the broader .NET community and for 10 years of my life I was steeped in anxiety about it all the time. More at some times than others and especially for the first two years where I wasn’t there to fight against it. And then one day “The .NET Team” announced that they had no plans to “evolve” the language further and that anxiety quickly went away. No more fear that some unconcerned and maybe well-intentioned person’s “whoopsie!” mistake would permanently mar the language with an inconsistency or some other mistake. No more fear that the loudest voices in the VB community which really do (for lack of leadership or imagination) yell as often as not for complete replication of C# in almost all respects would find purchase amongst some newer and unwary members of the team and we’d finally get that Semicolon keyword.

And my other anxiety, that nothing would happen. Well, that happened, so there was nothing to fear there anymore either. And in the first few months following the announcement while certainly anxious about COVID-19; racism, police violence, and civil unrest; murder hornets, and economic collapse, for the first time in a very long time VB was something I wasn’t anxious about.

The Need

In the past when Microsoft CEO Satya Nadella has spoken of using empathy to meet the unarticulated needs of users he’s reiterated that this isn’t the same as going off and doing exactly what the most and loudest users tell you; that’s why it’s (often) unarticulated. I haven’t found an exact quote but the closest was here where he says, “It’s not about going where people tell you to, but how you get there before there is conventional wisdom”.

So, if “feature parity” with C# is the red herring—the articulated want that doesn’t actually meet the need—then what is the thing that VB users need. What is all the clamoring and complaining and commenting and protesting really about (beyond the obvious cases of being technically blocked in some task)? The answer is surprisingly human:


The VB audience articulates a lot but behind it all is a very human and professional need to feel respected. Everything else is just a means to that end. Respect from their peers in other language communities. Respect from Microsoft for their decades long business relationship. Respect for their code, and their projects, their knowledge, and skills.

I have a t-shirt (that I never wear) that was given to me one year at MVP Summit that reads “VB.NET IsNot VB6”. What that shirt really says is “Respect me (unlike you treat people who use VB6)”. Every time any VB.NET developer has uttered a phrase distancing themselves from VB6 or VB6-isms it’s because they perceive that doing so gets them more respect. In the mid 2000s, when I was getting into .NET, I did the same thing. “Oh no, you don’t understand, it’s not like VB6 anymore—it’s okay, you can respect me now—I use inheritance!”. I’ve never worn that shirt, that I can recall, and have no plans to because I no longer believe that it’s okay to disrespect someone else as a means to building up your own cachet. But for many VB.NET developers this is still an instinctive and desperate move to scratch up what they really want: respect.

And co-evolution. When a VB.NET developer said “We have the co-evolution promise now” it wasn’t because they were getting the features they actually needed, or wanted, or used. It was a defense from a disrespectful industry. The oft-misapplied idea of co-evolution was a shield that said “You have no concrete examples to disrespect me because I will have the same things as something you do respect”. But make no mistake, copying C# doesn’t create respect. It just deflects superficial disrespect. If you have two children, is it respecting one to treat them exactly like the other always? “I took your sibling to baseball games so I always took you to baseball games ergo I respect you; I bought them blue shoes so I bought you blue shoes—ergo I respect you both equally”.

I recall once 5+ years ago we put out a preview of some potential new features in VB. One of which was the ability to perform a Select Case on the type of a value. Someone wrote in through the “Contact Us” form on the VB team blog and said (paraphrased) “I’m very worried about the direction of VB.NET. I see that you’re thinking of adding this Select Case on type feature but object-orient developers should use polymorphism and method overriding to get different behaviors based on the type of an object and I’m afraid this feature teaches bad habits and is dumbing down the language”. I can’t remember if I replied or what I said but I do recall asking Mads to chime in for some reason and he politely explained that while polymorphism was certainly one way to approach such problems, in functional programming languages it’s very common to use constructs like a type case or pattern matching to do the same things and that we were looking at expanding the languages with other constructs and techniques popularized in functional programming, etc. I’ll never forget the complete 180 in the customer’s response (paraphrased) “Oh! Functional programming! I’ve heard of that! Sounds neat!”. You see, once he understood that the feature was coming from a position of respect for his intelligence and not a crutch, he was completely open to it. Tying it to modern programming techniques like functional programming rather than pre-OOP procedural habits lent legitimacy and respectability to the feature and him and his code in using it by extension.

I can’t tell you how many times someone in the VB.NET community has come to me and said they read that Microsoft was going to evolve VB in a way that was true to the spirit of the language and that this meant “dumbing it down” and that we needed to change to present it as raising the bar of entry or removing the training wheels or some other condescending metaphor. This defensiveness is about respect. Co-evolution was about respect. The distancing from VB6 is about respect and the envy of C# is about respect but none of these things actually meets the need of respect. It’s an unmet and unarticulated need that can’t be solved easily or quickly or superficially.

This isn’t a need that can be met by everyone just “resolving” that they “respect” VB.NET developers. But it can be met, I believe. It’s going to take a lot of work and as much or more of it is cultural (about the community) as it is functional (about features and support). So, you see, I didn’t make as big of a fuss as I thought I would because the last thing we needed then and now is for “The .NET Team” to be startled by some fire drill or protest into doing “whatever” puts out the fire most quickly. Any little addition or change from “The .NET Team” no matter how innocuous or well-intended is as likely to cause as much harm as good to the VB experience unless rooted in the deepest reverence for what VB has already and is, has been, and still can be. I don’t think this is a change that can come from Microsoft and that it’s best that we, the community, take the lead for now. i.e. it’s for the best that outsiders sit on their hands for a bit longer. In my next post I’ll begin to talk about an alternate (and exciting) community-driven path forward that I see. Stay tuned.



14 thoughts on “Two Anxieties and One Unarticulated Need

  1. Hello Anthony, I really appreciate the time you took to articulate this. I can’t wait to read your next post on the community-driven path forward. Best regards!


  2. > an alternate (and exciting) community-driven path forward

    I’m VERY interested in this. You’ve got me on pins and needles 😀


  3. Thanx Anthony for the post. It was very interesting. BUT, you either have to tell us what the possible “community-driven path forward” is, or quit teasing us with it. 🙂

    Liked by 1 person

  4. Hi Anthony D., glad you’re back.

    We need to create a beautiful path for our beloved VB, I hope you come back with that wish.

    May the next chapter be really brief.


  5. God forbid we “get that Semicolon keyword”! 🙂
    Thank you for the snippets of history at Microsoft. Love your writing and it helps me, as I was seeking closure after how Microsoft treated the VB community lately.
    Very glad to have you back Anthony!

    I am convinced that “respect” was/is a big want. But for me was also a kind of vision/sense that “VB is a language in which anything could be done/accomplished EASILY”. That is because I personally witnessed Quick Basic, VB, and VB.Net (often side-by-side with several other languages – FORTRAN, Pascal, C, C++) and in my experience VB was the best no fuss language for rapid development, with fewer errors, or as a “glue”/integrator, when other languages/libraries needed to be called.
    It might be just a coincidence but my impression is that the attitude towards VB.Net started to chill at Microsoft shortly after Bill Gates left. I might be wrong, though.

    A couple years ago I looked closer at Python and realized that Python pretty much achieved what I was dreaming for VB: that easy to pick language that one can call to solve almost any problem.

    When I look at differences, so far I see that:
    1. Python is driven by a vibrant community who seeks to solve real problems – not constipated corporate policy makers who care only to stay with the current fads and would change direction as the wind blows. Those who chose Python in the early years, did that because it was free and easy to use.
    2. It had a “benevolent dictator” who cared about the language. At time, that helps keep.

    As a result, over time, the Python community grew and developed libraries, at a much faster rate than any “respected” {;} language. The Pythonistas did NOT seem to care if they got “respect” or, at least, clearly they overcame that 🙂

    With the early start of Quick Basic and VB, Microsoft could have made them as popular as Python is now but they missed the boat – and, for another quick buck, they now promote Python everywhere.
    To me, there is value for the VB community to look at Python and its history. We should shake that longing for “respect” from others (who often don’t know better).

    Looking forward to reading your next post and hearing your ideas!

    Liked by 1 person

    • Very nice post Radu! I think your “vision” of what VB is and could\should be is right on. And yes, Python is the perfect example of how a “community” should work. I still don’t understand why Microsoft seems to LOVE Python when they have an almost identical language of their own that they seem to HATE… Where’s the logic in that?


      • They don’t really LOVE or HATE. Microsoft is an algorithm that responds to stuff. Python is something someone else built that’s successful that they can adopt and benefit from with minimal effort and minimal risk and minimal discretion.

        And to be clear, I worked there for 8 years and saw a LOT of fluctuation in thoughts about Python, from IronPython for .NET and CPython tools, etc. My guess is someone high enough in the org chart saw a line between Python and Azure subscriptions and the rest was just scrambling to get in on it. VB is perceived as a Windows development first and that’s not what they see paying the bills in 2040.


    • Love it, Radu!

      I think we have a lot to learn from other language communities, especially F# and languages like Python which aren’t held up by single mega corporation. I think you’ve also hit on the corollaries to my point about respect: We have to build a VB culture that is entirely sustained by its own *self*-respect because we’re never going to get it externally (including from Microsoft). Building out our own open ecosystem and respecting what we build as being as valid as anything we would have been spoon-fed by Microsoft is self-respect. Not caring anymore what others say about us or doing things to purely to fend off criticism is self-respect. But we also need a vision and a bold direction that we can respect even though it’s different than those other (;) languages.

      Anyway, thanks for the comment. I really appreciate it.


  6. > an alternate (and exciting) community-driven path forward

    On another note… I’m seeing much talk lately about the VB.NET Community—but where is it??

    Where are VB.NET developers gathering to discuss this thing or that thing or the other thing? I’m not finding it, unfortunately. For a while there I was thinking there might be something ramping up over at Gitter, but alas that’s died out to almost nothing.

    A while back Kathleen Dollard suggested a couple of once-active GitHub threads as gathering places for us, but that’s no kind of UI/UX that’s conducive to community discussion.

    Maybe the closest is over at, but I can’t help but notice that conversations there seem to tend toward older tech (but maybe I didn’t give it enough of a chance).

    For example, I would love to find somewhere to go and trumpet my praises of Mohammad’s excellent Vazor framework, for building ASP.NET Core 6 apps in pure VB.NET. I would dearly love to see that thing take off and succeed beyond his wildest dreams. But alas, it seems to be languishing lately, with only just a handful of downloads.

    We desperately need a watering hole where we can go and chew the fat on this kind of stuff. I believe our survival depends on it.

    I must admit I’m feeling a little bit alone out here, but for Anthony’s blog. But maybe it’s just me. Has a popular discussion board emerged where we can go to discuss modern VB.NET topics?


    • I hang out in maybe a dozen or more Facebook groups with a bunch of VB users in them. Haven’t been on the MSDN VB Forums recently but that place used to be pretty populated.


Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s