The .NET Stacks #10: .NET 5 taking shape, how approachable is .NET, a talk with Jeremy Likness, more!
We had a tremendously busy week in .NET and it shows in this week’s edition.
This week, we:
- Discuss the latest in .NET 5
- Think about what it’s like to be a beginner in the .NET ecosystem
- Kick off an interview with Jeremy Likness, Microsoft’s Sr. PM of .NET Data
- Take a trip around the community
Also, say 👋🏻 to my parents! They just subscribed and this is the only line they’ll understand. 🤓
.NET 5 is close, so close
This week, we hit the preview 7 release for .NET 5 (see the notes for .NET 5 Preview 7, EF Core 5 Preview 7, and ASP.NET Core updates in the new preview, as well as Steven Toub’s post on .NET 5 performance improvements). The next release for .NET 5 will be Release 8, and then there will the two RCs (each with “go live” licenses). .NET 5 is slated for official release in early November.
What’s new in these previews? A few items of note:
- Blazor WASM apps now target .NET 5
- Blazor improvements in debugging, accessibility, and performance
- In EF, a
DbContextFactory
, ability to clear theDbContext
state, and transaction savepoints
It looks like single-file apps, the ability for .NET Core apps to be published and distributed as a single executable file, is coming in the next release (release 8).
How would you help a beginner get started on .NET?
Dustin Gorski published a great post last week called .NET for Beginners. It certainly isn’t a quick read, but I would recommend giving it a read when you get a few minutes. He discusses why many feel that .NET isn’t very approachable for newcomers. It opened my eyes: I was aware of most of his criticisms, but I’ve been dealing with them for so long I haven’t thought about how difficult it can be for newcomers coming into .NET for the first time.
From my perspective, what I agreed most with was:
- How you have to know a lot to get started
- How feature bloat really prevents beginners from knowing the best way to do something, when there are so many ways to do it (with varying performance impacts)
- How the constant change and re-architecting of the platform makes it almost impossible to keep up
Think about it: if someone can to you and asked how to get started in .NET using a sample application, what would you say?
Would you start by explaining .NET Core and how it’s different than .NET Framework? And mention .NET Standard as a bridge between them? Or get them excited about .NET 5? Would you also bring up C# and F# and VB and the differences between them? What about Xamarin and Mono? What about a simple web site? Should they get started with Blazor? Traditional MVC? Razor Pages? One of my biggest takeaways from the piece: you have to know a lot of trivia to start developing in .NET.
Feature bloat is real, especially when it comes to C#. Take, for example, the promise of immutability in C# 9 with records (which I’ve written about). Records are similar to—but have immutable features over—structs. The exact reasons aren’t important here (that records are meant for immutability and prevent boilerplate code) but a valid complaint shows: why are we introducing a new construct into the language where we could have improved on what already exists? If someone wanted to use immutability in .NET, what would you say now? Use records in C# 9? Use readonly structs? What about a tuple class? Or use F#?
This is not to say Microsoft isn’t aware of all these challenges and isn’t trying to improve. They definitely are! You can head over to try.dot.net to run C# in the browser (with an in-browser tutorial). You can run code in the docs and in Microsoft Learn modules. C# 9 top-level statements take away that pesky Main
method in console apps (yet another shameless plug).
Coming from the slow-moving days from the bloated System.Web
namespace, I never thought I would be hearing (and agreeing) about gripes of .NET moving too fast. This is a testament to the hard work by the folks at Microsoft. Taking hints from .NET 5, I hope .NET allows developers to focus on what’s important, not try to be everything to everyone, and avoid feature bloat in C#. I think a continued focus on approachability positively impacts all .NET developers.
Dev Discussions: Jeremy Likness, Sr. PM of Data at Microsoft
If you’ve worked on Azure or .NET for awhile—like Azure Functions and Entity Framework—you’re probably familiar with Jeremy Likness, the senior PM for .NET data at Microsoft. He’s spoken at several conferences (remember those?), writes about various topics at his site, is a familiar face on various .NET-related videos, and, as of late, can be seen in the Entity Framework community standups (and more!).
I caught up with Jeremy to talk about his path to software development and all that’s going on with Entity Framework and .NET 5. After you get through this week’s interview, I think we can all agree his path to Microsoft is both inspiring and absolutely crazy.
Jeremy was very generous with his time! Because there’s so much to cover, I’ve split this into two different parts. This week, we get to know Jeremy. Next week, we’ll get into his work and discuss Entity Framework and .NET 5.
As a developer at heart, what kind of projects have you been tinkering with?
My first consulting projects … involved XAML via WPF then Silverlight. I was a strong advocate of Silverlight because I had built some very complex web apps using JavaScript and managing them across browsers was a nightmare. … Silverlight was an implicit promise to write C# code that could run anywhere, and for many reasons probably more political than technical, the promise was not fulfilled.
I believe it has been realized with .NET Core and more specifically, Blazor. I resisted Blazor when it came out due to the existence of mature web frameworks available like Angular, React, Vue.js and Svelte, but colleagues convinced me to give it a spin and I was blown away by two things: first, how productive I could be and produce so much in a short period of time. Second, how many existing packages work with it and run inside the browser “as is.”
I’ve been building a lot of Blazor apps to explore different protocols, ways of interacting with data, application of the MVVM pattern and more. I’m working to publish some reference applications that show how to use Blazor with Entity Framework Core and have published seven articles.
I am also diving into expressions. I published a blog post about parsing JSON and turning it into an expression tree to evaluate. I’ve also written about the inverse: parsing an IQueryable
LINQ expression to pull out the various pieces. Imagine you have a queryable source that you send to a component that then applies ordering, filtering, and sorting. How do you inspect the result to verify how the query was manipulated?
What is your one piece of programming advice?
After decades of building software my biggest piece of advice is that your first step shouldn’t be to find the library or framework or tool, but to solve the problem.
Too often people add frameworks or tools or patterns because they’re recommended, rather than actually determining if they add value. Many times the overhead outweighs the benefit. I’m often told, “That solution isn’t right because you don’t have a business logic layer.” My response is, “So?” It’s not that I don’t see value in that layer for certain implementations, but that it’s not always necessary.
Have you worked on that project that forced an architecture so that one change involves updating five projects and the majority of them are just default “pass through” implementations? I am a fan of solving for the solution, and only then if you find some code is repeated, refactor. Don’t over-engineer or complicate. One of my favorite starting points for a solution is to consider, “What is the ideal way I’d like to code for this?”
This is just a small portion of my interview with Jeremy. There is so much more at my site, including Jeremy’s unusual path and a crazy story about his interview!
🌎 Last week in the .NET world
🔥 The Top 3
- We’re getting so close to .NET 5: Jeremy Likness announces EF Core 5 Preview 7, Richard Lander announces .NET 5 Preview 7, and Microsoft also announces ASP.NET Core updates in .NET 5 Preview 7.
- The .NET Foundation has begun the voting process for board elections.
- Jon Hilton asks if Blazor EditForms is essential or too much magic.
📢 Announcements
- Kayla Cinnamon announces the release of Windows Terminal Preview 1.2.
- Tara Overfield announces the .NET Framework July 2020 update preview.
- It looks like many-to-many is now working in the EF daily builds.
- The Azure Service Fabric 7.1 announced a second refresh release.
- The Windows team announced the first update to the Windows Package Manager.
- Daniel Jurek talks about the July release of the Azure SDK.
📅 Community and events
- SciFiDevCon is coming next week.
- We had three community standups this week: Desktop discusses EF Core 5 updates, Entity Framework discusses scaffolding with Handlebars, and ASP .NET discusses web tools with Sayed Hashimi.
- The DotNet Docs Show talks .NET desktop app development with Olia Gavrysh.
😎 Blazor
- Lee Richardson compares Blazor WASM with Angular.
- Ramkumar Shanmugam discusses how to use bUnit for Blazor and integrating it into your Azure pipeline.
- Eilon Lipton provides a monthly update for hybrid Blazor apps in Mobile Blazor Bindings.
- Marinko Spasojevic discusses Blazor WebAssembly forms, form validation, and @ref directives.
- Andrea Chiarelli secures Blazor WebAssembly apps.
- Marinko Spasojevic sorts in Blazor WebAssembly and ASP.NET Core Web API.
- Matthew Jones builds Conway’s Game of Life in C# and Blazor WASM.
🚀 .NET Core
- Michal Bialecki merges migrations in EF 5.
- David Grace discusses creating your own logging provider to log to text files in .NET Core.
- Thomas Levesque works through ASP.NET Core 3, IIS, and empty HTTP headers.
- Carl Rippon does integration testing on ASP.NET Core Web API controllers with SQL.
- Michal Bialecki adds EF Core 5 migrations to a .NET 5 project.
- Jon P. Smith talks tips and techniques for configuring EF Core.
- Jason Gaylord talks about adding Newtonsoft.JSON back to .NET Core 3.1 and later.
- David Grace uses hosted services in ASP.NET Core to create a “most viewed” background service.
⛅ The cloud
- Damien Bowden waits for Azure Durable Functions to complete.
- Steve Fenton talks about how to start and stop an Azure App Service on a schedule with Azure Logic Apps.
- Angie Doyle provides a monthly update on the Azure Portal.
- Chris Noring learns durable functions with .NET Core and C#.
- Jason Gaylord creates an Alexa skill using .NET Core and Azure.
- Daniel Krzyczkowski talks event sourcing with Azure SQL and EF Core.
- Aaron Powell continues working with GraphQL on Azure.
- Microsoft appears to be working on an Azure-powered cloud PC service.
- Steve Gordon introduces Docker ECS integration for AWS.
- Itay Podhajcer deploys a serverless RabbitMQ cluster on Azure with .NET.
- Damien Bowden uses Azure Key Vault and managed identities with Azure Functions.
- Azure Tips and Tricks has a new article about Azure Functions and secure configuration with Azure Key Vault.
- Over at AWS, Steve Roberts talks about AWS X-Ray for tracing distributed .NET apps.
📔 Languages
- Josef Ottosson talks about how C# 9 records will change his life.
- Derek Comartin wants you to stop throwing exceptions and start being explicit.
- Khalid Abuhakmeh has fun with LINQ expression visitors.
- Dave Brock goes on a C# 9 scavenger hunt.
- Jeremy Likness looks behind the IQueryable curtain.
- Jonathan Allen talks about lambda improvements with C# 9.
- Anand Gupta dives deep on .NET garbage collection.
- Jonathan Allen talks about range operators and pattern-matching in C# 9.
- Ian Griffiths talks about supporting older runtimes with C# 8 nullable references.
- Jonathan Channon talks about applicatives and custom operators in F#.
🔧 Tools
- Khalid Abuhakmeh writes Xamarin.Mac Apps With JetBrains Rider.
- Michael Shpilt offers some tricks on working with the Immediate Window in Visual Studio.
- Adam Storr loves Resharper 2.
- Joseph Guadagno debugs Azure Function Event Grid triggers locally with JetBrains Rider.
- Over at the NDepend blog, some tips for working with Visual Studio files and layouts.
- j2i.net does a review of the Windows Terminal Preview.
- Scott Hanselman explores RepoDB, a .NET open source hybrid ORM library.
📱 Xamarin
- David Ortinau draws UI with Xamarin.Forms shapes and paths.
- Stefan Nenchev builds a sample app with Xamarin.Forms, Telerik UI, MVVMFresh, and EF Core.
- Charlin Agramonte works through multilingual support in Xamarin.Forms.
- Rendy Del Rosario creates a Xamarin Binding Library for iOS And Android.
- Nick Randolph says: Xamarin.Forms is not just a XAML platform.
- The Xamarin Podcast talks about Xamarin.Forms 4.7.
🎤 Podcasts
- The .NET Rocks podcast has a lively discussion with Sebastien Lambla about Microsoft’s role in the OSS ecosystem.
- The Microsoft 365 Developer Podcast discusses using Blazor to create Microsoft Teams tabs.
- The 6-Figure Developer podcast talks with Edward Thomson about GitHub Actions.
- The Coding Blocks Podcast talks about architecting for low-risk releases.
- At Technology and Friends, David Giard talks with Dave Pine about .NET 5 and the Docs team.
- The Azure DevOps Podcast talks with Jimmy Bogard about AutoMapper and MediatR.
🎥 Videos
- The Xamarin Show discusses shapes, paths, and app themes in 4.7.
- Data Exposed talks about automated backups for Azure SQL.