263 comments

[ 4.1 ms ] story [ 256 ms ] thread
So I’ll say that I absolutely echo the post and general comments.

I’ll also say, which I feel is a pariahable comment in 2024, that with 18 years of dev exp through the cycles of Web 1.0, 2.0, everything being a SPA, server-side rendering craze, and then wherever we are now, I just don’t get the hype around React for 95%+ of the scenarios it is used for. It is just so much more harder to get things done, to maintain them, to skill up. The complexity just feels superfluous. Like the Weekend at Bernie’s situation that is “agile methodologies” these days, my gut says this current world of tech must be far more shaped by economic and organisational factors.

By contrast, on face value alone, something like Svelte feels so much closer to how programming used to feel.

I don’t get the hype either. React makes some very difficult things easy but it consumes anything it touches. You’re stuck reimplementing basic browser behavior because React treats the browser as a compiler. It doesn’t extend the browser.

React throws away decades of development and tooling.

Before anyone starts screaming, you can use react for progressive enhancement. But I’ve never seen it used that way.

(comment deleted)
I literally have no idea what you are talking about. What "basic browser behavior" are you reimplementing that React is blocking you from?
I think some version of HTMX / SvelteKit for bigger apps is the future. React is a dead-end, and it only lumbers on because so many people have staked their careers on it. It's the string theory of the webdev world.
HTMX is nice if you really really really want to couple your backend to whatever happens on the frontend.

And yes, yes of course, it makes sense for at least half of whatever anyone is doing nowadays. I'd even go as far as to say that HTMX with the microfrontends idea is the ideal for large organizations with microservices-like independentish features.

... that said, there's a good chance that eventually HTMX will become a WASM kernel capable of transmogrifying a well-annotated OpenAPI endpoint into some kind of UX-positive behavior. And at that point we can, again, finally free the forms from the frozen frontend frontier!

I'm not even convinced that Javascript + JSON fat client architecture is decoupled. It hides the fact that the browser is for better or worse a hypermedia client.
It's a spectrum! (Insert bell curve meme with "everything is connected" on the tails and "noo! that's too coupled" in the middle ! :D)

