Hacker Newsnew | past | comments | ask | show | jobs | submitlogin
Is .NET just miles ahead or am I delusional? (reddit.com)
160 points by popcalc on April 13, 2024 | hide | past | favorite | 252 comments


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.


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.


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.


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.


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?


That's an argument from incredulity... https://en.wikipedia.org/wiki/Argument_from_incredulity


> 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'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).


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.)


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.


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).


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.


Plus the world would probably really a better place if Windows weren't one of the dominating systems, limited to desktop computing, but still...


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.


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.


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


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.


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.


>>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 “.


They are _very_ averse to breaking changes, however.


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’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.


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.


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


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.


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...


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.


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.


I mean, C# runs fine in the browser nowadays too, thanks to WebAssembly


[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.


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.


[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.


>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.


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++.


What new OSs?


I think it'd be easier to list the ones that uses .net


I don't know, Midori?


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!


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.


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


What does debugging look like?


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#.


Really, downvotes?

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


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.


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?


> 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.


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.


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.


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.


imo remix (https://remix.run/) does a great job at that


I literally have no idea what you are talking about. What "basic browser behavior" are you reimplementing that React is blocking you from?


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.


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.


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.


The technical platform is strong but the ecosystem is weak, so it's advanced in some areas but lacking in others. Basically if a technology can't be hosted on Azure or monetized in some other way it doesn't get first class attention from MS and therefore rendered a niche since .NET's 3rd Party OSS ecosystem is weak.

But the C# language is a well-designed modern statically typed language that enjoys best in class IDE tooling from JetBrains and Microsoft. The .NET Runtime is also a stellar performer, especially for a productive high-level language like C#.

It also has some great tech that doesn't exist elsewhere, like Blazor which allows you to build entire websites (backend and frontend) with C#, although there are tradeoffs for pages needing interactivity where you can choose between Blazor Server which maintains a stateful rendering session on the server or WASM which requires a large download with slower initial start times.

Personally I avoid both Blazor Interactivity options and go with Blazor Static Rendering enhanced with progressive JS which avoids both tradeoffs whilst enjoying great SSR/FCP performance and SPA performance without SPA complexity with the intelligent fine-grained updates in Blazor's enhanced navigation [1]. Blazor's Streaming Rendering is also the most elegant solution I've seen for delivering a live auto updating page with minimal effort [2].

[1] https://servicestack.net/posts/net8-best-blazor

[2] https://learn.microsoft.com/en-us/aspnet/core/blazor/compone...


I think your initial sentence summarizes .Net well.

I'm not a .Net developer and never have been. But I used to do a lot of technical due diligence work. Which sometimes means sitting down and going through the most critical code, and sometimes nearly all of the code in a project. When you do this kind of work you encounter lots of different languages and software cultures.

One thing I notice about .Net in particular is that it is often the choice of companies that have a weak software development culture. My guess is that people choose .Net in these companies because they already have a "relationship" with MSFT products. MSFT is what management knows and trusts. Often because they're not qualified to make technical decisions and they think MSFT is somehow a safe choice.

This is also why they tend to choose Azure. It isn't so much a conscious choice based on the merits of the technology. They almost never tried AWS or GCP first, and there is very often some financial incentive to choose Azure (eg licensing package deals).

The .Net projects I've reviewed are often often mediocre software engineering. In particular during M&A, you encounter a lot of code bases that use old .Net versions, old libraries and critical code that hasn't been touched for years. Presumably because the companies that tend to choose .Net often do not invest in the codebase once it is "done". It also isn't unusual that much of the code is written by junior consultants.

This is my experience and it is what it is. It isn't so much about technology as it is about certain types of companies.

But it does result in me having certain prejudices when I hear that something is written in .Net. It is easy to expect bad things when people say "we use .Net".


I’m curious to know what you see at Java and Kotlin shops for comparison.

My experience is the same, but instead of .NET replace it with Java and Spring, it’s otherwise essentially the same


I haven't reviewed any Kotlin codebases. My guess is that if people choose Kotlin then at least they had some opinions on languages, so I'd expect more. But as I said, that's just a guess.

On average Java codebases I have reviewed tended to be slightly better than the C# codebases. The C# codebases I've seen have tended to be more "garden variety meh" while Java tend to be either south or north of "meh" - if that makes any sense. They're more often either terrible or fairly nice. Though I've been lucky and seen more nice than awful Java. (There is a separate circle of hell for Spring and other metastasizing frameworks).

That being said, the all-time worst codebase I have reviewed was in Java. An EMV system written in a hurry with almost zero error handling.


Frankly, having lived and upgraded many projects through asp web forms, wpf, silverlight, and razor, I've decided "never trust .NET UI libraries to survive". So I'm avoiding Blazor entirely and just sticking with the react ecosystem. I trust that 100x more than I trust Blazor, partly because the ecosystem and user base is 100x larger. I won't be the slightest bit surprised to see Blazor tossed in the trash in three years, but I'll eat my hat if react is gone by then. Sure, maybe it's popularity will wane for some other similar library, in which case I'll switch to that. But I'm sticking with the beaten path on the front end.


You've got good reasons for not trusting any .NET GUI libraries from Microsoft, I don't either since they all ultimately end up abandoned however that doesn't definitely doesn't apply to their premier Server frameworks which enjoys first class long lasting support.

Razor didn't go anywhere, it's still the predominant language .NET Server HTML Views is written in since its release in 2010, whether it's in MVC, Razor Pages or even Blazor which enjoys the same familiar statically-typed syntax with great tooling and high performance compiled views.

There's no chance that's going to happen with Blazor, which has become the future of .NET Web App development, it's a unique technology that's highly versatile whose multiple rendering options supports a wide number of different use-cases that's enjoyed by most of .NET developers.

Personally I think it's a fresh of breath air after several years of fragile npm SPA development with broken upgrades stemming from its 100s of deps of varying quality and uncoordinated releases. All I liked from SPAs is its fast navigation, but we also get that from Blazor's Enhanced navigation without SPA complexity, heavy client state, maintaining client side routing, poor SEO, large complex builds, etc.


It's a bold claim to say that the team that produced a half dozen failures in a row has "no chance" of producing another failure. I will set a calendar reminder for five years "is Blazor still around" and I'm pretty confident the result will be "well yes but it's terrible for these reasons, but this new library Tazor is the future of .NET web UI and it's not going anywhere!"


That's not all from the same team, Microsoft is a 2T company with software in every industry. Their GUI suffered through lack of investment and neglect. Their Web Server frameworks are producing software running on their cloud, Windows servers and infrastructure products like SQL Server, all enjoying multi-billion dollar businesses.

Extrapolating abandonment of Windows GUI software with poor business models, with cross-platform libraries running on growing revenue centers is foley, I'll happily take any "5 year Blazor" bet.


"Tazor", ohh! I appreciate a good swipe at their intense fetish of confusing naming


Ha we still have all of those (apart from Silverlight) in production. A number of years ago I had to get an overexcited architect to not rewrite everything in Silverlight.

Front end .Net is a shit show. You are right to stay the hell away from it.


> It also has some great tech that doesn't exist elsewhere, like Blazor which allows you to build entire websites (backend and frontend) with C#

I won’t comment on whether blazor is a good framework for frontend web dev. But it’s far from unique.

These days there’s heaps of languages you can use for both front- and backend web programming. JavaScript and typescript, obviously. Dart. And Go and Kotlin have some blazor-like wasm builds (though they still have a large download size). Lately I’ve been noodling with web dev in rust with Dioxus. It’s crazy fast - it trades blows with the best JS frameworks. And it’s very ergonomic. It’s basically solidjs rewritten in rust. The resulting wasm bundle is bigger than the equivalent JavaScript code, but it’s really not too bad given wasm parses several times faster than JavaScript.

Blazor looks nice. And wasmgc should dramatically reduce the resulting wasm bundle size soon. But it’s far from unique. You can make webpages in almost any language now.


Sorry - correction, I was talking about Leptos:

https://book.leptos.dev/view/01_basic_component.html


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)


Like other highly successful products of Microsoft (e.g. Windows, Microsoft 365), I get the feeling that C# and .NET developers are a largely "silent majority" who may not be getting posted on or talking as much on places like HN compared to developers of alternative options, but this is mostly because they're just getting stuff done with minimal fuss or issue.

I also get the sense that in the U.S. because Java was around for a bit before .NET, it got a head start in terms of market penetration and embedded in a lot of places, so when .NET arrived, even if it was better in some regards, it wasn't enough to justify throwing away investment that had already occurred in Java. As Java was overall more used in the U.S. hiring Java developers was easier, further cementing Java as more popular over .NET.

Meanwhile in other places in the world where there had been less Java investment before the arrival of .NET, it is much more prominent as is the available hiring pool of .NET developers.

As someone who's been using C# for 12 years now, I have always felt incredibly productive with it and even though I never especially felt the experience was bad, it seems to somehow continuously provide some pretty great quality of life improvements.

As with any tool, it's not appropriate for certain kinds of problems, but outside of things like operating system/driver programming or super performance critical code, it is almost always a perfectly fine solution and you won't have any issue hiring developers for it going forward.


> C# and .NET developers are a largely "silent majority" who may not be getting posted on or talking as much on places like HN compared to developers of alternative options, but this is mostly because they're just getting stuff done with minimal fuss or issue.

Or maybe C# and .NET developers are people who learned to program solely to earn a paycheck and they don't chat about programming because they're not computing enthusiasts, which is my conclusion based on the fact that all but one of the C# developers I've interacted with in person are Windows users who have as much experience with other operating systems as one would expect from people who aren't computing enthusiasts.


It sounds like you’re not denying that Java and C# are very popular and arguably the “work horse” languages (although I expect Python is overall more used, even if it is used on very large projects where I feel it’s very often a poor choice).

As with any “typical workhorse” consumers, you land up with lots who are not necessarily passionate about their day job.

Perhaps you’re right it’s more common that C# developers are dispassionate, but I don’t think it means that there isn’t a pretty large absolute number of passionate users, even if the proportion may be low.

Look at Windows, its number of users dwarfs everything else, I fully expect that it has a much much higher percentage of dispassionate users compared to any other operating system, but it’s not to say that there aren’t a lot of passionate users of Windows.

My point is that even if it is indeed true that C# has a very high percentage of dispassionate developer, it really doesn’t mean or say much, aside from the fact that it’s used a lot.

Overall, I thoroughly enjoy using Windows and C# and I’m not going to switch to Linux or macOS for reasons like “wanting to stand out” or “not be associated with dispassionate computer users”, to me it would be like cutting off my nose to spite my face.

Windows and C# have for a very long time been super reliable for me, they really have delivered on “just works” over and over, I haven’t lost any appreciable time to things not working.

I tried Linux desktops a while back and concluded that, outside of people who just need a browser, it’s generally for people who enjoy tinkering with it, while I more prefer that my OS can just play the game I want, or just use the tool I need without needing to spend time tweaking things for it to work.

As for macOS, as a power user, I feel it’s firstly not worth the premium price tag difference, and secondly I can’t see it being worth my having to give up my Windows muscle memory. Admittedly, the battery life is probably unmatched, but I have never found myself wishing that I had more battery life than I get on my business class Dells.


Windows usage has steadily been decreasing, and is now lower than android: https://gs.statcounter.com/os-market-share#monthly-201501-20...

It's also worth realising you've self-selected for tools that work on Windows (e.g. I rarely see Windows simply because the tools I use require UNIX). I don't see Windows going away any time soon (simply because Apple is too expensive), but the rise of mobile devices (e.g. tablets) which cover the needs of basic users mean that it's going to be relegated at some point (as old laptops are replaced by other devices) to being a desktop OS for gamers and business users who require native Windows software (because the web equivalent is too slow/bloated). I expect cheap Chromebooks to replace cheap Windows laptops (as long as Google doesn't screw that up).


In my view, when talking about desktop usage, bringing present day Android into the discussion is somewhat non-sensical as no professional would seriously consider replacing their current desktop with an Android device if they could help it.

However, since you bring up the mobile space, Android is another way to prove one of my points.

Like Windows in the desktop space, Android has a somewhat overwhelming market share (globally), and similarly to Windows has the highest percentage of dispassionate technology users, where they care more about using their social media or payment processing app than what OS their device is running.

Also, I disagree that my usage of Windows is self selecting, it’s actually more selected by device manufacturers and the developers of the software I use.

Between Windows and Linux, I’ll have way less driver issues on Windows. For commercial desktop software, the vast majority is built targeting Windows. I choose the OS which is most likely to run the hardware and software I need with the least amount friction.

ChromeOS may one day become the dominant OS (it also may not), but today, outside of using a web browser, I don’t think it’s unfair to say to say it’s the “poor man’s” choice of OS in the desktop space.

As a final remark, it feels like you’re taking my appreciation of MS’s present day offerings as some sort of attack against your preferences. If you’re happy using non-MS stuff, great for you, but that doesn’t in any way detract from my being incredibly happy with my choice, which just happens to be different.


I agree with replacing a desktop (or laptop) with an Android device for professional work is nonsensical (I hate having to type on a phone), but the majority of people are not professionals.

For a not-insignificant proportion of the population (which heavily overlaps with the dispassionate technology users), media consumption on a mobile device covers their needs (and for things like 2FA, not having a mobile device is an issue), so their laptop/desktop (Windows or Mac) ages out of support and eventually is no longer used (and given the costs of mobile devices, they're not likely to buy a replacement laptop/desktop). Some might use a work/school device, but now what they get is based on their work/school provides (and if ChromeOS is good enough and much cheaper to run, then users won't have a choice). Also BYOD policies generally work against Windows, as a sufficiently large Apple contingent will push moves away from systems that only work on Windows. I would be expect Windows usage to settle to at least 3 times MacOS usage (given Window's better legacy and meeting the needs of white-collar professionals more, and desktop gaming), but my feeling is we're going to see less traditional general-purpose systems (which is somewhat sad), and a bigger divide between those who use desktops/laptops and those who don't.

I would still suggest you have self-selected: if the programming languages and the tools you use (and the kind of projects you work on) are effectively Windows-only, naturally you're going to be happy on Windows (and there's nothing wrong with that). But it's worth remembering that for other ecosystems (e.g. Python since you brought it up), running those ecosystems on Windows is second class (whether that's caused by Microsoft or by the ecosystem), or, because Windows is not UNIX, practically not possible at all (and some of the UNIX software I run for work predates the NT kernel, to be clear).

My only issues with Windows are: 1. how much random junk there is now (advertising in the start menu, really?!?), which I feel is a negative for Microsoft (let Google do that, and catch the flak for it); and 2. having to use it (and wasting time on it) when it's obvious it's the wrong tool for the job (e.g. trying to use an ecosystem where Windows is a second class citizen).

Finally, I do think it's somewhat sad that there's less interaction and knowledge sharing than there could be between Microsoft's ecosystem and those ecosystems outside of it, both could benefit from it (e.g. I hear about Blazor, and it sounds cool, but how would I use it from (C)Python).


Harsh! I have similar experiences/feelings.


> 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.


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.


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.


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.


> 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.


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.


> 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.


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.


> > 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.


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.)


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.


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.


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.


> 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?


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.


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)?


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.


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.


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.


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#.


