[Last Week in .NET #69] – Our Commitment To .NET News

If there was an award for ‘blandest headline describing really bad things’, Microsoft’s comms team would have won it. Let’s see which story I’m talking about, shall we?

🚫🛠 In EF Core 6.0, you can configure a join entity in a many-to-many relationship without any additional conifguration It wouldn’t be .NET without a billion documented ways to do something.

🟡Highlights from Git 2.34. Do you work with large git repos?, or repositories with lots of blobs? In the past I’ve always set a git-clone depth=1 to checkout so it wouldn’t try to pull the whole repository over my 4G phone. For a second, I thought the new ‘sparse index’ was about that. But it turns out, it’s not. To put it something closer to what I would use it for, it’s a way to split out parts of a large repository to the parts you care about vs. the parts you don’t really care about. You know, like a mono-repo that houses microservices. You may not really ever deal with a particular set of services, and thus don’t really want to keep track of their history/updates/etc. This gives you a way to set a sparse-index around the boundaries you care about.

The other ‘big thing’ we’ve talked about on this newsletter previously is the new merge strategy, ort. It’s ostensibly recursive‘s twin.. Get it? One day someone will stand in judgment of the names developers give things and that won’t be a pretty day. But anyway, ort is recursive, but faster and better and without the problems recursive had.

💉New dependency injection features in .NET 6 AsyncDisposable makes its debut with a new AsyncServiceScope that makes it possible without breaking existing DI container providers. I say this just about every time something changes, but there’s a long tail of outdated information out there on the ‘net, especially in the different versions of .NET Core, and this adds to it. We still haven’t figured out how to deprecate old information, and that doesn’t help new people learn .NET.

💍1.0 stable release of Windows App SDK is now LIVE! The Windows UI story has always been confusing, but apparently this is the App SDK to rule them all, (except where it isn’t).

1️⃣Uno Platform 3.11: Support for .NET 6 RTM, VS 2022 17.1 Preview 1. Uno is what MAUI wants to be. If and When MAUI ships, that is.

📉Monitoring a .NET application using OpenTelemetry If you write distributed applications in .NET, you’re going to want to implement OpenTelmetry; after all you don’t believe in “Not Invented here”. Right? RIGHT?

🍾Announcing TypeScript 4.5 This brings with it a lot of goodies, and TypeScript is what C# would have been if they had said “Fuck it” to backwards compatibility.

🍾Announcing dotnet monitor in .NET 6 .NET Monitor is a tool that exposes a .NET HTTP API to access all those diagnostics from your application no matter if it’s running locally or in a Kubernetes cluster. This has a ‘this is neat’ and also a ‘Oh god what hell have we unleashed on future generations by making Distributed Applications The Way’?

🎁There’s a Dotnet-Boxed template for Orleans I like the name ‘.NET Boxed’ and it makes sense: It provides templates that are opinionated and are optimized to get you up and running as quickly as possible. More of this, please.

🗣If you want WinUI 3 to be Open Source, let the team know I’m torn here. On the one hand, it is ostensibly easier to adopt something if it’s OSS. On the other hand, Microsoft’s recent track record with Open source is more of the “I want a cookie” model, and I’m not sure I can stomach more of that.

🚢Cascade of doom: JIT, and how a Postgres update led to 70% failure on a critical national service This is an in-depth read on a frightening technical scenario, and yes this pushes me closer to the “I’ll just find a deserted island and live there, k thanks” mentality.

🙅‍♂️Remove MS Contributors from .NET Thanks Website. No. Microsoft contributors are people too.

🙉🙈🙊Corey Quinn reminds us that the Azure security team (there is one, right?) still hasn’t explained how the ChaosDB vulnerability happened. I recommend reading this link in the early morning if you want to sleep at night.

🤦‍♂️I give TypeScript a lot of crap for breaking changes, but every version adding a new way to do something is not fun. Like adding another way to add a DBContext.

🤷‍♀️Github’s commitment to npm ecosystem security Yes these bullshit milquetoast headlines are normal at Microsoft, where the chief concern with optics is to not have a headline that sounds bad. It doesn’t matter if the news is bad, as long as the Headline sounds neutral. In this case, Microsoft has no fricking clue whether or not anyone ever exploited and npm vulnerability that would allow an attacker to publish new versions of any npm package using an account without proper authorization. I’ve seen these sort of headlines way too often at Micrsosft for it to be a one-off. They must have a corporate comms team that neuters any attempt to convey actual information in the headline. This does not improve trust, Microsoft.

🏫We need to have a talk about making life easier for newcomers to the .NET ecosystem Yes, Yes we do.

Why is it so hard to write C# in VS Code compared to Visual Studio Because of their org chart, of course.

And that’s it for what happened Last Week in .NET. It’s Thanksgiving week this week, so I expect next week’s issue will be rather light. I’ll probably be rather heavy from Thanksgiving, but that’s how it goes. I’m thankful for you. Yes, you.

[Last Week in .NET #68] – .NET 6 Passionate Programmers

.NET 6 was released last week; .NET 5 has 6 more months of support, and Chrome decides “view source” is bad.

🚄Announcing .NET 6 — The Fastest .NET yet new features include Minimap APIs, Hot Reload for Visual Studio and the .NET CLI, C# 10, better performance, a “Unified platform” for development, and lots, lots more.

🧥Announcing ASP.NET Core in .NET 6 Hot Reload makes an appearance, of course, as done Minimal APIs, and lots of improvements for Blazor, and as I said at the top, lots more.

💼The Case for C# and .NET Charles Chen compares JavaScript and .NET 6, and makes a case for why you should choose C#.

🎂Cake v2.0.0 RC 1 released Lots of bug fixes in this one, and the cake is not a lie.

🏃‍♀️.NET Everywhere – Windows, Linux, and Beyond Scott Hanselman demos .NET across platforms, as the title indicates. It’s super weird for Microsoft to have a “Windows Visual Studio only” mentality on one hand and a “but you can run .NET anywhere” mentality on the other.

🚫🛠Chrome allows admins to disable “View Source” and this has started a bit of a brouhaha. On one hand, people on the internet are mad that this feature exists, on the other hand people on the internet say it’s no big deal. It’s both. You don’t improve internet literacy by giving in to companies that put the answers to their exams in the HTML, and you certainly don’t lend credence to the idea that View Source is some sort of crime.

🎸EF Core 6.0 hops on the minimal API bandwagon. Don’t worry, the kitchen sink is still there.

🕸Orleans supports .NET 6 with release 3.5.1 Orleases is Microsoft’s approach to ‘distributed .NET’ on public cloud servers. It’s fascinating (and used by Microsoft) and it now supports .NET 6. No word yet on who outside of Microsoft needs this, however.

EF Core 6.0 has been released. It includes temporal tables, pre-convention configured models, and more.

🧯The Hot Reload docs are live. Microsoft is a bit late to this party, so maybe that’s why they’re all in on the docs? In other stacks, it’s just the way.

🔮Powershell 7.2 has been released and it includes bug fixes plus predictive intellisense (if you use PSReadLine), which seems pretty neat.

🎭Nuget 6.0 has been released Includes Sourcemapping, Package Vulnarabilities…. wait. Package Vulnerabilities? Oh, it can show you package vulnarabilies in Visual Studio. NuGet is a major part of .NET and is still pretty tightly coupled to Visual Studio. Until Microsoft fixes that issue, I don’t see the claims of ‘.NET everywhere’ coming to fruition. If you want a first-class experience with Nuget, you’re still limited to Visual Studio.

🙊The EF Core team fixed 545 issues for EF Core 6.0. The EF Core team is 5 engineers, 1 manager, and a PM. Let’s say they started on work for .NET 6 / EF Core 6.0 On January 15th, 2021 (.NET 5 was released in november of last year; but you can imagine they had to work on patches for that, and hopefully took some time off for the holidays). .NET 6 was released on November 8th, 2021. That means there are 203 work days (excluding weekends and holidays). With 545 issues fixed, and 5 working members of the team, that’s an issue resolved every 2 days per person. That is a frantic pace; and given what we saw for .NET 5; that means the EF Core team has not had a break in over 2 years from a frantic pace. Their manager explains this as “passion”:

Or we’re just that good. 🤣😉 (Joke)

Five engineers, a manager, and a PM. And we mostly just chug along. We don’t do heroics. What fits, fits. What doesn’t gets punted. That being said, there’s a lot of passion on the team, and it’s more than just a job for some of us at least. (emphasis mine)

I have to say I’m a bit concerned about the work/life balance for the EF team, and it raises a whole lot of red flags to see this sort of pace for the last 18 months.

🐦Jeremy Sinclair livetweets the .NET 6 release .NET 6. Now .NET 6 is the LTS version of .NET that finally sheds the Framework mantle (.NET 5 wasn’t LTS), and so you should see .NET 6 as the first major .NET Version that legacy companies migrate to.

Steve shows off implicit global usings One of the major problems I’ve had with code samples on the internet is the namespaces not being included in the code sample. This makes that worse, and easier to happen. I like the idea, but the implementation doesn’t help our current set of problems with getting code off the internet.

🚢NativeAOT coming in .NET 7 This will allow for a statically linked ‘single file’ deployment to all platforms, a la Go.

🧥Full-stack .NET 6 Apps with Blazor WebAssembly and Azure Static Web Apps Since Blazor can support WebAssembly, and Static web apps are just that; you can now deploy Blazor apps to Azure Static Web Apps. I’m interested to see what sort of frameworks around Blazor pop up.

💸CSharpFritz (Jeff Fritz) plays Pitchman for Mobile.NET’s product that convert’s Webforms to “Native Web App”. This is interesting inasfar as Jeff works for Microsoft on the .NET team, and Mobilize.NET (as far as I know) is a third-party vendor — why is Microsoft pitching other companies’ products?

📹Visual Studio 2022 has been released and Scott Hanselmen (and friends) take you through what’s new. There’s also a blog post if you aren’t the ‘watching videos on the internet’ type.

You have 6 months before .NET 5 is End of Life and you can read Microsoft’s support policy here.

It was a busy week last week with the release of .NET 6; and hopefully the folks at Microsoft are going to take a bit of extra time off for Thanksgiving. See you all next week.

[Last Week in .NET #67] – Microsoft’s “Valued” Professionals

.NET 6 is coming this week, Emojis are the harbinger of the end times, and Nat Friedman leaves Github.

🐎 ‘Trojan Source’ Bug Threatens the Security of All Code. Turns out rules for handling unicode in source code include the ability to inject code into the compiler. If the first attack using this method doesn’t use the new Goose emoji, I will be disappointed.

🏔 Server side ALPN support for SslStream on Mac Someone out there reading this understands the implications, the only thing I understand is that this fix will not be in .NET 6. One other thing, when you reply to make me smarter on this subject, please let me know if ALPN is pronounced “Alpine”. If it isn’t I can’t take that much disappointment in one day.

🔗 Learn how to integrate npm and webpack into the build process for your Razor Class Library And people say masochism has no analogue in technology.

🔊 Episode 84 – ASP.NET Core 5 Design Patterns with Carl-Hugo Marcotte This is a newsletter link about a podcast about a book about ASP.NET Core Design Patterns.

💾 Session highlight: Running .NET Workloads on IBM Z This will be at .NET Conf, and while my talk on Event Driven Architectures in .NET was declined, you get to hear about IBM Z workloads, which impacts virtually no one in the .NET Industry. IBM sponsored .NET Conf, didn’t they. checks https://dotnetconf.net front page. yes, yes they did.

Two extra swipes at this because a bad move requires more snark:

  1. Losing sucks, losing to IBM sucks even worse.
  2. It’s hard to say you’re looking for “widely applicable” talks when you accept a talk about running on IBM.

📝 CODE Magazine – Essential C# 10, Making it Simpler In the context of ‘simple’ adding record structs and mutable record structs to record classes does not seem like it’s making things “simpler”, but that’s just me.

🗺 Microsoft rolls out Visio to Microsoft 365 Commercial users I have a soft spot in my heart for visio, and while I won’t purchase Microsft 365, I applaud this move.

🥤Microsoft created a full Notion clone using its Azure Fluid Framework. If you haven’t heard of Fluid, just visit its website and be even more confused. “Data Sync Reimagined: real time. Web first. Open Source”. The good news is that those are up to date buzzwords, the bad news is that I have no idea what they’re trying to say. But it’s cool, right? That trumps clarity.

🟦 ☁Azure Container Apps now available as a serverless offering on Azure Allows you to write microservices without any ceremony.

📱What’s new In Mobile device Enrollment and Management for Windows 11, Version 21H2.

💵Understanding the cost of C# delegates This is cool from a technical perspective but from a realistic perspective: If you don’t want to use delegates you may as well only use C# 1.0.

🙇‍♂️Thank you, Github Nat Friedman writes about his departure as Github’s CEO.

🚪 Github CEO Nat Friedman is leaving, Thomas Dohmke named new CEO The new “CEO” reports to the DevDiv president, who orchestrated the Hot Reload debacle.

👋Thomas Dohmke fills out this trifecta by writing “Building the next phase of Github, together”. It’s filled with the usual fluff and doesn’t address the fact that the org chart changed and Tom (can I call him Tom?) is a glorified VP in Microsoft’s DevDiv. Maybe Nat left because he didn’t want to dance to this new tune?

🌠Windbg 1.2110.27001 Preview has been released and the new Windbg now uses WPF, and has a sleeker look, or so I’m told.

🙊🙉🙈Apple argues Sideloading is too big a risk. If we’re going to say installing apps is too big a risk, we might as well say users are too big a risk.

Visual Studio is now on TikTok Hello fellow kids.

😴Microsoft Publishes New Documentation for Blazor, ASP.NET Core I hope the documentation isn’t as boring as the article title.

🤑Native AOT Is coming in .NET 7 Let’s hope they don’t make this Visual Studio only.

David Pine asks you to please use Microsoft Q&A for .NET Please clap.

🙏Thanks Microsoft for open-sourcing VS Code Server I’m interested to see what comes of this. Microsoft initially declined to open source VS Code Server, so Gitpod launched its own OpenVSCode Server, and now Microsoft is open sourcing VS Code Server so they don’t appear as if they were caught with their pants down.

🆕The F# docs have been improved and the tweet thread does a far better job of explaining document updates. Visual Studio Magazine, take note.

😒Microsoft MVP told to give up award because they work for Microsoft’s cloud competition. This did not use to be true, but now it is. I guess “Valuable” here relates to “Valuable to Microsoft” not “Valuable to the community”.

and lastly,

Microsoft employees are upset about all the “.NET Drama”. As a personal reflection: Anytime someone uses the word ‘drama’ to describe another person’s lived experience, it’s always in a derogatory and dismissive fashion.

.NET 6 is being released this week, so we should have a lot more to talk about next week in .NET.

[Last Week in .NET #66] – Halt and Crash Intellisense

The .NET Foundation held their “Tell me Anything” last week, Visual Studio 2022 no longer crashes when using intellisense, and ‘hacking’ is apparently as easy as decoding base64 encoded ViewState. Let’s get to it.

🕸 WebAssembly Beyond the Browser: Running WASM in .NET Core Applications With WASI & Wasmtime Anytime someone says something is ‘future proof’, I wince. The rest of the post is even more out there.

🧵 A thread of System.Text.Json features in .NET 6. Which is more memorable: “System.Text.Json” or “Newtonsoft”? Hit reply and let me know.

🏫 Tutorial: Create a minimal API in .NET 6 with Visual Studio. It’s hard not to think that the writing is on the wall for Visual Studio, after all, these same steps in a VS Code / .NET CLI interface are a lot easier to both take in and do.

🧵 A thread on WindowsAppSDK Frequently Asked Questions Good thread, good info.

🤔 Covariance & Contravariance in .NET C#. Co[|ntra]variance: the ultimate compiler “well, actually”.

🔓 Turns out the reporter who ‘hacked’ the Missouri Government Website, did so by… inspecting ViewState. ‘Hacked’ of course is in scare quotes; and Viewstate is Base64 encoded. In 2021 you should already know this, but if you don’t: Anything you don’t want the user to see should not go in Viewstate.

💥 Visual Studio 2022 version 17.0 RC3 and Preview 7 Good news, Visual Studio no longer crashes when using Intellisense.

🙊 Microsft Rankles some by limiting discussion on Cordova shutdown for the AppCenter. If you’re going to retire a technology, at least let people know about alternatives. Otherwise you reinforce that you aren’t there to help the community, you’re there to help yourself.

🎨 Github has a command palette (CMD+K on Mac or Ctrl+K on Windows).

👫 Duende Identity Server (formerly IdentityServce) vs is out and it includes BFF support, which does not, I’m told, stand for Best Friend Forever. I am disappointed. BFF is “Backend for FrontEnd Support” and it helps you secure SPAs.

😲 WindowsAppSDK 1.0 Preview 3 is LIVE, and the full release notes are here, and it’s bad when the release notes start with the limitations and known issues.

🌠Did you know there are powershell modules to administer Microsoft products like Teams and Exchange Online? Now you do.

🙅‍♂️Developing for Windows with the Windows App SDK The “latest” on what’s going on with project reunion. No UWP in .NET 5 or .NET 6.

🧓Terminal.Gui 1.31 has been released Get those old-school terminal-user interfaces for your Console application as God intended.

📆 .NET Conf 2021 is November 9-11, 2021. I will livetweet some of it; but a three day virtual conference that spans timezones is a bit much.

🔒Encrypt/decrypt data with .NET 6 and Azure Key Vault , it starts with using Azure; which at least 69% of you use.

👀 And lastly, I talk about the fundamental problem the .NET Foundation board has, which dives into the problems plaguing the board and stems from their “Tell me Anything” last week.

The fundamental problem the .NET Foundation Board has

The Hot Reload debacle happened last week, and the .NET Foundation Board held a “Tell me Anything” (TMA) Thursday on youtube. I livetweeted that event here.

I should point out that while the “Tell me Anything” is fortuitous in that it came in a timely fashion after an epic screw-up, that the purpose of the TMA was not Hot Reload, but rather to address the many recent screwups that happened prior to HotReload .

In case you haven’t been keeping up (and that’s to be expected, as it is a lot):

Now, did the .NET Foundation try to explain why any of these subjects happened — except for the last? No. Have they promised to conduct an investigation into all of these subjects and issue a report? No. Have they been forthcoming with what ‘contributing code’ to the .NET Foundation means? No. Have they even backtracked on their misleading news on why a Director of the .NET Foundation Board left? No.

With those facts in mind, it’s rather hard to explain what the .NET Foundation was hoping to accomplish with the TMA. Maybe they thought a good substitute for answers to these pressing issues was the ability to have a moderated chat for an hour? Again, it’s hard to say.

On the github side, members of the .NET community took to the Discussions on Github to ‘start discussions’ on these areas; but since those discussions started, there’s been no followup from the Board to the questions asked, or even a timeline for when the questions will be answered. Much like the “Tell me Anything” yesterday, the discussions seem to be an outlet valve for the community’s frustration rather than a means to get the .NET Foundation and its community back on the same page.

And that is the fundamental problem the .NET Foundation has: Its board members don’t see the disconnect between why the community thinks the Foundation exists and why the board thinks the foundation exists. We even asked that question and were met with “We have to have discussions” to get on the same page about that. The irony here is that if you asked the Board members why the Foundation exists, and if you asked the community, you’d get different answers — but over and above that, if you pull up the articles of incorporation (and even their amendments that came 5 years later), you get a completely different answer!

Now when you think about something so fundamental as the purpose of a legal entity, you gotta figure it’s crystal clear, right? Apparently not. Luckily we can use the .NET Foundation articles of incorporation to suss out its purpose:

Article III – Purposes

The Corporation is organized to promote the interests of the .NET programming community, including developers, independent software vendors and platform providers, by: fostering open development and collaboration of open source technologies for .NET developers to strengthen the future of the .NET ecosystem and wider developer community by promoting openness, community participation, and rapid innovation.

The original incorporation document for the .NET Foundation.

At the risk of creating a rather juicy straw-man for myself, it’s clear what the .NET Foundation is for: It’s an interest group designed to promote .NET and the interests of the .NET community.

What are the interests of the .NET community?

Well, if more developers don’t’ pick up .NET, we’re going to continue to be seen as an “Enterprise Only” product. That’s fine for making money, but you need new blood; and new blood — especially in this generation — is interested in what gives them joy and what aligns with their moral and ethical principles. And maybe I’m wrong there, after all plenty of developers see the evil that is Facebook1 and yet love React and React Native. Plenty of Developers see the evil of Google2, and yet love Go. I can’t explain it.

The dangers of an ‘enterprise only’ product is that it naturally excludes hobbyists, startups, and external sources of inspiration. Say what you will, but I’ve never heard anyone refer to enterprise software as inspirational. But this is not a critique about enterprise software, this is a critique on the current path of the .NET Foundation, and that path leads to enterprise only software.

So if the .NET foundation doesn’t want to be known as the ‘enterprise only’ foundation, they’re in a particularly well-suited place to change that outcome. After all, their entire mission is to change that outcome. The last part of the legal purpose of the .NET foundation even says so:

…to strengthen the future of the .NET ecosystem and wider developer community by promoting openness, community participation, and rapid innovation

Last clause of Article III in the .NET Foundation incorporation documents

What does the Board think the .NET Foundation does?

I’ve been trying to answer this question, and it’s hard because no one at the board will give a definitive answer as to the .NET Foundation’s purpose. They each focus on a microcosm, or a tactical implementation of that purpose, but not on the purpose itself. You’ll hear things like “fund meetups” or “promote open source projects” or “give open source projects legal tools to help them administer their projects”, but these are all tactics, none of this is a strategy.

First Steps to a better .NET Foundation

To make the foundation better, we have to change the direction of the Foundation. That means figuring out the mission and purpose, and here’s where the Board should spend its time first. Read the incorporation documents, and decide if they as board members want to promote .NET in the way their own incorporation documents stand for, and if they don’t, to step aside and allow others who want to carry out the purpose to do so.

I can provide my own vision for the .NET Foundation, but to be clear: it’s a group project. We need different voices, and one voice will only result in the same myopia that got us into this mess.

The .NET Foundation should:
1. Create and encourage the conditions for .NET to grow and thrive outside of an ‘enterprise only’ environment.
2. Zealously defend .NET against any entity that goes against the ideals of the Foundation, regardless of whether the victim is a .NET Foundation project. You’re an interest group. Be an interest group. Take an interest. Take a stand.
3. Put together a strategic planning committee to use those first principles and the state of .NET to put together a plan for where we should be in 3-5 years, with finance, communications, and sustainability.
4. Complete the by-laws; they’re incomplete, they reference documents no one has access to, and they’re legally a mess.

In that future, where the .NET Foundation has done these things, I can see a future .NET Foundation reacting very differently to these crises we had.

To me, here’s a piece of what that would look like:

If the .NET Foundation’s purpose is to promote openness and rapid development, they should absolutely have an opinion when a member project or corporate sponsor goes against that. Note that ‘have an opinion’ is different than “tell the member projects what they can and cannot do”. If you’re an interest group, you should have an interest. In the case of the Debugger License change, AppGet, and HotReload, the board should have absolutely issued a statement. After all, .NET is their baby, and anything that harms the .NET Community should be by definition be something they talk about.

What would these statements look like? The typical “We’re not mad, we’re just disappointed.” statements, like this:


The .NET Foundation exists to promote openness and rapid innovation on .NET. Actions like changing the license for the .NET Debugger, and removing Hot Reload from the CLI only to make it a “Visual Studio only” feature — and then shutting down discussion, do not promote openness and rapid innovation in .NET. These actions reinforce age old stereotypes about .NET, that it is the commercial province of Microsoft. We at the .NET Foundation are working hard to change that view so that .NET can thrive, and these actions hurt that progress. We ask that Microsoft, a founding member of the Foundation and a Corporate Sponsor, rethink its actions and to continue to promote innovation and openness in .NET as it pledged to do when it helped found the .NET Foundation. We believe each member project has the authority to conduct its project as it sees fit, but we would fail in our duty as guardians of the .NET community if we did not speak up when a member project acts contrary to the .NET Foundation’s ideals.

It’s got some rough edges, but that’d be my first draft for a .NET Foundation statement on the debugger and hot reload changes.

The .NET Foundation is salvageable, but it takes leadership and vision. Right now I see board members trying to step up, but without a vision, and without a common mission articulated, they’re all just bailing water out of the sinking boat, without plans for patching the hole and getting us all to dry land.

End notes

1: If you want to argue the many ways Facebook is not evil, this isn’t the place to do it. Either you accept the argument, or you don’t. (I can actually see HN Commenters spending thousands of words on defending Facebook and Google because they have nothing substantive to say on this subject otherwise).
2: See 1, just substitute Facebook with Google.

[Last Week in .NET #65] – Let’s Skip To the Part Where You Don’t Do this Again

Here we go, again.

On October 19th, the PM For “Hot Reload” (which honestly sounds like an urban dictionary term of art), showed off Hot Reload to internal stakeholders. On October 20th, Hot Reload was removed from the .NET 6 RC2 CLI in favor of a Visual Studio only release. On October 22nd, the news broke in the Register and the Verge, with the Verge stating the reasoning was a “business-led decision” by the CVP of Developer Division (DevDiv), Julia Luison. On October 23rd, Microsoft put it back in saying “we inadvertently ended up deleting the source code instead of just not invoking that code path”, and it was also reported by The Verge.

Since then, an internal communication has leaked with the DevDiv rank-and-file up in arms about the decision.

There is ample evidence to draw conclusions that this was not inadvertent, and that Scott Hunter’s blog post is to maintain political cover for the CVP that made the decision:

  1. If this were ‘inadvertent’, then there would have been no reason to close and lock the PR to prevent discussion.
  2. If this were ‘inadvertent’, then the myriad of developers that make up .NET’s online twitter presence wouldn’t have been radio silent on the subject for days.
  3. If this were ‘inadvertent’, then someone from the .NET team would have spoken up to explain what the reasoning was behind removing a working feature from a Release Candidate.

I could go on. But unfortunately if I point to the back-channel ways the .NET Team was trying to show that it wasn’t their call, I would get them in trouble with their corporate overlords.

The .NET Community was largely pissed off (a technical term) at the removal of this working feature from the .NET CLI and making it ‘Visual Studio only’, and I can’t say I blame them.

The problem here is the same problem the .NET Community has with the .NET foundation’s governance: Microsoft.

One the one hand, Microsoft would like to be known as a steward of open source; going so far as to showing “We ♥ Open Source”, but on the other, each time it comes down to making a hard decision that would benefit the open source community but potentially harm Microsoft’s business interests, it chooses its business interests, every time.

It happened with the Debugger License Change.

It happened with MonoDevelop.

It happened with Hot Reload.

This is a pattern of corporate interests at Microsoft wanting to lock down development ecosystems to enhance their product’s bottom line while hurting adoption that ends up hurting Azure’s bottom line. It’s like the 90s called and said “Hey, get in, we’re going shopping for Fanny packs, Lowrise Jeans, and Vendor lock-in”.

And that’s the rub. Visual Studio is great — I personally love it, but I also love not having to boot into Windows to write .NET. .NET Core saved me from leaving .NET. Seriously. I like a console-first workflow, and the developer affordances in a *nix based environment outweigh any improvements Microsoft has made, and I go so far as to say that a console-first workflow respects how I work.

So that’s how Microsoft shat the bed last week in .NET. Let’s see what else happened.

🗣 The .NET Foundation invites you to come talk to them with their “Come Talk to Us – A .NET Foundation Face-to-Face. This is happening October 27th, 12pm EDT, and a second session on October 27th, 8pm EDT.

📹 The .NET Docs Show talks “EF Core Power Tools and Nuget Packages, oh my!” with Erik Jensen. I agree, both are scary.

🖇 There’s a new Data Structure in .NET 6 which is ironically to our conversation about Hot Reload, a “Priority Queue” where elements of the lowest priority get Dequeued first. Like free CLI tools? (I will not apologize. It is not too soon.)

🚫🚚Sorry folks, UWP Is not being moved to .NET 5/6, which all of this has been confusing to follow from the start, but isn’t the purpose of Project Reunion to… you know, reunite everyone? Also, this is about the 10th time Windows developers have had the football pulled away, and they’re starting to notice.

🧓Announcing Apache Cordova Retirement from the App Center. If this impacts you, Ionic Framework has your back.

🚪Developing for Windows with the Windows App SDK this would be the other team in Microsoft that’s locked in to the 90s.

λ What’s new in F# 6… It now supports Task from C#. That’s the only feature I can recognize, all the rest look positively greek to me.

💪 If you’re having problems with Windows, curl, and self-signed certs, Jamie Phillips has your back.

😶 I can’t vouch for its efficacy, but there is CoreWCF, that is a .NET Core port of WCF. WCF sounds like a nightmare, and I hope it isn’t your reality.

📑 Because hope springs eternal, I’ve been keeping tabs on Windows Terminal, and a new preview release (1.12) is out. Slowly but surely Windows Terminal is getting features available to Gnome users 10 years ago.

🥄🥄Microsoft Fends off 2.4Tbps DDoS Attack, Second Largest on Record. They did not fend off 2.4 Tablespoons, much to my dismay.

Announcing the 1.0 release of Language Support for Java™ on Visual Studio Code. Does Visual Studio even support Java? Asking for a friend.

Microsoft’s YARP (That’s Yet Another Reverse Proxy) 1.0.0-RC.1 has been released. The .1 signifies that if there’s one constant at Microsoft, it’s that every team has their own versioning structure.

👌💋 Jetbrains Rider team called out Microsoft’s Hot Reload debacle with their own subtweet. Perfection. Also Rider now supports Hot Reload.

🎁 Reed Copsey has a must read on the .NET foundation’s bylaws. It’s not as boring as it sounds, I promise. Bylaws are boring, but Reed makes it approachable and spells out the consequences of the current governance structure of the .NET Foundation. As I said, a must read.

🕸 VS Code + Live Share: Putting the “We” back in “Web” Live Share works across Visual Studio and VS Code and on any computer. Even my wife knows that’s a big deal*.

❓ Dusted Codes asks Can we trust Microsoft with Open Source which is a rather in-depth piece on the whole Hot Reload saga.

🤗 How we shipped PostgresSQL 14 on Azure within One day of its Release. The “Embrace” part still holds true.

There’s a new RandomAccess API in .NET 6 so you can read and write files without using a FileStream. Apparently it’s faster and better? I’m less familiar with this and would love to hear from you on it.

🌲I Used Cypress as an Xbox Web Scraper and I regret Nothing Yes. Using Cypress to buy a new Xbox? This is good. This is very good.

So that’s what happened Last Week in .NET. If you’re still reading this and haven’t started drinking heavily, I salute you.

*Joke courtesy of my wife.

Internet meme blink (at scale, of course)

So Expensify released their S-1, and this section caught the internet’s eye:

Here, I’ll embed the picture too:


Expensify’s Global scale blockchain based Software stack.

This was my reaction:

If any of this seems normal to you, I feel for you. Lemme know where to send the fifth of Jack, because God knows you need it.

Now let me start off by saying there could be an entirely logical chain of events that got us to this point with Expensify. Bad decisions — at least how it looks to the outside — are often the result of a lot of little decisions stacked up. No one that should be practicing in tech gets up one day and says, “I Know, I’ll build a tech stack that would make Hacker News — the place that seems to adore nonsensical architectures — to go, ‘Hrm. That’s a bold idea. A bit too bold for us'”.

What’s wrong with this architecture? I’m going to assume for a second that selling this architecture in this way in the S-1 was the goal from day one, and not just the most innane bullshit written in the first draft that somehow looked good to the CEO and it was kept in even though the CTO wrote it as a first-draft joke to stave off writers block talking about architecture. The architecture itself is way too complicated for anyone’s needs, let alone Expensify’s. It’s like going to the grocery story and buying all the chocolate candy from the checkout lane to melt down and make chocolate ganache from. Sure, you can do it, but why would you want to?

SQLite is a very fast database. It’s very fast because it’s a single writer database. That’s how it’s so fast. It doesn’t have to worry about all those sticky little problems of multiple users and multiple results sets and locking because there should only ever be one connection with one thing happening at a time. It’s meant to be used in situations where an embedded database is a really good idea, and that’s not in a high-volume internet application where billions of dollars is managed in expenses daily.

and so the architect (Again, I really bet this was an accidental architecture, but in case it wasn’t) likely knew this, and knew this little prototype needed to be rewritten, but the business folks said “no”, and so they decided to… shard it. Literally. Shard the unshardable database using Paxos.

There are lots of problems I have with this description of their stack, but not the least of which is that they are heavily susceptible to job lock-in. How many people in the world have experience with Paxos and Sqlite in this setting? For my money, I bet it’s just the folks at Expensify — because, and I’ll say this again, this architecture is unmoored from reality. Let’s say the chief architect leaves for greener pastures. You can’t just hire off the street for this. No one has 1 year of experience trying to make Sqlite and Paxos work together in this manner, let alone several. You’d better hope you have a good succession plan in place and every single part of this system needs to be documented to the nines and out of anyone’s head to even have a hope against a critical person leaving. As of this writing, there are 99,000 total results from Google about the words “Paxos” and “Sqlite” together. For comparison, DB2, a database that hopefully isn’t still in use in the tech industry for new projects, has 27,300,000 hits.

At some point, any successful business needs to scale its tech. This is normal: V1 isn’t meant to last, it’s meant to get money in the door, either through VC or customer adoption, and the problems you’re solving with Version 1 aren’t the same problems you have when you’re filing for your S-1. Scaling isn’t easy, but if you pick a path no one else has ever taken before, that’s not a competitive advantage, that’s a risk with lots of long term bagged you now carry. A rewrite may not be viable, but if you want to be a world-class chef, making ganache from the checkout aisle isn’t an alternative unless you want to be the checkout-aisle ganache chef.

Does Expensify want to be a public company or do they want to be that quirky “we doubled down on bad decisions and make them sound good” company? It’s hard to say.

[Last Week in .NET #64 – Xamarin? What’s Xamarin?]

This newsletter is a day late because Monday, am I right? With that aside, let’s get into what happened Last Week in .NET:

🌇 Sunsetting of .NET Framework and .NET Core runners in Cake 2.0 Cake now requires .NET Core 3.1 or higher.

Marten V4: Hard Deletes, Soft Deletes, Un-Deletes, All the Deletes you Meet Marten is a Document DB that sits atop Postgres; and 4.0 now has softdelete support and support to undelete softdeletes. Which.. is what makes them soft.

🏃‍♀️ ML.NET Updates & Announcing Notebook in Visual Studio I’m impressed that Microsoft chose to publish the painpoint “Afraid Microsoft will abandon the [ML.NET] framework”. Silly users, don’t you know that they don’t abandon it, they just stop developing for it? Secondly the answer to that painpoint doesn’t actually address the painpoint.

👀 Webview UI Toolkit for Visual Studio Code This finally puts the ‘visual’ in Visual Studio Code.

🌟🦗Migrating our trusty ol’ .NET Framework applications to AWS, I couldn’t believe it So A Senior Specialist Solutions Architect at AWS (François Bouteruche) put together this “story” about fictional migrations to AWS for .NET Teams, as an amalgamation of experiences he’s had… working for AWS. Migrating .NET customers to… AWS. The first paragraph makes it seem like this is an actual story, but it’s not. Disclaimer doesn’t come until Paragraph 2. I see you, AWS. This comes suspiciously close to astro-turfing, AWS.

🚀Join us November 8 for the Launch of Visual Studio 2022 Visual Studio 2022 launches on November 8th, as it states on the tin, but today you can download the Release Candidate.

😶Use of Github Enterprise Rob Prouse, Board member of the .NET Foundation, explains what happened with all member projects for the .NET Foundation. In case you missed last week’s newsletter, it was discovered that the .NET Foundation required member projects to allow a service account, dnfadmin to have owner rights on the repository, and then secretly went in and transferred ownership of those projects to the .NET Foundation on Github Enterprise. Rob refers to this as a ‘mistake’, as in “the current board thinks it should not have happened”. That response, of course, tells us nothing about why it did happen, which they’re convienently silent on.

👉Reed Cospey gives his Detailed thoughts on the State of the .NET Foundation. Reed is the Executive Director of the F# foundation, (Once again, someone that uses F# can’t resist telling us that), and he gives a great overview of the structural problems with the .NET Foundation — far better than my incoherent ramblings on the subject. It’s worth your time to read if you care about .NET adoption.

🗣The .NET Foundation is holding a “Tell me Anything” session on October 27th. This is your chance to tell them how you feel about the .NET Foundation’s recent actions.

🙅‍♂️ Visual Studio 2022 for Mac Preview will now sport a native Mac UI, and not a cross-platform UI. It’s good — we like performance, but it’s also bad because it feels like an offering like Xamarin shouldn’t have these issues.. Oh yea, and Microsoft purchased Xamarin, so they won’t even use their own product?

📴 Microsoft says it is shutting down LinkedIn in China Which seems weird because the Chinese Government and LinkedIn have something in common: They both want to know who’s been looking at your profile on LinkedIn.

👨‍🎓 Governor Mike Parson threatens Jail time for reporter who right-click and Viewed Source on Missouri Government website and saw Social Security Numbers. He has since doubled down on being a moron.

📢.NET 6.0 RC 2 has been released This release has a Go-Live license, so use it in production.

📢.NET 5.0.11 has been released This release fixes CVE-2021-41355 which is a .NET Core Information Disclosure Vulnerability.

.NET Core 3.1.20 has also been released and it has that CVE fix as well as other bug fixes.

With Indigeonous People’s/Columbus day, it was a short week last week. There’ll be a lull before November when .NET 6 officially launches, and of course when it does so I’ll be there, to let you know what’s going on.

infinite steps to prod

What sits between us and users?

The IDE,
That spits out compiled code
That we send to a build server
That gets deployed to a dev server
That gets played with
That CI promotes to a test server
That gets kicked back by QA
That we fix and put the ticket back in QA
That we send to the Build server
That gets deployed to a Dev server
That gets played with
That CI promotes to a test server
That goes back to QA, YAY it passes their tests
That goes to staging
That is seen by a product manager
That has release notes created for it
That gets a press release by marketing
That gets deployed to production
That a customer uses and finds a bug with
That opens a support ticket in Zendesk
That gets put on a JIRA board
That gets prioritized and assigned to an engineer
That pulls that ticket into In Progress and opens

[Last Week in .NET #63] – .NET Foundation finds out the silent treatment doesn’t work, tries rolling heads

Two years of simmering discord came to a head last week as the .NET OSS maintainers openly revolted against the .NET Foundation for years of non-communication, the Executive Director resigned, and newly elected board members are left to pick up the pieces.

It was a wild week.

First, there was some discord due to the .NET Foundation saying a board member left ‘for personal reasons’ when in reality they left due to the nature of the .NET Foundation itself.

Second, during this brouhaha and when finding out the Executive Director merged a PR without communicating, the .NET community learned that their projects were moved to the Foundation’s Github Enterprise account without their consent, that the DNFAdmin service account was basically a trojan horse (an actual Trojan Horse, not the virus variety), and that even if they signed the ‘contributor model’ contracts, they may not own their own projects.

As I said, it was a wild week.

So, the Executive Director apologized, not for the lack of communication, or moving the projects to the .NET Foundation’s Github Enterprise account, or misstating why Rodney Littles II left the board, or for the fact that the foundation has not been up front with what it means to have a project join the .NET Foundation, but for… forcing through a PR on a project that the foundation ostensibly owned.

Naturally members of the community asked for the Executive Director’s resignation, and they got it. And we sit, a few days later, watching more communication from a single member of the board than we had from entire previous Boards of Directors, particularly around most of the painpoints the community mentioned previously. One of the board members spoke up during the incident but said nothing of consequence, except to say, “Likewise, I think that the community and projects may have not understood what they were agreeing to when they were brought under the .NET Foundation umbrella.”. That’s what we in the biz like to call an understatement. I’m also not the only person to call this entire thing a brouhaha.

And since I’m writing this newsletter, I get to have my say.

I don’t think Claire Novotny should have resigned as the Executive Director of the .NET Foundation. I believe her to be a scapegoat for the structural issues the .NET Foundation has, as I’ve written about and spoken about previously. We’ve had entire Boards of Directors come and go from the .NET foundation with nary a peep from them in public about their work, no after-action review or postmortem, nothing outside of their initial interview to become a member of the Board of Directors.

I believe if anyone should resign, it should be the Boards of Directors. They ultimately are responsible for what the Executive Director and what the .NET Foundation does, and while half the board is fresher than a prince from Bel-air, the other half aren’t, and in some form of irony, it’s only the new people who are speaking out. I think they’re Good People, but they either have no idea what they’re doing or they haven’t seen and felt the issue simmering for the last few years, in which case they most assuredly shouldn’t be representing the community in the .NET Foundation.

It really all comes back to a single question: What does the .NET Foundation do? or, taken further: Why does the .NET Foundation exist?. We haven’t really gotten an answer to that question yet; especially the vague “commercially friendly” mission statement.

I’m willing to bet the Board of Directors haven’t been taking minutes for their daily meetings over the past week, even though the bylaws require them to, and so I’ve taken to asking that the bylaws be amended to require that the minutes are shared for review by the membership of the foundation.

If the .NET foundation is going to exist, then it’s going to have a vision and a purpose. If you care about .NET and the future of .NET, you should be right there, holding their feet to the fire. Otherwise we’re going to get what we’ve always got, a mono-culture that seeks to fulfill Microsoft’s whims about .NET; not what the actual OSS community wants or needs of .NET.

With that bit of news in the can, let’s see what else happened Last Week in .NET:

📚🔥Facebook went down, and of course since it wasn’t DNS it had to be BGP. Honestly I can’t explain BGP to you. I’d like to, but I can’t. Back in the day when I was building a product to discover and map legacy networks, a network engineer took me aside to explain BGP to me and the nightmares didn’t stop for weeks. I’ve since blocked out most of it except for “it’s a way for networks to tell other networks how to route to them”. It’s astonishing that anything works and that we aren’t all finding a desert island to inhabit, away from people and technology.

🧓 Maybe because of, but certainly related to in some form, I learned what a Basil Hayden Old Fashioned was from Adam Rackis, and it sounds delicious. Also if you’re making Old Fashioneds in your kitchen and you have a gas stove, you can use the burner to burn the inside and outside of the orange peel, which apparently helps with the flavors of the orange.

🦄 Either SQL is old or SQL is new again and I can’t figure out which because C# 9 loves some SQL keywords like is, or, and and. If a C# developer fell asleep between 2013 and 2022 they’re gonna be really confused as to the language they came back to.

📅 I did it before it was cool, but Jetbrains released their .NET Annotated Monthly for October 2021, and if you really want a list of links in a monthly format, you could read this list, or just wait and not read LWiDN for a month and read it all at once.

📞 The iPhone 13 can finally photograph dark-skinned folks. This is why diversity in tech matters. 14 years of phone-based cameras for non-white people to get good photos. That’s far too long.

📨 The Register covered Rodney Littles resignation from the .NET Board. They have also previously covered other tech issues like the various Stack Overflow community brouhahas. It’s still weird to me to see inside baseball topics show up in ‘traditional journalism’ that I have to assume that they just have people devoted to these topics.

🌟🦗The CVP for the Windows Developer Platform writes a blogpost on Developing for Windows 11, and because irony is dead, writes that “Windows 11 was built to unlock the full power of the PC”. Because Windows 1 through 10 weren’t?

Did you know there was an alternative to Windows Explorer? I did not. Well version 2 of this alternative is out.

🧀 They moved your cheese in .NET 6 New project templates won’t include the ceremony you remember. They’ll just have the new Minimal API templates because some people just like to watch the world burn.

If you want the old style templates, select .NET 5 when looking for Templates to get the ‘old’ templates back.

🧺 Implicit Usings in .NET 6 With this change you can now use a namespace that isn’t referenced by your .cs file; and so if you want any hope of figuring out where a namespace is from you’d better use an IDE because a text editor can’t tell you. This is a brilliant idea if your goal is to reinforce the necessity of an IDE… like Visual Studio.

🤯 A look at the upcoming improvements to LINQ in .NET 6. There’s Chunking, Range Support, a new Zip Overload, and much, much more.

📝 The WinAppSDK team is actively looking for developer input. Better give it while the giving is good or you’ll just have to go back to Microsoft Connect and wait for them to ignore your issues for years until they finally just shut down the platform.

📹 Dotnetos Conference 2021 carried a talk by Jared Parsons on performance features in C#. I don’t know how to pronounce Dotnetos, sooo. sorry.

📹 Maoni Stephens does a deep dive from A .NET Object from allocation to collection. Any time Maoni speaks, you should watch it. It’s good stuff.

🔉 Mads Torgersen talks C# 10 and I’m starting to feel MCU’d out on the whole C# version number thing.

🥌 And because we need a little fun in our lives, Corey Quinn shares ancient SysAdmin wisdom. Remember when SysOps were a thing? Those were the good ol’ days.

I hesitate to say that’s it for what happened Last Week in .NET… But that’s the standard way to close this thing out, so there you go. See you next week.