It's also a lot of trade-offs in a big bundle. (How many people will work on the codebase? At the same time? Is the problem well-defined enough to agree on an API? How much "API evolution" are we expecting? Are there going to be wildly different user journeys based available based on state? Is this Roy Fielding persona in the room with us now? How experienced the developers are? What tools do they know well? How's the infra/devops/deployment story? Do we need to setup Maven and rebuild the whole J2EE JAR/WAR thing in order to change the CSS? Insert everything is an optimization problem meme! :`] )

And whatever stack a particular project ends up picking is just the current culmination of roughly two decades of very strong path-dependence, which itself is a result of a very weird non-cooperative speedrunning through various iterations of these problems. [0] And while the ecosystem will happily continue to churn the project will likely not have the luxury to rewrite everything every few years, so the developers ought to pick something they are comfortable with for the next X years. (And to solve for X we need to know whether this is a personal project or it's the current flagship darling of a soon-to-be multi-trillion dollar company...)

[0] For example both Flash and Java have been sent to sleep with by JavaScript, because they were not able to coevolve with that scrappy thing which was initially thrown together by in 10 days. So it made a lot of sense to not pick JS, and to keep as much as possible on the server-side, or pick Flash for some amazing UX! But the JS engine was eventually secure and built-in to every browser and JS code could be delivered fast.

Having a "backend-for-the-frontend" is unavoidable even in a SPA. Your real backend starts behind that.
React is the closest to just letting me write code in a real programming language, making HTML/CSS/Web stuff a detail. At first glance, HTMX and Svelte are unappealing, because they put these web concepts on a pedestal.
Svelte is too opinionated about how I need to structure my files for me

I prefer unopinionated frameworks

Maybe SvelteKit is, because it offers file-based routing (which I like), but Svelte itself is very unopinionated.
It's the weirdest thing to me how opinionated sveltekit is compared to how unopinionated svelte is. Hard to believe it's from the same people.

I've bitten the bullet with sveltekit, and it does get the job done I have to admit.

Honestly, I think that's great. If you want a full-featured, batteries-included framework that makes most of the hard choices for you, SvelteKit is a great alternative to Angular or Next.js. On the other hand, if you just want some interactive sugar on your HTML pages, Svelte will stay out of your way.
React is a great component-based (functionally pure-ish? puritan!) view library, but when all you have is a render() function things start to look like components even if they looked like something else before.

And then, of course, a whole cottage industry sprung up around it, from create-react-app to hideous HOC form managers. It soon started to became a proper cult, attracting true believers who shunned types, who got burnt by just a bit too much webpack configuration craziness, and then VC money pured in and ...

And now the king is dead, long live the king. All hail HTMX!

Conflating React with webpack is disingenuous at best.
On the contrary, I think React still is fantastic, and I have been using it since 2015. I think you all have forgotten how terrible it was to get anything done without breaking things in the server side rendered apps of yesteryear. I remember, because I maintained one of those until 2021. Endless cycles of regression testing. Trying to make any of those pages client interactive, within two days you are longing back to something like React. In theory, you could introduce a little React on those pages, but since it is an older server side rendered app, there are no APIs to call, all the features are html pages that return mountains of markup. None of the css is consistent, and even a button is not a single button, its 25 slightly-almost-the-same-button. At least with React there is a good chance those would actually have ended up as the _same_ button component.

In my opinion, the reason React still has staying power is the care with backward compatibility, and the fact that its very focused on being a View Library. State management and routing frameworks come and go, but those all live outside of React the library. React doesn't directly force you to have your CSS a single particular way. It's still mainly concerned about being a javascript library, even as JSX is quite far from JS, it is mostly fairly obvious how it ends up being plain JS.

I agree, I recently had a client pay me to use ASP.NET MVC for a new website and it was _terrible_. So many easy things were not only hard, but the docs were just not there. It was extremely difficult to handle even basic layout changes. If I knew it really well, I still think it would have been slower than react to build, by an order of magnitude.
Sort of a newbie to agile/devops here but could you explain the comparison to Weekend at Bernie's? I only know the basic premise of the movie but can't follow how to fit agile methods vs older programming methods into the movie. Thanks!
Bernie was dead but only two guys knew that, he appeared alive and well to everyone else.
Don't worry Svelte 5 will "rune" that feeling and pull you back into the React world.
Solidjs is hitting the spot for me lately. It’s basically react rewritten to actually use reactive views instead of virtual DOM diffing. Your code looks like react but the js bundle is smaller, simpler and faster.

But if you aren’t interested keeping up with “JavaScript framework of the week”, you can do a lot worse than react.

It's way ahead has been for some time. I saw it nearly 13 years ago in my internship and have done primarily .NET stuff in the interim. It's only gotten better with age, dotnet core and new features.

There are gaps - data ecosystem is dominated by Java/Scala/Python. Numerical computing is dominated by Python (used to be R!). Microsoft has a decent story in their own ecosystem for the former. Their work on more numerical data types, generic math, and more are what I think is the start of bringing numerical computing to dotnet.

Can't wait to see what the next 13 years hold.

> saw it nearly 13 years ago in my internship and have done primarily .NET stuff in the interim

If you've mainly done .NET stuff since you started out then I don't see how you can consider it well ahead or not. I've not used C# professionally since 2007 so I can't really comment either, other than that I've not wanted to go back to it, though I'm sure it's changed immensely. If you've not worked with other languages and tooling I don't think you're in a position to say what's best.

I've done some stuff in Node, Python, Java, Scala, R, TypeScript and some other stuff I'm sure, as well. But every time I'm on a project like that I just slog through, constantly reminded of what I'm missing. At this point I'm sure it's something like a "lingua franca" effect, but the point remains that I pine for comfy C# when I'm not using it.

I will say I did quite like working with Scala the language, despite the rather uncomfy Java ecosystem/tooling. Probably the only direction I'd want to go to leave C#/.NET as my primary tools would be towards Scala/F#/Haskell/Clojure/Erlang, etc. but the market for those is comparatively tiny.

Have worked with .NET for several years and I'm happy to say is an insanely good option, and it's miles ahead of competition when it comes to serving a specifc profile of programmer. UX, APIs, docs, tooling are generally of very high quality. If as a programmer you do not ever want to get involved (good luck getting a change landed), and don't care to understand much of what's under the hood just want to read good docs and get back to your usecase, if you like automation as long as it's written by someone else (how many .NET devs can build a project without VS or even care to know?), if you're happy to confine your dev skills to the inside of a box defined by MSFT, there is no close second option.
https://use.expensify.com/blog/ceo-friday-why-we-dont-hire-n... this article again, but in HN comment form this time. yawn
I always find this article very funny. I do not really use .Net myself, only when I need to make a contribution to a project that is already written in it, but the few developers I know personally that use it are using it for incredibly nonstandard work.

I know of an entire framework written in .Net that exists to hook into a proprietary, developer-hostile program and inject a full plugin ecosystem that exposes the protected memory and processing hooks of the program as a user-friendly API.

That article was a bad HN comment in blog form. The author even put a disclaimer apology on it.
Wow, had not read that before. It seems really offensive to ordinary programmers that just want to get stuff done. I also find my peak productivity when using the .NET ecosystem, which after all is good for business.
Building without VS is actually really easy with the dotnet cli, and msbuild was also doable. But now a days you get a long way just doing a: dotnet build
C# is great, IMHO. It's one of the main reasons that Unity did so well and continues to be so popular with indie devs even after all their mis-steps, and despite Unreal Engine offering better tech/tools in other important areas.

It completely transformed game development. No debugging of memory leaks/corruption. Far less waiting for compiling/linking (and no header files!). Generics/Collections vs templates/STL.

It's just vastly more productive, enabling tiny teams to do things that would have been impossible if everything had to be done in C/C++. (And if the alternative is not being able to make the game at all, then any performance down-sides are much less of a big deal)

Are we conflating .NET with C# and ecosystem?

My perception is lots of libraries that does serious work are just written in C and C++, in the future I imagine they will be in Rust and not C# - I am talking libraries you get from NuGet, lots of well maintained ones have a C# API that is a shell around something from elsewhere. Be it ImageMagick, lots of media decoding stuff or even proprietary things, like Flir.

It's usually hard to find a library to do some work for you in C#, in NuGet, that is also maintained - you will have an easier time grabbing the sources and adding directly in your project so you can maintain it yourself as bug appears and debug it more easily. A lot of times the bug is the developer assumed everyone uses Windows.

Most of time when using C# I am reinventing the wheel in it because of this.

I also never had a C# project that used it exclusively.

> Be it ImageMagick, lots of media decoding stuff or even proprietary things, like Flir.

For ImageMagick specifically, there's a purist C# replacement (ImageSharp) that avoids the dependency on System.Drawing.

> A lot of times the bug is the developer assumed everyone uses Windows.

I can't say I've encountered this in years, most libraries are cross-platform out of the box with support for the major .NET 6+ targets (Windows, Mac, Linux).

>Are we conflating .NET with C# and ecosystem?

.NET is C# and ecosystem, so we're rightly equating, but not conflating them.

(cries in VB.NET)
Wasn't VB.NET basically a rework of VB to be a thin facade over the C#-oriented and tailored .NET semantics and libs?
Pretty much what made python so popular. The language made it a necessity that everything that had to be fast needed to be written in another language, but it made it easy to do.

Having an easy to use (scripting) language that can do serious work was and still is awesome

Well yes, I do agree in parts, python is awesome for this and if I am working on the lower level I would much prefer it as scripting language - it's very easy to glue.

On C# and .NET we still don't have a portable C++/CLI, it's still something that is only for Windows and only MSVC. Maybe if they ever port that. But for now I will stick to python.

I'm considering using C# and Avalonia for cross-platform GUI application development but what holds me back at the moment is that I find it hard to evaluate how much cross-platform this combo actually is, and how dependencies generally work in the ecosystem. I've read about a dozen different confusing .NET and NET Core versions, and it wasn't clear to me how to find out which packages from the package manager NuGet work on which platforms.

All of it seems to be quite capable, but how Microsoft-centered is it?

I would go this way for cross platform native UI
(comment deleted)
> it wasn't clear to me how to find out which packages from the package manager NuGet work on which platforms.

As a default rule, any package you see that targets ".NET Standard 2.0" or ".NET 6+" is using the modern SDK and very likely works across all platforms. This will cover the vast majority of open source packages created/updated in the last 5 years. If a package only specifies '.NET Framework' then it'll be windows-only. Modern packages that are tied to a single platform will likely be named as such and will specify a target that locks it to that platform, ie `net8.0-ios16.0` for iOS.

Thanks, that's a super-helpful reply. Do packages with external C / C++ dependencies include binary blobs for platforms or compile them on the fly, or do they need to be configured for each platform? I mostly worried about standard stuff like Sqlite3.
> Do packages with external C / C++ dependencies include binary blobs for platforms or compile them on the fly, or do they need to be configured for each platform?

They usually bundle them in. For example the SQLite packages are bundled with ~23 different native binaries for all of the platforms it supports, and they'll be output to the right place as part of the build process. There's nothing you need to configure.

For licensing or packaging reasons this might not apply to everything (ie ffmpeg).

Where .NET is today, is where I had thought Java would be many years ago. I think there's something to be said about the consistency of C#'s programming API, design and syntactic sugar, as opposed to the smorgasboard of potluck-yolo interfaces that you're greeted with depending on what you're doing in Java. Linq is an interface that is barely present in other languages, despite being one of the most intuitive; Java's implementation focuses more on trying to say "we aren't C#, promise!" rather than providing a decent developer experience, and furthermore by giving itself a confusing name (Stream... Streams...). A recent addition, I'm glad that Java introduced templating and the design and intention behind it has so much potential compared to other languages, but in the end they've released it incomplete and "left as an exercise to the reader", which I think hurts.

Where .NET isn't so strong is its package management, have a look at the maturity and security of maven packages compared to nuget. Yes, signing packages is a pain and yes there's a bit of a barrier to signing up and pushing your packages up to maven repository, but other languages will learn this lesson over time.

Another area, relevant today, is data engineering. Python has shot ahead of everyone else thanks to its "there's one way to do it" philosophy, and thanks to pandas and its relatives. Just try writing parquet files in .NET and then see how simple and up to date it is in Python.

Comparing web technologies though, well, Javascript development has and always will be a mess compared to any language ecosystem that you choose. You really don't have to try very hard. I think this will be the case for as long as web standards are in the hands of a few large vendors (who assume JS is the be-all and end-all), and the barrier to entry remains low.

Some things like LINQ, Entity Framework and some features of ASP.NET MVC are still unmatched by most of the competition.

The one thing I really miss is the simplicity and productivity of ASP.NET WebForms.

It preceded Prototype, jQuery, PJAX, Turbolinks, Livewire, Hotwire, Next, Remix, Meteor. And it partially accomplished what lot of those only did later, but did so in the early 2000s. And it what was, IMO, a bit more "polished" and "finished" than most of what came later.

It allowed us for making our own components, and had server-side rendered HTML but it allowed for richer interactions, the kind that we needed jQuery for a while, and today we need React components for. It had a vibrant community, but with the downside that it was 100% commercial.

Visual Studio took care of everything we needed, it was indeed just about pressing F5 like someone said.

C# is hard to beat. ReSharper (and IntelliJ) really pushed Visual Studio to have a very high quality developer experience. But I don't miss csproj files, even though they no longer enumerate the contents of the project. Ugh, the conflicts.
It's not difficult being in the top 5-10 inside the lower league.

So I'd bet on "he is delusional". When .NET gets a proper M:N parallel runtime it's when they will even enter the competition. They are not even in it right now.

Golang is miles ahead of .NET and it's far from many people's favorite tech.

They won't because they already have async/await
Good, they have the first 3% covered. It's a start.
There was a "green thread" experiment for dotnet a while ago, here is the conclusion: https://github.com/dotnet/runtimelab/issues/2398
Yeah, I saw that some time ago. Their conclusion is basically: "it's hard to integrate with the current ecosystem so we're giving up".
He doesn’t want to read all the research text, especially if it debunks his assertions. Your effort, although appreciated, is wasted on this kind of person.
I've read it. It was not impressive. They prioritized backwards compatibility which is of course their prerogative.

But that's not how you progress.

Having proper M:N parallel runtime is mandatory these days and it baffles me that there people who are still not sold on it. I take it they have jobs and tasks where it isn't necessary but it's an interesting question to ask: for how long?

Ah, the function colouring group of people. That’s how we know you never bothered to try to actually get good at programming.
Are you lost on your way to Reddit? Hardly a productive comment.

While mine was a bit tongue-in-cheek and apparently stung several people, it also has facts behind it. Working on many super-parallel tasks like, you know, good old web apps and APIs, have shown me that using regular threads does not scale.

There is tech out there that solves these problems and many C# and Java devs come off as grumpy curmudgeons instead of being proper techies and engaging arguments on their merit. And you seem to be another example.

Do better. The metrics and numbers are out there on the internet clearly showing that M:N parallel runtimes beat the classic threading model. That you might have chosen not to look for them is not a rebuttal by itself.

You do realize that all these are about multiplexing multiple logical threads of execution on top of few physical threads of the executor? Getting this wrong alongside the Java argument (because Java retrofitted green threads - it could not adopt async/await, pushing it away from the scenarios .NET is already good at) does show me that you neither know how modern async runtimes are implemented nor understand the meaning behind the keywords repeated in every message.
> You do realize that all these are about multiplexing multiple logical threads of execution on top of few physical threads of the executor?

I do, which makes the rest of your comment a very boring ad-hominem.

I never said anything about how is the async runtime implemented. The problem is having certain runtime facilities, not the how below.

Yes, .NET Lang and ecosystem is Miles ahead when it comes to almost everything except perf and fancy projects like kernel/db engine/embedded/fw

I worked across various tech stack lvls - firmware, tools like compilers and web apps

Ive used c#, c, cpp, js and C#s ecosystem was by far most robust and sane to work with

C and CPP's std lib is fucking joke in compare to c#s

Not even Talking about Lang design itself

Id take dotnet cli with built in package manager, compiler, test Runner, crossplat publisher and many more, any Day over anything else

Curious - there is one unnoticed comment on the thread that reminds me of my experience:

> I feel the opposite. Was trying some number crunching, ok net doesnt have an fft.

> What about digital filters... well... lacking

> Displaying scientic graphs, like matplotlib. Nope, there might be a commercial package, but I didnt get a budget.

As someone trying to develop numerical “enterprise” applications in the most boring, maintainable and longevous stack as possible, am I to write and maintain my own foreign function interfaces?

I don’t think this is a practical reality though. There is very good math and SIMD APIs for solving these kinds of problems natively, and finding decent bindings is just a matter of using search on nuget and GitHub. And given how dynamic the progress has been, “not possible” changing to “first class” can happen within a year or two.
The question is then, why not use the native language, or a language where the binding are well-established (and not buggy-as-hell, as is the case with JS)?
> Professionally I've only ever worked in c# code bases.

Pretty much answered their own question in sentence one.

In my opinion OP is delusional. I worked in .net for 13 years and was stoked to leave. The layers of indirection, obtuse abstraction and over application of design patterns in “idiomatic c#” is preposterous.

Having worked professionally with .net for +20 years I have to admit that you have a good point. There are a lot of dogmatism tied to the platform, it's community ecosystem sucks and there is no real lust to go further than what Microsoft offers.

On the other hand, you can easily have a programming career in .net alone. Its not going away the next 30 years.

Well said. Its nothing to do with the language or tooling, just this weird ingrained dogma.

> On the other hand, you can easily have a programming career in .net alone. Its not going away the next 30 years.

Not to mention if a service offers an official client or SDK, C# is almost always on that list. That is awesome.

> The layers of indirection, obtuse abstraction and over application of design patterns in “idiomatic c#” is preposterous.

I don't think this is a problem that is specific to .net. These issues will be found in many large codebases built on platforms that are popular for enterprise development, such as Java.

Not really, it is a great development experience, but so is the Java ecosystem, note the stress on ecosystem and not language grammar.

Also LINQ that so many on the thread are salivating about, were already present in Smalltalk and Common Lisp collections, were influenced by ML languages and the time Erik Meijer from Haskell fame was part of Visual Basic team.

See "Confessions of a Used language Salesman: Getting the Masses Hooked on Haskell".

Nowadays busy with Scala and Kotlin.

And since I made the reference, Java and .NET IDEs, still don't offer everything that Smalltalk or Common Lisp/Lisp Machines/Interlisp-D were capable of, and yes they also offer stuff that wasn't possible back then.

> Also LINQ that so many on the thread are salivating about, were already present in Smalltalk and Common Lisp collections

I think that it's clear that C# in particular was never intending to originate new programming concepts; it was never a research language. It is a commercial language, and aims to take and popularise the best ideas from such research languages, and package them for coders who work in businesses. As such, there has to be some evidence for that idea already. It must be demonstrated to be effective.

You can assume that any good idea in C# already existed somewhere else beforehand, even if not well known. It's not there to break conceptual ground or be in the first segment of the innovation curve.

> I think that it's clear that C# in particular was never intending to originate new programming concepts; it was never a research language.

This is meaningless.

Wasn't c# the first to introduce the async() concept though?
> Wasn't c# the first to introduce the async() concept

The first google hit for this is https://dev.to/maxarshinov/a-brief-history-of-asyncawait-264...

> Despite that C# was the first mainstream language that popularised the async/await keywords, it wasn’t the language that invented the concept. F# added asynchronous workflows with await points in version 2.0 in 2007 (5 years before C#).

Which is exactly my point about c# mainstreaming and popularising concepts that already exist, even if they exist in less-known or less polished versions.

See also the usual reference: https://en.wikipedia.org/wiki/Async/await

Keywords yes, the concept as such no, besides FP languages, CLU, Active Oberon and Modula-2 are some languages that explored the idea.
Smalltalk and Haskell with a with a great development experience? That's the highest endorsement possible. Sour grapes about older languages not getting critical mass isn't a valid point against .NET.
Try to hot reload on both environments, edit-and-continue or a REPL.
It is still not the same experience as Smalltalk and Common Lisp, where everything is accessible, in a graphical based environment.

Maybe one day when CLR gets rid of the remaining C++ and COM stuff that is still around.

What C# has that Kotlin doesn't is the ability to write perfromant code.

Sure, if you really care you probably will go for something lower level, but if you don't want to abandon all the nice things that high lvl language offer, C# still exposes some tools to get your hand dirty every now and then. (Unsafe, stack allocation etc.)

Kotlin meanwhile goes even further then java and completely removes the distinction between stack and heap, slamming every single type into an object. Painful.

Did I mention Kotlin?
Yes?

> Nowadays busy with Scala and Kotlin.

Perhaps not a reference to Kotlin being a good replacement for C#, but you did mention it in a post pushing Java.

Referring to what Erik Mejier is doing professionally, after Microsoft.

English comprehension skills, on a sentence whose context follows from previous paragraph.

Come on, aren't you the "guest language" guy?
Even if we take Kotlin, Groovy, Clojure, Scala, out of the picture, there are:

- A GUI toolkit that is available everywhere, not just on some platforms, needed 3rd parties for others.

- Two major implementations with Real Time GC, and bare metal support.

- A compiler toolkit, that even handles LLVM IR.

- A couple of bootstrapped versions

- Several implementations for various kinds of deployment workloads, specially when taken beyond the desktop

- An almost compatible ecosystem that powers 80% of the global phone market

- Three IDEs, written on the language, portable across the three major ecosystems, freely available and with access to their source code

Just a quick overview beyond guest languages stuff, don't want to bother with all the stuff.

Miles ahead of what? There is a reason that we write javascript in the browser and operating systems in c or c++, and telco services in erlang, and academic works in python rather than in C# or F#.

.Net is the best at being .Net I guess. It has loads of libraries that are both good and terrible. I think the .Net web ecosystem is a god-awful mess of magic DSL's and configuration, and more and more sugar syntax is being added to C# to make it harder and harder to on-board new developers, and .Net Core deciding to break backwards compatibility is probably costing my org 10's of millions of dollars. But I guess I don't need to type as much as I did 10 years ago.

[flagged]
I can't speak for the person you're replying to but I have long professional experience with .NET and agree with what they said. I left my last job specifically to get away from it.
[flagged]
> The OP and yourself must struggle with programming. shrug

"Everybody who doesn't share my language preferences must be bad at programming." Enlightened thinking there.

It's more a fields thing.

Biologists are all over R, physicists - Python, &c.

What set of technologies do you prefer?
C++ and Python. Probably Rust too at some point in the future, but while I love using it my own time I wouldn't recommend its use in my working environment yet.

This is not a universal thing. I wouldn't recommend these languages for every problem and there are lots of places where C# and others definitely makes a lot more sense (including, arguably, the problem domain in my last role). It's just what I like to work with and what is best suited to the work that I do and enjoy.

Any other details you can provide.

It seems like .NET is really geared toward business cases. But .NET is huge, so covers a lot, and not all great.

If you were doing something embedded, or specialized. Maybe that is thing.

On other hand. I also used to love .NET, but when I tried using Python, I did have to agree Python was really fast for simple cranking out little programs.

"Business" also covers a lot. I work in a specialised part of finance, but specialised requirements aren't rare. There is an enormous amount of software written across the world that fits well into the middle ground catered for by .NET, but there is also a lot that doesn't.
>Miles ahead of what?

Miles ahead of the tooling, frameworks, and features of most languages.

>There is a reason that we write javascript in the browser

Yes, we're stuck with it.

>and operating systems in c or c++

Yes, the legacy.

>and telco services in erlang

Erlang doesn't have some particular stronghold in telco services. It was created by Ericsson for their own such use, but it's not like other/most telcos use Erlang. Ericsson itself even neglected (and for a period even banned new Erlang projects, preferring other languages).

>and academic works in python rather than in C# or F#

Huh? Who writes "academic works in Python"? I'm sure some do. Still many write Java, C#, and others, including C++ and even Haskell. Except if by "academic works" you meant "in machine learning and scientific computing", or "use as teaching language".

>>and operating systems in c or c++

> Yes, the legacy.

That's hardly the only reason, and certainly not the reason why new OSes are not written in .net languages.

What new OSs?
I think it'd be easier to list the ones that uses .net
That's the main reason. New OSs like Fucsia have started being written in Rust, and part of OSs, including Windows and now Linux too, have also adopted it.

If we had more mature systems languages suitable for OS development sooner, people wouldn't use C and C++.

Have no idea why people dow vote you, you are obvously correct abiut javascript being popular because its popular, not because it is a good tool in isolation.

Besides,Isn't typescript developed by the same people who made C# and also takes quite few inspirations from it?

People love to complain about web development TypeScript is genuinely a great language in my opinion. The browser environment is really powerful these days and runs on everything.
If you’re going to compile a language to JS, why pick TypeScript?

The Fable compiler for F# barely adds any cost on top of what TS adds in terms of dependencies, compilation and tooling and IMO gives you a much better language for developing applications. And you still get to use the JS ecosystem.

Most of the cost is related to familiarity with both F# and JS, node and the browser.

But once you match on a pipeline of Results you can never go back!

Really, downvotes?

Am I not contributing to the conversation? Has anyone else even mentioned F# or Fable?

You pick TypeScript because you can compile it to JavaScript by hand or in your head. The file size is smaller because there are no runtime features to bundle. When you're looking at the compiled version it's still recognizable as your code just without the types, when you're stepping through things in the debugger there are no surprises, line numbers for errors point you to places that are completely unsurprising because TypeScript is just JavaScript with a type system.

I've tried plenty of other to-JS compilers, even for languages that I love, and I still choose TypeScript every time.

Have you even tried Fable? It’s leagues above other similar approaches and has true JS interop.

It doesn’t feel that much different than the TS compilation process. It is not what you’re expecting.

The main problem with F# is low popularity and hence gig opportunities are a lot fewer.
That is indeed the cost. However, the talent pool is much better. This means your developers aren’t as easily replaceable so that might impact management’s decision making.
I agree here.

I wish that instead of TypeScript, MS had just used F#.

It seems like they took some of the concepts of what can be done in F# and made TypeScript. I wish they had just stuck with F#.

It's almost like it was marketing, like they didn't like how F# was viewed so TypeScript was a re-branding.

Maybe it is because TypeScript can be considered a DSL that could be built by F#. Like Elmish.

EDIT> Yeah, not sure if enough people understand F#. You can easily build TypeScript from F#. Or maybe the downvotes are from Haskell people that just view, a functional language can build anything so it isn't worth commenting on.

Typescript is a superset of JavaScript. Every JavaScript file is a valid Typescript file. This is not even slightly true of F#.
Because it has a strong, really well thought out type system, tons of industry adoption, good debugging in the browser and works with the existing ecosystem.

We tried Haskell in the browser before and it was a huge mistake. We want back to TypeScript afterwards.

What makes F# work so well for JS interop is the support for objects and OOP while still offering up all of the syntactic niceties of an ML language like pattern matching, monad-like computation expressions, etc.

Haskell wouldn't work in this context.

I've had a very easy time debugging Fable compiled projects.

Again, I have extensive node and JS experience which is absolutely required for working on a Fable project.

I would argue that the hardest parts of TypeScript aren't that much less of a leap than F#.

I would argue that this code is easier to debug than the equivalent .tsx:

  [<ReactComponent>]
  let Counter() =
      let (count, setCount) = React.useState(0)
      Html.div [
          Html.button [
              prop.onClick (fun _ -> setCount(count + 1))
              prop.text "Increment"
          ]
  
          Html.button [
              prop.onClick (fun _ -> setCount(count - 1))
              prop.text "Decrement"
          ]
  
          Html.h1 count
      ]
And this basically looks like JS to begin with:

  [<ReactComponent>]
  let ShowGreeting(props: {| greeting : Greeting |}) =
      React.fragment [
          Html.h2 props.greeting.heading
          Html.h4 props.greeting.subheading
          Html.p props.greeting.content
      ]
  
  app.get("/", fun req res next ->
      promise {
          let! response = 
              req 
              |> gql "query { greeting { heading subheading content } }" {||}
              
          match response with
          | Ok response -> 
              let greeting : Greeting = response?greeting
              ShowGreeting ({| greeting = greeting |})
              |> res.renderComponent
          | Error message -> next()
      }   
  )
Again, Result types! Computation expressions! Error handling with these constructs is well worth the price of admission.

Compare this to the try/catch approach you'd be using in TS:

https://fex-template.fly.dev/form-validation

I mean it's great compared to... javascript?
It's great compared to almost every mainstream language. The only downside is the legacy JavaScript stuff it inherited but you get over it pretty quick.

You're obviously not going to use it for low level or high performance system programming, or numeric stuff where you'd use Python, but for day to day getting stuff done it's amazing.

> Yes, we're stuck with it.

Google is the only company that is in a position to do anything about this and they gave up on Dart. So yeah, we're basically stuck with it.

But syntactic sugar is important though.

Arguably one of the biggest downsides of c++ is that it has tons of features without there being a syntactic sugar for using them, which in turn makes them less attractive

C++ has tons of syntactic sugar, the problem is that it's largely syntactic diabetes leaving you confused and unsure about what's happening. The recent article about C++ initialisation was a good reminder.
There’s having syntactic sugar and there’s whatever the F C# is trying to do.

There is so much different syntactic sugar to do the same thing that it’s becoming very difficult to onboard new devs to any slightly complex application worked on by multiple devs because invariably the codebase will consist of 3-4 syntaxes doing the same thing which can get really hard to grok.

In an ideal world C# would have gotten rid of a lot of the ceremonial code it had but unfortunately backwards compatibility means that’s not likely to happen.

I wish C# declared a preferred singular syntax for every scenario and provided IDE support to warn when that preferred syntax wasn’t being used.

I said this elsewhere in the thread, but C# reminds me of The Homer now. https://simpsonswiki.com/wiki/The_Homer

No one is sure what problem it is trying to solve anymore.

Also the amount of people I see blowing their toes off by not understanding stuff like LINQ and when stuff is executed and materialised into memory is insane. That and entirely not understanding async and any weird side effects like things happening on other threads and losing context and all sorts. Urgh.

Im sure C# version 22 or whatever it's on now will allow you to write in plain English at compile time and it'll use CoPilot to compile this to C# which doesn't work.

LINQ is maybe the only thing I miss from my .NET days. But this was the biggest problem with it. It was easy for newcomers to accidentally introduce horrendous performance by failing to understand how LINQ would translate to the underlying store.
Yeah we broke everything one day with a bad merge conflict resolution. The ToList() ended up before the Where() and after Where()!. Tests passed, integration tests worked. Until we had 2000 front end cluster threads all trying to pull a 2 billion row table.
There is so much different syntactic sugar to do the same thing that it’s becoming very difficult to onboard new devs to any slightly complex application worked on by multiple devs because invariably the codebase will consist of 3-4 syntaxes doing the same thing which can get really hard to grok.*

This is exactly the same story as c++. You’d think we’d learn from history.

If that gives you any comfort “new” Java is starting to go the same way.

Too many smart language people trying to justify their salary.

> There is so much different syntactic sugar to do the same thing

Have an example of overlapping syntax?

All the same:

int Foo => 4;

private int Foo { get => 4; }

private int Foo { get { return 4; } }

Do these all compile to the exact same thing?

https://sharplab.io/#v2:CYLg1APgAgTAjAWAFBQMwAJboMLoN7LpHoCW...

Yes, so you are right.

I don't get why in IL, the expression bodied member is different, though. Still, makes sense if you have learned C# starting from the most verbose form (3) then (2) was introduced, then (1).

I could probably give 20 different examples of this too. Not all of them would have identical compiler output, but the behaviour would be.

E.g. you could add

private int Foo { get; } = 4;

To the above example given that the behaviour is identical, although the compiled output should be different so I didn't to avoid any nit pickers.

Visual Studio has build in snippets for boilerplate stuff, so you can type class[tab], ctor[tab], prop[tab] to inject a class contrutor or property into you code. Other IDEs will have similar.

Built in ones are here https://learn.microsoft.com/en-us/visualstudio/ide/visual-cs...

If you want to apply a coding style, there are lots of free tools for that even, or you could investigate something like ReSharper from jetbrains.

https://learn.microsoft.com/en-us/visualstudio/ide/code-styl...

(comment deleted)
I would say it’s completely ok to break backwards compatibility every 20 -30 years as is the case with .NET. Breaking compatibility to consolidate and forward past learnings and that kind of thing. The old .NET framework will be supported for many decades into the future, so it’s not necessary to upgrade if there is no benefit, for example when your customers are .NET dev’s who expect to be support with the new versions
This doesn't sound like once every 20-30 years (.NET itself is only 22):

> We do not guarantee 100% compatibility between major versions. This is true for both ASP.NET Core and the runtime itself. We intentionally make breaking changes where we believe that they are necessary to move the platform forward and the cost of the .NET ecosystem adjusting to them is low enough.

There is a major .NET release every year. Every other release is LTS with 3 years of support.

> The old .NET framework will be supported for many decades into the future

I'd guess so but Microsoft is not as clear on this as you'd wish. In all their policy documents they say it's "supported as a Windows component on the latest required update" or "Beginning with version 4.5.2 and later, .NET Framework is defined as a component of the Windows operating system (OS). Components receive the same support as their parent products, therefore, .NET Framework 4.5.2 and later follows the lifecycle policy of the underlying Windows OS on which it is installed." To me this seems to be carefully written to allow the possibility of changing that Windows component status in a Windows release. So, .NET Framework is supported as long as it is part of Windows, until it isn't.

There was one huge breaking change, that was the move from the Windows-only .NET Framework to the cross-platform .NET Core. I assume that is the one the parent is talking about.

The major releases of modern .NET are relatively painless now, there aren't that many breaking changes. This is pretty much the same as many other languages, and kinda unavoidable unless you go for an ecosystem that aims for very long term stability and is essentially frozen.

The early .NET Core releases had some annoying breaking changes, but it's very different today.

They are _very_ averse to breaking changes, however.
>>We do not guarantee 100% compatibility between major versions.

This is a true caveat for any language or framework, and is a sensible disclaimer.

But I think the author was referring to transition from “.Net Framework 4” series (since 2001 when I first used it, ~23 years ago) where Microsoft declared “.Net Framework 4.8” would be the last major version of that series. And that new developments should use the “.NET Core” series, which is now named just “.NET “.

I'm curious what a good life time length should be to be considered 'stable'.

Allowing your code base to run ok for 10 years, 20, 30 without change. You are talking Cobol type situations where the rest of the industry has moved on, and now your are stuck. So each individual has to judge jumping ship and migrating their systems.

Even Python took the leap and did a major revision that broke everything. But guess it had to be done.

The Python 3 upgrade nightmare was a big mistake. I’m not saying I know the right way, but just because they did it that way doesn’t mean they had to and should have.
It was, but the language as it was in 2 was reaaaaaallly not XXI-century ready.

They could ship both interpreters and communicate with RPC for all I care as long as shit still worked. Though to be fair I haven’t written a single line of Python 2 for about 10 years now.

It did break everything, but I'd hardly call it a mistake. Python3 is more popular than its predecessor ever was. It was very painful for many people, yes, but it doesn't seem to have hurt the language much if at all.
Just because it worked out doesn’t mean it was fine and the way things should be. There are definitely better ways.
We write JavaScript in a browser because of a historical quirk and literally no other reason. There are 0 ways in which JavaScript is the most suitable choice for the browser other than Netscape wanted their own new scripting language really fast and JS was what Eich could come up with in a couple of weeks.

We write operating systems in C because it’s a thin veneer over assembly and coding in assembly is really hard. We use C++ instead of other languages because of its C interop.

Erlang is a really good fit for concurrency so that’s one of the few languages that’s used where it is for its technical merits.

Python is used for academic work solely because it’s easy to learn and easy to get started with so a lot of colleges used python to teach engineers/scientists programming. Python became the language of academia because that’s what the people in academia knew. If colleges had adopted Ruby or Lia for their Programming for non CS majors 101 classes instead, Lua or Ruby would be the language of academia.

Plus the world would probably really be a better place of operating systems etc. weren’t written in C.

Think of all the urgent iOS, Windows etc. patches which could be avoided if the software didn’t suffer from a number of classes of avoidable vulnerabilities.

(comment deleted)
Plus the world would probably really a better place if Windows weren't one of the dominating systems, limited to desktop computing, but still...
it’s easy to learn and easy to get started with

Don’t disagree with a lot of the rest of your post, but this is a real, genuine virtue and ought not to be lightly dismissed.

Python is not fundamentally any easier to use or to learn than something like Haskell or Clojure or Racket or Scheme (I'd argue the contrary) though. It's only true in practice out of sociohistorical accident, because your colleagues can show you how to use it to do things, because their colleagues once showed them.
This is just an absurd statement, of course Python is easier to learn than either of those languages.

I've taught Haskell at an university and almost none of the students ever found the model of computation natural. I think we humans simply find following a series of steps easier than reasoning in an abstract mathematical sense.

That being said, I absolutely see the value of the latter, and consider it a good thing that functional concepts are gaining popularity in imperative languages.

Would it be possible to give a small example of Haskell versus Python that shows why Python's model of computation is different to and easier than Haskell's?
Imagine writing a cooking recipe or any kind of instructions.

They seem naturally sequential and an imperative to me.

I can't imagine how a list of instructions would be clearer in haskell.

I suppose I was looking for a more typical programming example than a cooking recipe, but even so I don't see why Haskell would have a problem there. I wouldn't claim it would be clearer but I still don't see why it would be worse.

    cook meat sauce = do
       pan <- getPan
       addTo pan meat
       cookFor pan 10
       addTo pan sauce
       cookFor pan 3
       food <- contents pan
       pure food
> I wouldn't claim it would be clearer

Although written in an imperative style and thus superficially similar, the haskell differs in that it is referentially transparent.

I think that makes it objectively clearer, because it implies certain guarantees that nothing will surprise the reader.

That's a good point! Python's weird scoping rules can make code very unclear.
Monads are exactly the mechanism for chaining instructions, how could it get any clearer than that?
> I think we humans simply find following a series of steps easier than reasoning in an abstract mathematical sense.

It is not at all obvious that this is truly the case. If it was the case, why didn't humans intuitively develop mathematics from a computational foundation? It took centuries before we made the leap from mathematical abstractions to Turing machines, and the two are (in some great general sense) isomorphic.

"I think we humans simply find following a series of steps easier than reasoning in an abstract mathematical sense" + to perform tasks.

So, you are right regarding the mindset of human philosophers, but that is not the sort of problems OP's students were tasked with solving.

I wasn't thinking about philosophers in particular, but rather about mathematicians and scientists.
I would disagree.

Javascript is as easy to learn as any language, like understanding the syntax of a loop or an if-statement.

But to do anything practical at all, I'd say you quickly bump into a jungle of libraries you need for everything, and then it is just as complicated as any other language, or more. The javascript ecosystem is a nightmare.

Javascript doesn't have a good "starting point". Either you learn it in the browser, and then you need to learn HTML first, or you learn it in node.js, and then it's hard to get Python levels of "fun". In Python, input() is one of the first things you learn, and that actually lets you make somewhat interesting programs. Once you learn loops and conditionals, you know enough to write a "guess the number" game, which is probably the simplest actually useful program you can make. Once you learn to deal with files, you already get superpowers, you don't even need functions, classes and such for simple, text-munging scripts.

Node makes this a lot harder, the simplest way to have interactivity is the readline library, and that requires you to understand functions, closures and the idea of a callback and why one is needed.

Then there's the "R way" of learning Python, in a Jupyter notebook, by stringing functions from Numpy, Pandas, Matplotlib and perhaps some other libraries in your field together, with no understanding of what a loop is, because you don't really need those for basic dataframe and tensor work.

You're 100% right except maybe about Python. Probably the biggest reason it is used is because it actually has a REPL. You can play around easily and do things like Jupyter notebooks. That's completely unimportant for most programming but it's very useful in scientific research.

Python's REPL isn't even any good, but it does at least exist which is more than you can say for most languages.

(And there's also the fact that it's crazy popular.)

I can't think of a single language that doesn't have REPL functionality and Jupyter is literally developed by academics.
What? Virtually no compiled language does, and even the ones that do usually have it as a massive hack (e.g. Cling).
Python's repl is pretty average IMO, iPython is a lot better, Jupyter is best in class.

Perhaps some of the old Lisp or Smalltalk environments could rival that, but no other modern language except Julia and R, which also have Jupyter support, come even close when repl ergonomics is concerned.

OP very clearly said:

> There is a reason that we write {...} rather than in C# or F#.

So are you arguing in favor of C#/F# here? you believe it was more suited for all of these cases? I hope not.

But again, if it's neither, then this comment seems like a out-of-context straw man.

I'd argue the REPL paradigm and readability are why R and Python are dominant in academics. Compilation and/or object oriented and functional paradigms are hard to teach someone who just learned how a text editor is distinguished from Microsoft Word.
In my opinion more than being easy to read the advantage of python is that it allows for very ergonomic APIs in libraries.
I think that's is the sticking feature for devs. Having straddled both SWE and Data Science, data scientists and other academically aligned start in the REPL (or notebooks).
Yes. So you can not really argue that C# is better in the browser than javascript because unlike javascript it doesn't have native integration, or the same loads of documentation and libraries and tutorials and frameworks that are part of the JavaScript ecosystem.
Microsoft decided to release .NET 8 without support for InProcess Function Apps. After a few months of radio silence, they have finally acknowledged that they were working towards support at some point before .NET 6 hits end of life later this year.

I have a fairly large portfolio of legacy in-life systems that are stuck in limbo now, and a limited group of developers to move them to .NET 8.

We wont have to move them into isolated mode on short notice, to get them to .NET 8 but this isn’t the Microsoft of old, where backwards-compatibility is a paramount consideration.

You can still pretty much use .NET and skip Core, so I don't get your point
That would depend on what platform you are developing on, though. I, for example, can't.
I mean, C# runs fine in the browser nowadays too, thanks to WebAssembly
You’re attributing historical choices (or choices that happened before .NET even existed the way it is today) to inherent qualities of technology in the current situation.

This is flawed logic and I assume people upvote it for visibility rather than genuine agreement.

«I’ve only ever worked with C# and .NET» «Is .NET better than anything else?»

Wy do I keep seeing posts like this? .NET seems like a religion to some.

I'm surprised I don't see more. They have a non-negligable market share & people always say their language is the best.
I assume it's because .NET developers go home after their work day and do other stuff instead of posting about computers online.
YMMV. For my co-workers, there is definitely an element of "go home after their work day to the wife and kids." Unless they're in the pub.

But personally, when I post online about any topic, it's mostly because I find the whole "my language is better than yours" thing childish, arrogant, impolite and tiresome. I try not to have strong opinions about technologies that I don't know (and be honest, 99% of us don't know 99% of the technologies that exist) and to produce facts about ones that I do know.

Well, the other languages are what .NET would have been too if it only had 1/100th the resources, no dedicated IDE, no first class platform support, and no thousands-strong paid teams dedicated to quality of life improvements and tooling...
IMO the .NET and JVM camps are well ahead of the rest when it comes to ecosystem quality/tooling/support/longevity.

JVM + k8s + PostgreSQL is my current Boring Stack of choice but I think you could be equally justified with .NET.

As someone who has worked with a very wide variety of languages, libraries, and frameworks over my career, I have encountered this and the inverse nearly every time I've learned a new language.

Most languages with some amount of popularity have at least a handful of features that I wish other languages did as well and that can feel, at least in the moment, to be completely obvious and critical features that every language needs.

I agree apart from htmx recreating mvc, I don’t think mvc can do what htmx does but you can certainly add htmx into your mvc or razor pages
Most "new" languages are sponsored by orgs only interested in server side, where UI is done in the browser. Do you think Google cares about doing UIs in Go?

So of course anything made before the browser became the local platform will be millions of miles ahead for developing local applications.

Add to that that javascript libs seem to be done by a bunch of people rediscovering every screw and wheel on their own...

Most new languages aren't that featured and well-tooled for the server side either.
Of Java, the most comparable platform, well yes I would say so. Java is a terrible mess.
> Build stuff in .net is so easy, I just press F5 and I don't even know what happens, it just works

I started out with C# as de-facto my first programming language and this is exactly the thing I didn't like. I had no idea what Visual Studio does and I was lost without it. Later moving onto C and starting from the ground up with just a text editor and a compiler was quite eye opening.

> > Build stuff in .net is so easy, I just press F5 and I don't even know what happens, it just works

Sounds like PHP.

Xdebug (php debugger) is not very popular imho.

I think because PHP devs are most likely JS devs too and the developer experience becomes different for every language. Logging works everywhere.

Sorry, I didn't mean PHP just works. I mean "it just works" is what PHP devs say about their stack.
Sure, C/C++ is interesting not learn how the toolchain works, but that's a different goal from successfully compiling software with large dependency trees.
> and this is exactly the thing I didn't like.

It is something that you do learn to like when you understand what is going on, but actually just want to fix a problem.

Not that the way the C compiler, linker, execution environment has any significant connection to how C# works. But you have seen the computer on a different level. By the way, seeing the operating system is another level entirely and writing one was an eye opening moment for me that I can only recommend.

Other way around for me. I started out as a c/c++ developer working on the command-line with gcc/gdb and emacs and makefiles. I did over a decade of that, and I'd agree that there is a kind of satisfaction to building "from the ground up" on the bare metal.

But my last two decades have been pretty much all .net and I live a lot of each day in visual studio. I feel a couple of orders of magnitude more productive in .net and I find it hard to imagine why I would want to use any other tools at this point. For getting stuff done, .net is hard to beat.

I mean you can always use the dotnet CLI if you want
Perhaps more to the point, you can also use the filesystem view and edit the config files manually rather than by GUI magic if you prefer (or if you need to diagnose a problem in a solution resulting from different projects having people do different magic GUI things, because comparing files side by side is much easier.)
> C and starting from the ground up with just a text editor and a compiler was quite eye opening.

yes, yes it is. Its fine for teaching, but my word when you're dropped into a large project with no context, it really really sucks. especially if someone is doing "clever" stuff (I'm looking at you research engineer writing "optimised" c++)

I was dropped into a Unity VR project with a C++ plugin than called out to a fancy backend. Unity is a bit of a arse to use because so many information is locked in videos.(thank fuck for LLMs) Everything being c# turned out to be really rather good. Especially if you have a working intellitune.

Dropping out to c++ on the back end was utterly frustrating. cryptic errors, random stack traces, lots of tears. All of that can get into the sea.

I have problems with both. Trusting Visual Studio to build everything means you don't have any idea how to build anything without it. Once you get to C, for some reason you're now writing a makefile to tell the compiler how to feed files to the linker and wrangling with getting it working cross-platform. Or you throw CMake at the problem, but that requires some background knowledge about the ecosystem.

Compared to `cargo build` or `go build`, the GUI-first nature of .net and the build-your-own-toolchain approach of C feel like they're extreme examples of different ends of the spectrum.

I feel this is more a mindset thing and less about the langauge/ecosystem. It's not that hard figuring out how to call the C# compiler and what actually goes into compiling a C# project. Yet, even though I know all this and how MSBuild works, and how solution files work, and parts of the default SDK MSBuild targets ... I still like that things just work out of the box.

At work I maintain most of the project files and some of the surrounding tooling for our product and being able to clone the repository and opening the solution without having to configure or do anything else is still very high on the priority list since it makes starting out easy, it makes just opening up the project and making a small change easy, etc. Some of us switch between languages, products and projects multiple times a day and this sort of thing is a major help in not spending as much time setting up things.

On the other hand, even though I very much like understanding things beneath the surface, I'm still very much lost in how JS bundlers work¹ and Java with Gradle or Maven is also very mysterious to me. Probably also a function of the frequency and time I spend on setting up those things beyond just writing code.

___________

¹ It also doesn't help there there's lots of things that simply cannot work in the browser, e.g. importing CSS or JSON files as JS modules, that the bundler makes magically work in some way.

For me, .NET Core has been largely solving this problem over time. In classic .NET Framework it was nearly impossible to make something without Visual Studio's arcane templates. The `dotnet` command simplifies a lot of that, and projects have a lot less boilerplate.
Besides the one mention of Go, he seems to be comparing C# to JavaScript/TypeScript. C# is decent, but the JS/TS ecosystem does not set a high bar for comparison...
Yeah, the comparisons seem to be fairly… one-sided. The people who love C# for being better than "everything else" seem to only have dealt with JS/TS/React and C(++), and not any of the actual competitors to C#.
I feel this way about F#. It's so much better than C#, I'm constantly missing things from it when in C#. I go back to C# and try to explain the missing features but just get blank stares, because it's hard to imagine a feature you've never seen before.

C# is a fine server-side language, but to be honest it's only gotten there since .NET Core worked on Linux. I still have to work sometimes on crusty old framework projects that constantly break. Every week these teams are chasing down some MSBuild version error, or are dealing with an issue caused by the WCF SOAP endpoints, or some home grown ORM crap because EF was absolutely terrible until recently. So many build errors because the code runs on a windows server that just got patched and for some reason the code won't run.

There's a real toxic cultural effect too. I know plenty of .NET projects that just collapsed because they followed the crowd and designed a complete mess of lasagna. I'm talking 10+ layers just to get a record out of the database and sent to an API. So many classes like "ManagerRepositoryFactoryFactoryImpl". So much indirection with event pipelines and listeners and DI. I've seen an audience give a standing applause to a C# talk where the main point was "more than one function in a file causes bugs, so every function should be in it's own file". There's so many niche cultures that celebrate what I'd call "bad code". And it's hard to buck that trend when a big chunk of your hiring pool has bought into a terrible design philosophy. Not everyone, plenty are wise and see it as nonsense, but plenty have bought into some really weird ideas, see it not work, but then blame the implementation not the philosophy. Then they move along to the next project, brimming with holy zeal to "fix" it with design patterns and event sourcing.

But yeah, today, coming into it fresh, .NET Core is pretty rad. I manage three client projects on it, and it's pretty great. It's really smooth, builds great, is fast enough for CRUD, EF is decent and I can write raw SQL for the 20% of queries that need it. I can autogenerate swagger docs with swashbuckle, then autogenerate my typescript API consumer from that. I've got my code building and running in Linux docker containers and it all just works and it's fast enough for what I need.

But it's forgetting a lot of history and culture to assume it was always this good. It definitely was the worst back in 2003-2014. Keep in mind it used to be closed source and you had to pay through the nose for Visual Studio just to build anything at all! IIS and VSS from 2008 still give me nightmares. Up until about 2020 I recommended people use other tools if they were starting a new project. Today, it's my first recommendation for a backend.

(Also I think Visual Studio still is really lacking in features, so I use Rider instead and it's awesome. But to each their own)

Currently using .NET and ASP.NET for the API of a project that I'm working on, overall it's a pretty lovely experience, especially with the JetBrains Rider as my IDE. Having worked with Java in the enterprise in the past, it feels like a more focused and sometimes more coherent experience (vs the more decentralized nature of Java), that now thankfully runs fine on Linux as well, don't even need to hope that Mono is good enough anymore.

It actually feels pretty close to Java in some respects, for example LINQ and the Stream API are both pleasant to use and let me be pretty productive.

Entity Framework Core is great, the way how they fetch related data is straightforwards: https://learn.microsoft.com/en-us/ef/core/querying/related-d...

I also really like the ability to use split queries, when needed: https://learn.microsoft.com/en-us/ef/core/querying/single-sp...

You can even scaffold your entity mappings from an existing database and manage database migrations separately (which I feel is a must unless you want to pour hours upon hours into learning yet another JPA-like), it's nice when something like that exists in a given ecosystem: https://blog.jetbrains.com/dotnet/2022/01/31/entity-framewor...

Some of the stuff in the ecosystem is also really nice, like using ActionBlocks from Dataflow for simple queues and task scheduling is very easy to get started with and pretty pleasant: https://learn.microsoft.com/en-us/dotnet/api/system.threadin...

Honestly, most of the docs that I've come across are rather pleasant and there's plenty of code examples to be had and even LLMs have enough codebases out there to be trained on and give decent output, in addition to the regular autocomplete in the IDE.

Even some third party stuff like CsvHelper is really well put together: https://joshclose.github.io/CsvHelper/getting-started/#insta...

That said, I've had issues where trying to deserialize incoming JSON requests ([FromBody]) lead to the whole object being null, due to it not matching the fields 1:1 or violating some nullability constraint, however that happened without a clear error message or as much as a warning in the logs, which felt insane and wasn't very discoverable. Now I just use JObject as the parameter and deserialize at the top of the controller method.

I've also run into some ecosystem issues where the OpenAPI codegen was a bit lacking and wouldn't actually generate code that works, but maybe that's because the spec was bad: https://openapi-generator.tech/docs/generators/csharp

I could also not get AutoMapper (https://docs.automapper.org/en/stable/index.html) working satisfactorily, so for now I'm stuck writing mappers by hand with said autocomplete sometimes doing it for me. There were issues with the runtime being unable to register the mappers or something like that, it was a while ago. Over...

> Now I just use JObject as the parameter and deserialize at the top of the controller method.

This might be worth fixing, you're paying a performance penalty by needing to do intermediary deserialization and by using the old Newtonsoft serializer (STJ is significantly more performant).

Request validation (ie with FluentValidation) would shake out any deserialization mistakes.

> I've also run into some ecosystem issues where the OpenAPI codegen was a bit lacking and wouldn't actually generate code that works

Try Microsoft's new Kiota generator, its works a lot better.

Thanks for the suggestions, much appreciated!