The article is right. .NET is way ahead of anything in the front end world.

But that’s because the front end world is crap.

React Server Components, the new great idea on the primary front end framework is recreating ASP.Net Web Forms. Badly. At least Web Forms was fully statically typed and provided easy embedding of simple JS instead of having to convert everything to the “React Way”.

HTMX sounds great and is very good in many ways until you realize it’s little more than a desperate cry to go back 15 years in front end programming because front end development has become such a shit show over the past decade+.

Pretty much everything in modern front end development is reversing whatever was done over the past decade and a half because pretty much everything done over the past decade and a half was done to compensate for all the problems with browsers. Now that browsers are becoming decent programming runtimes, and internet speeds and latencies have improved, you don’t need stuff like jquery to compensate for every browser doing things differently, or the virtual dom to compensate for awful DOM performance, or Lodash to compensate for terrible JS engine performance, etc.


There's a lot of fanaticism around Blazor. I knew before clicking it would in part be about Blazor. And I knew they wouldn't mention where its use is suboptimal

Anyone else find c# off-putting to read? Seems like so much white space and Capital.Letters(). On top of the font rendering and default font in visual studio which I find a bit ugly. And blurry iirc

Edit: also, .net just has "cost center" vibes which I think puts off a lot of people. It may be great tech but we don't want to work at those kind of companies that use it


Oooof "cost center vibes" is so accurate. Not entirely true, I've worked some pretty damn cool .NET companies. But yeah, a lot of them are not places I want to work.


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?


> 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).


I would go this way for cross platform native UI


«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.


Whenever this comes up, my thought (admittedly from an outsider perspective) is that people can say that .NET is far ahead in the same way some may say that Oracle is far ahead: Both are enterprise focused technologies that were built using a sales-driven design, trying to check as many feature boxes as possible to help sales teams in their pitches. The problem is when you've been to too many sales pitches and start to equate box-checking with product quality.


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...


I've been working with .Net from day one on large high traffic projects.

No. It's overcomplicated, moves so fast that the maintenance overhead is insane, the open source ecosystem is incredibly volatile and immature and the attention of Microsoft is akin to a schizophrenic monkey. The tooling provided by Microsoft is buggy and unreliable and half the platform abstractions (certificates for example) are fucked up messes which cause endless deployment problems. Not only that you're working in a graveyard of abandoned projects and frameworks and legacy 3rd party components you still depend on because Microsoft sold everyone the ideology and then threw it out of the window or changed direction rapidly.

Oh and don't get me started on C# which started off reasonable but is now the car Homer Simpson designed https://simpsonswiki.com/wiki/The_Homer

All this shit however did pay my mortgage off.


It’s possible that everything you said is 100% true and it’s miles ahead of everything else.


Logically possible yes, but that's not the reality.


Haha, thats exactly i thought! But my experience is the opposite of everything he said!


You’re not wrong from a historical perspective. It was that or PHP for me. I chose well.

I would not choose it now so I don’t think it holds any more.

Go will become the next .net in 20 years.


Miles ahead in what race?

Honestly cannot think of any application that I would willingly choose .NET for. I know people who love .NET but they seem to all work for large corporations, no one in startups or doing anything I find interesting seem to use it.

Maybe I have missed something?


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.


I want to like C# but the spectre of java in there is really obvious to me at least.

It feels like a language made by someone who wants to sell developer tooling


'Ahead'.

Is there anything from .NET that has inspired features in other languages?


https://willspeak.me/2021/11/24/red-green-syntax-trees-an-ov...

>The idea of red / green syntax trees initially came from the Roslyn C# compiler. It was adopted by Swift in their libsyntax implementation. The Rust Analyzer project built further upon this with the Rowan crate. Rowan extends the model of red-green syntax trees with the idea of dynamically typed nodes.

Also probably this:

https://joeduffyblog.com/2015/11/03/blogging-about-midori/

>Midori was a research/incubation project to explore ways of innovating throughout Microsoft’s software stack. This spanned all aspects, including the programming language, compilers, OS, its services, applications, and the overall programming models. We had a heavy bias towards cloud, concurrency, and safety. The project included novel “cultural” approaches too, being 100% developers and very code-focused, looking more like the Microsoft of today and hopefully tomorrow, than it did the Microsoft of 8 years ago when the project began.


I checked out the Midori blog:

https://joeduffyblog.com/2016/11/30/15-years-of-concurrency/

> Developers already had several mechanisms for introducing concurrency, and yet struggled to write correct code.

> STM could handle all of the decisions transparently like figuring out how coarse- or fine-grained synchronization to use, the contention policies around that synchronization, deadlock detection and prevention, and guarantee that you didn’t forget to lock when accessing a shared data structure. All behind a tantalizingly simple keyword, atomic.

> STM also came with simple, more declarative, coordination mechanisms, like orElse. So, although the focus was on eliminating the need to manually manage locking, it also helped evolve synchronization between threads.

Fascinating stuff.

> Unfortunately, after a few years of prototyping deep runtime, OS, and even hardware support, we abandoned the efforts.

Oh well.

> It wasn’t even clear that STM would be the correct tool for the job once we got to that point.

This is just sour grapes. You already identified the problem and the solution. There's no walking that back.

> My brief summary is that it’s more important to encourage good concurrency architecture than it is to make poor ones “just work”

We'll I guess there's just nothing to do but leave it to the programmer to get right!

Miles ahead? Or DNF?


Interesting framing. In my opinion it is sort of the reverse. The structure of .NET was conceived at a time when Java and Objective-C were redefining how to relate to runtime. As a result it is .NET that picked up the inspired features from other languages, and that arguably has put .NET ahead of the languages that inspired it.


Async/await?


Linq


That would put Haskell 'ahead' and .NET 'behind' in this example.

But did you have a different language in mind? One that followed .NET's Linq?


We are only human and thus mostly ignorant. We keep surfing between solutions, claiming that one is better than the other and realizing the problem of our preferred solution and moving on to another or even the previous one. As a community this creates trends. Because we have separate communities, we can even see repeated trends under different names.


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.


> 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.


To be fair, LINQ is quite a good idea. Not new at all, i think the first thing any serious lisper do on a DB-heavy project is writing a query/select macro that does exactly the same thing, except better (sadly, i do mean "writing" the best way would have been to treat it the same as the loop macro, but on the other hand, it's like 2 LOC for a quite complete select macro. Never thought of that, but maybe the conciveness of common lisp plays against code reuse)


I would just use an existing Common Lisp library, which provides query and select.


My rule of thumb is: if it belongs to Microsoft avoid it.


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


I love that with modern .NET you can get started in a few minutes:

1. install the .NET SDK

2. install VSCode

3. install the C# Dev Kit vscode extension

4. run ".NET: New Project" in vscode

That's it, you're done. You can build, run, test, debug in vscode. Or use the dotnet CLI if you prefer.

It's so much better than having to install Visual Studio as a whole before you can try out the language/runtime, and that works cross-platform.


You do not need DevKit, just plain C# extension.


I'm a chronic framework/language jumper who recently switched some projects to dotnet in production, but without a previous Microsoft-flavored background. I often read hn comments to figure out what I'm missing and what to look out for here. I'm sure this thread will be searched for by people like me in the future.

In that spirit, here's my take.

Pros:

* Best performance of any language without memory management. This is true on Linux, and its memory footprint isn't bad either - especially with AoT.

* Best standard library with great docs covering 90% of what you want in most modern apps.

* Development tooling that is just awesome with rider. Easily navigate and understand the source code of imported libs.

* A reasonable syntax that doesn't make weird decisions because of deep dogma. It beats Go, for me, for instance, because it uses exceptions, generics, and LINQ. This makes the code readable and reasonable to write. I know this is controversial.

* Ridiculously simple deployment. No Redis - jobs and cache are practical in-process. Due to its performance, I don't even front it with nginx. Upload a binary on a fresh VM, supervisor and go. A tiny shell script.

Cons:

* Its object-oriented design. The way files are organized in Go makes a ton more sense and doesn't feel as heavyweight. Also, the addition of records instead of real, validatable value types was a huge missed opportunity.

* Went heavily into async/await - indeed, it was the pioneer. Thread-per-connection, co/goroutines, or green threads are actually better models for most projects. I understand the issue with overhead. But the weird call stacks, and footguns inherent are definitely not worth it.

* Compile time sucks. This is the biggest for me. Having a subsecond reload time is essential to a pleasant code flow for me. Hot reloading has too many holes to be practical and this seems like a blindspot. No one seems to mind but golang, node, and python are all much better here.

My background: I wrote some successful SaaS web apps in Django and transitioned some to dotnet for maintainability. I'd previously used C# also as a game developer with Unity. But I bounce around a lot of tech.

I'm in a unique situation as a solo project dev with a long time horizon. I can care about longevity, speed, and ease uniquely. I don't have to worry about employment opportunity of a stack, for example.

Right now, I'm trying to decide between TypeScript/node and continuing with dotnet for my next project's backend.

The backend I wrote in dotnet remains my most stable. It's beautifully simple to manage in production. If only they could make hot reload not feel so bad.


On certain way of structuring classes and structs - there was and still is dogma among many developers for single file == single class, mainly coming from Java.

However, you will see a lot of projects, especially OSS ones which are structured in more C or Rust like style with e.g. Types.cs if API surface is small - no need for a file per class or struct if declaring it takes 1-10 lines (especially with records and primary constructors).


So funny. I always felt the lack of exceptions in Go was one of its strongest selling points.


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?


I think it was the first language to specifically introduce the async and await keywords, but it wasn't even the first language on the .NET platform to support the programming model - that honor goes to F#. See https://tomasp.net/academic/papers/async/async.pdf


> 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.


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.


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.


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.


I used C# and .NET professionally at a previous job. While I enjoyed writing modern C# that emulates python/ruby/JavaScript idioms, I didn’t like .NET the library. As C# gets more modern, you still have to interact with the ancient .NET library which seem like a relic from the 90s


> Its not really typesafe, more like typescript where its autocomplete, but not real.

That is a _wild_ complaint. Just like any language, TypeScript does give you type safety if you use it correctly, e.g. typing at the boundaries, avoiding casts/any, etc.


Wait until they find out how much stuff originated outside of dotnet. I recall a time when a significant portion of the dotnet community did not really venture outside of their ecosystem and were shocked to find that MS just adopted emergent or popular patterns, technologies, and technologies, as if nothing existed until MS built it[0]. The height of this attitude was before dotnet, MS, and really the proprietary software community had fully embraced open source software. I’m unsurprised to find it’s not entirely gone, but I hope it’s fast on its way out.

While it’s great for any ecosystem to adopt new technologies and techniques into their stack, it’s detrimental to think a concept doesn’t exist until your preferred vendor releases their interpretation of it. Beyond the disregard for the effort of people who created and maintain the thing originally, this myopathy also leaves a community unable to gauge the quality of the adaptation to give feedback or avoid the thing altogether. This can and has lead to walled gardens, fractured protocols and standards, poor interoperability, and stagnation in the industry. Less dramatically, you might just be missing out on stuff that’s way cooler.

[0] https://youtu.be/J6hijsqO8H0?si=t11hHPBpd9Z2jye0


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. Overall it felt like the MapStruct library in Java did everything better: https://mapstruct.org/

On the other hand, I haven't had any of the Spring Boot DI related headaches (needing @Lazy sometimes) with ASP.NET, things there seem way more straightforwards and you clearly define whether something should be a Singleton or Scoped and the rest... just gets out of your way and works.

Sadly, there have been very hard to track down cases where I try to do a _dbContext.Add(someEntity) and then when I do a save with just the fields in that one entity changed, the performance absolutely seems to slow down to a crawl. Adding _dbContext.ChangeTracker.AutoDetectChangesEnabled = false seemed to help, but I am still not entirely sure what lead to that behavior, the temp directory on my Linux box also started filling up very rapidly, yet the logs had nothing of use, definitely seems like something I'd need to investigate properly.

Overall, .NET and its ecosystem is pretty good in most cases. Well, at least modern .NET. Also, it being used in gamedev is cool, for those who care about that sort of thing, I wonder why jMonkeyEngine never really took off.


> 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!


in my experience, you can be very productive with dotnet if you stay on the well-traveled path.

I would not use it for private projects, but i like the opinionated defaults in a small team org setting. If your org is full on Microsoft ecosystem (Azure AD, Windows Server, ..) anyway, it fits in very well.

you don't have to be clever or reinvent the wheel because 90% of standard use cases are well documented in microsoft docs. it has a steep learning curve though (e.g. auth in aspnet).


Is this a troll post?


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.


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


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.


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.


That article was a bad HN comment in blog form. The author even put a disclaimer apology on it.


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)


Of Java, the most comparable platform, well yes I would say so. Java is a terrible mess.


Yeah, it has too many things. Working in mature C# codebases is like wading through a swamp, so many abstractions with long and obscure names that makes holding a mental model of the system in your head twice as hard as TS.


Another point about C# - I have never, ever, seen anyone call any C# code beautiful.


Can you give an example of code you consider beautiful?


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.


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.


They won't because they already have async/await


Good, they have the first 3% covered. It's a start.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: