10 comments

  • CharlieDigital 6 hours ago
    I started my career doing ~20 years of C# from pretty much the very beginning (JavaScript even before then!).

    Around 2020, I switched into the startup space and quickly picked up TypeScript since that's "what the kids use". It wasn't without struggles, but once I wrapped my head around TypeScript as "shapes for JavaScript", it clicked.

    At the time, the startup was undertaking a new product built on Nest.js[0] which looked awfully similar to ASP.NET web APIs which had the benefit of being much more mature, complete, and with one of the best ORMs (EF Core). I suggested it to the team and was a bit shocked by the pushback.

    It ultimately inspired me to do a bunch of writing [1][2] on just how similar these two languages are and how they've converged on syntax (no doubt owing to Anders at the helm). Of course, they ultimately still have quite a bit of a gap, but for teams that are working in TS and finding that they are outgrowing it, C# is a very natural choice.

    I left that startup after a short stint, but boomeranged almost 3 years later. Company went from seed to series C in that time. End of last year, we started the migration from TypeScript on the backend to C# on the backend and haven't looked back. The toolchain is far simpler and stable, the "default" ORM is far more flexible and powerful, the more rigorous type chain seems more conducive for agent-driven coding. Team adapted relatively quickly within ~4 weeks.

    [0] https://nestjs.com/

    [1] https://typescript-is-like-csharp.chrlschn.dev/

    [2] https://itnext.io/getting-functional-with-c-6c74bf279616

    • rafaelmn 3 hours ago
      I can't say for sure because I don't know the full situation, but I've heard a similar story a few times and IMNSHO looking at it as "they made the wrong choice initially" is off because it assumes that a C# team could have delivered the initial version in the timeline required to get to the the next level of project.

      If they had a team that knows nest and can iterate fast with it that's the perfect choice. I've worked at multiple agencies over the years and was mostly in C# teams. Whenever a C# team got on greenfield/startup projects it ended up being a shit-show of self inflicted slowdowns/over-complications. I've seen 3 projects where in large part due to slow development of the MVP the project missed investment window or ran out of funds.

      From my experience Node/Rails teams were much more capable of delivering shit that works. It would eventually have a bunch of problems that would be non issues by default on a different stack like ASP.NET, but the difficulty of getting to that point and realizing that just being in that situation is a win is what most engineers miss.

      • ngruhn 2 hours ago
        Same experience here. C# might have superior tooling, performance, whatever but the OOP baggage is too heavy. In theory you can write something else than a giant over-complicated, over-abstracted pile of OOP nonsense in C#, but every team I've seen has.
        • hvb2 35 minutes ago
          Just to keep it relevant and off topic. Typescript is moving to go because you just cannot get performance out of javascript because of its design.

          As he says in the video about perf "you cannot leave 10x on the table".

    • wbobeirne 2 hours ago
      I assume the startup wasn't also leveraging typescript heavily on the frontend, that tends to shift the weight in its favor. Having one set of tools to use across everything, being able to share logic and types without needing to go through lossy translation layers, and giving (especially small) teams better flexibility to move people around is a huge benefit.
    • hirvi74 1 hour ago
      > the "default" ORM is far more flexible and powerful

      I have never used any ORM that is as capable. Entity Framework Core with Linq is what keeps me on .NET.

  • m132 9 hours ago
    Surprising to me that (in the context of TypeScript) ECMAScript 4, ActionScript, and Google Closure were not mentioned! Especially the first two; Macromedia/Adobe and Netscape/Mozilla have been working on baking TypeScript into JavaScript proper for a whole decade before HTML5, the mobile boom, and the associated problems have emerged. ES4/AS3 even had a nearly identical syntax.

    What's even more interesting is that Microsoft and Google were part of TC-39 at the time, and were the main opponents of ES4. While they had some rightful reasons to take this position, there's no way ES4 hasn't shaped TS in the end. Perhaps the lack of mention of any of this is due to that TypeScript might have been handed to Anders' team after the project vision and original design have developed (in the video, it is introduced as a continuation of "SharpScript"), but the interview still left me rather insatiated.

    • pier25 4 hours ago
      > ES4/AS3 even had a nearly identical syntax.

      Yeah. As someone who lived that era it was so frustrating that they abandoned ES4. I used AS3 daily for almost a decade until Adobe abandoned ActionScript4 and Flash Next around 2015.

      • afavour 22 minutes ago
        I worked on a web app that used AS3 and Adobe Flex for UI. It’s crazy to think about how powerful that framework was and it was twenty years ago now.

        No, it was never right for public facing web sites but it shined making internal admins. HTML5 still hasn’t matched it.

        EDIT: turns out Flex still lives on as Apache Royale: https://royale.apache.org/ wish I had an excuse to take it for a spin.

    • epolanski 9 hours ago
      Out of the big 4 involved in typescript, only one was involved with the tc39
  • pdevr 10 hours ago
    I watched this last week.

    The part about veering constantly to navigate the maze of internal politics is fascinating. The compromises he had to make, like not being able to put in on Github initially. The easy victories, like making TypeScript open source.

    The long road to success. The obligatory advice for people writing new programming languages (Hint: Mostly, don't.). His opinion about creating a new language for AI (I agree with his insight, but still think it is possible).

    Overall, well worth watching.

  • aristofun 23 minutes ago
    Typescript is the best thing that happened to web development since web development.

    I just hope they will not overengineer and ruin it moving forward

    • bugfix 16 minutes ago
      I think this ship has sailed.
  • nozzlegear 1 hour ago
    I used to dream about a TypeScript that targeted dotnet. These days I'm not so sure I'd use it, only because I have a tendency to get caught in the weeds "big braining" the type system to make the perfect type for every situation. F# is my happy medium for the backend.
    • gavmor 1 hour ago
      What's missing from C#?
      • nozzlegear 49 minutes ago
        If we're talking about C# versus F#, then as the other person said, discriminated unions is the main reason I prefer F#. Pipes are excellent too, but I also just like the syntax more.

        For C# versus TypeScript, it's primarily the type system. You've got DUs like F#, but you also have structural typing, dependent types, linear types, refinement types, string types, and so on. It's F#'s type system on steroids IMO.

        That said, C# is a great language and I use it all the time. I have a modestly popular open-source package that I write primarily in C#; I do that to make sure it's ergonomic for a C# developer first and foremost (since it's the more popular dotnet language by far) before adding in considerations for VB or F# developers like myself.

      • kristianp 12 minutes ago
        Restraint.
      • hirvi74 1 hour ago
        Discriminated Unions is one thing I would like.
  • socalgal2 11 hours ago
    I don't know that many languages but, having been writing lots of typescript in the last 3 years there are so many things I love about it.

    It infers types. If I do

        const data = [
          { name: 'bob', age: 35, state: 'CA' },
          { name: 'jill', age: 37, state: 'MA' },
          { name: 'sam', age: 23, state: 'NY' },
        ];
    
    Typescript knows data is an array of { name: string, age: number, state: string }. I don't have to tell it.

    Further, if I use any field, example

        const avg = data.reduce((acc, { age }) => acc + age, 0) / data.length;
    
    It knows that `age` is a number. If I go change data and add an age that is not a number it will complain immediately. I didn't have to first define a type for data, it inferred it in a helpful way.

    Further, if I add `as const` at the end of data, then it will know 'state' can only be one of `CA`, `MA`, `NY` and complain if I try to check it against any other value. Maybe in this case 'state' was a bad choice of example but there are plenty of cases where this has been super useful both for type safety and for code completion.

    There's insane levels of depth you can build with this.

    Another simple example

        const kColors = {
          red: '#FF0000',
          green: '#00FF00',
          blue: '#0000FF',
        } as const;
    
        function keysOf<T extends string>(obj: { [k in T]?: unknown }): readonly T[] {
          return Object.keys(obj) as unknown[] as T[];
        }
    
        type Color = keyof typeof kColors;
        const kAllColors = keysOf(kColors);
    
    Above, Color is effectively an enum of only 'red', 'green', 'blue'. I can use it in any function and it will complain if I don't pass something provably 'red', 'green', or 'blue'. kAllColors is something I can iterate over all colors. And I can safely index `kColors` only by a Color

    In most other languages I've used I'd have to first declare a separate enum for the type, then associate each of the "keys" with a value. Then separately make an array of enum values by hand for iteration, easy to get out of sync with the enum declaration.

    • grumpyprole 10 hours ago
      What you are describing is structural types. It is indeed a mystery that these are so under used, especially as they are a cornerstone of type theory. Structural types are so useful that they creep into most languages in some way. Even in Java, the Kingdom of the Nouns, where the rulers refused to merge a pair class, functions essentially take tuple arguments and these tuples don't have to be named and defined. You can't return a tuple though, so there is an unfortunate asymmetry. In Haskell and OCaml, we like to describe functions in a structural way, so com.google.android.Predicate would be just "a -> Bool". You wouldn't have to convert your com.google.guava.Predicate. But even these languages lack structural records and variants and suffer for it.
      • ngruhn 2 hours ago
        By now I'm also convinced that structural typing is a better default. Nominal types are still useful to assign properties that are hard or impossible to encode with structure alone (e.g. string that is a valid email address) . But I haven't encountered any other examples yet, where I'm missing nominal types.
    • fuzzy2 10 hours ago
      Inferred types are really great, but I feel they do not scale. Inside a method/function? Generally fine, but the signature, including the return type, had better be explicit.

      Also, I think there was some performance issue with too much inference? Could be wrong, could also be fixed.

      • g947o 8 hours ago
        This. As soon as you need to use the type in another function (e.g. function parameter), you'll discover that it's better to just write it out.
      • epolanski 8 hours ago
        They do scale, but explicit types have two bonuses in my eyes:

        1. can be read without a compiler, useful when reading PRs

        2. They make the compiler work less, it's easier to check than infer

    • jeroenhd 3 hours ago
      Type inference is part of every modern language. Structural typing not so much, though.

      Java has it through a compiler extension (https://github.com/manifold-systems/manifold/tree/master/man...) but I don't know many other languages that support this feature.

      As much as I dislike the entire Javascript runtime environment, I find TypeScript to be the best typing system out there for any imperative language.

      • matt_kantor 3 hours ago
        > I don't know many other languages that support this feature

        The other widely-used one is Go with its structurally-typed interfaces.

    • raw_anon_1111 5 hours ago
      Not surprisingly, C# worlds the same way with the only exception that you have to declare the variables as “var” but they are still strongly typed
      • recursive 2 hours ago
        Technically you're also allowed to use anonymously typed objects as inferred generic typed parameters in method calls.
    • g947o 8 hours ago
      Even though that works reasonably well, you may still want to explicitly define your types/interfaces. In this example, if I do need to hardcode the data instead of fetching it somewhere, I would define the interface with "state" being a union of values, because there is nothing that stops you from using `state: 'ABC'` which would be hard to discover.
    • sfn42 11 hours ago
      Lots of languages can infer types. And your last example with the colors is just a dictionary.
      • grumpyprole 10 hours ago
        Most languages have poor support for structural types though. If you try and join two records together (like a SQL join), what will your favourite language infer then?
        • sfn42 10 hours ago
          C# has anonymous types which is pretty much the same thing. Though I prefer to declare actual types for most usecases, I'll only use anonymous types for intermediate results and such.
          • grumpyprole 9 hours ago
            I certainly don't mean to knock nominal types. But I think structural types are more fundamental. A language would only need a single "newtype" or "nominal" keyword to create nominal types from structural types.
            • lock1 6 hours ago
              Why structural is more fundamental?

              C#'s anonymous type shares some flexibility of structural type system even though it still a nominal type.

                > A language would only need a single "newtype" or "nominal" keyword to create nominal types from structural types.
              
              I think you also can add `structural` keyword & apply structural type system in generally nominal type system as well if we're talking about adding feature.
          • KellyCriterion 3 hours ago
            Claude is "very good" in applying >var< continuously :-D
      • sheept 10 hours ago
        dictionaries generally aren't guaranteed to contain an entry for every possible value of the key type. while you could implement the colors example with a dictionary, ideally you'd want the type system to assure that given a Color, there will be a string associated with it
        • vips7L 10 hours ago
          Sounds like enums with extra steps.
          • epolanski 8 hours ago
            Enums aren't type safe in typescript
            • vips7L 3 hours ago
              Sounds like a major flaw.
          • socalgal2 7 hours ago
            it’s Enuma associated with data without having to repeat yourself

            If you have to define the Enums in one place and then repeat them all in another just to associate data with each one you’ve failed

            • vips7L 3 hours ago
              Maybe you can elaborate but enums in Java or Kotlin easily have data associated with them.

                  enum class Color(val rgb: Int) {
                      RED(0xFF0000),
                      GREEN(0x00FF00),
                      BLUE(0x0000FF)
                  }
      • fuzzy2 10 hours ago
        It's not a dictionary (type-wise). "as const" is the magic ingredient.
  • lateforwork 4 hours ago
    The real history of C# is that it is a rip off of Java. Anders / Microsoft understandably doesn't want to acknowledge that, but the rest of us can. C# today has diverged from Java, but the original release was Java with a few features added, such as properties, delegates, structs and unchecked exceptions.

    That last one was a mistake, see https://mckoder.medium.com/the-achilles-heel-of-c-why-its-ex...

    • hvb2 29 minutes ago
      He literally says they're standing on the shoulders of Giants.

      And, you would be stupid not to look at other languages.

      How can you expect anything to be a clean slate to begin with? Is every oop language a rip off then?

      Products don't get designed in a vacuum

    • HumblyTossed 2 hours ago
      MS poached him (and was even sued for it - that's how egregious it was) to create a Java killer because they had issues with Java.
    • jolux 4 hours ago
      Checked exceptions are bad because people just catch them and rethrow RuntimeException. Proper errors as data would be much preferable.
      • vips7L 2 hours ago
        Checked exceptions are proper errors as data. There is no difference between Result[T, E] and T throws E. The same people that just rethrow as RuntimeException would call unwrap() on Result and panic. The main problem with _Java_'s implementation of checked exceptions is that they're not fully in the type system because of Java's weak type system. That is solvable with a strong type system though, like in Scala or Swift.
      • lateforwork 4 hours ago
        > people just catch them and rethrow

        People don't have to. There is a lot of misinformation out there about checked exceptions, and people are responding to the misinformation.

    • jodrellblank 1 hour ago
      > "Hejlsberg: First of all, C# is not a Java clone. ... we looked at lots of languages, we looked at Java"

      - https://web.archive.org/web/20100109195800/http://windowsdev...

      You can just state the author of the language is lying and you somehow know better. You don't even justify why "they don't want to acknoweldge it" - even with Hejlsberg there acknowledging taking ideas from Java - or explain why C# had those differences mentioned in the rest of that interview, or why Microsoft separately wrote their own Java implementation like Visual J++ if C# was just "their Java".

  • andrewstuart 11 hours ago
    We need Anders to make one final language.

    A MINIMAL memory safe language. The less it has the better.

    Rust without the crazy town complexity.

    The distilled wisdom from C# and Delphi and TypeScript.

    A programming language that has less instead of more.

    • bonesss 7 hours ago
      On the .Net VM you’re describing F#, mostly by virtue of being based on OCaml.

      Contrasted with TypeScript and C#, F# is smaller, more expressive, stricter, with mature pattern matching and type resolution baked in from the ground up. F# was years ahead of the major languages on what are increasingly looking like ‘the basics’ around ADTs and immutability in modern distributed computing. OCaml and F# capture the linguistic high points of VB, Delphi, and C# with a broad spectrum of OOP(-lite) approaches, and have led those languages by decades on functional constructs that result in meaningfully tighter code. With the benefit of hindsight some approaches clearly map better to cloud computing and system verification.

      F# also sits parallel to lots of living C#, objectively we see ‘less is more’. Less code per line, fewer lines per solution, terser and more LLM-efficient language. Error rates and refactoring costs are also meaningfully better IME, but harder to quantify in general terms.

      • christophilus 6 hours ago
        It’s a great language. I just wish its compilation speed matched that of OCaml.
    • blackoil 11 hours ago
      I want something that will bring productivity of Delphi to Web. May be I am old now, but I could have built applications in a weekend in Access or Visual Basic that will take weeks now in latest web stack.
      • rr808 2 hours ago
        Right? I was hoping webassembly would bring back some proper gui tools like this to avoid the whole JS/DOM but no luck so far.
        • hirvi74 54 minutes ago
          Blazor is pretty cool if you are into that kind of stuff. Mind you, you still might need the slightest tiny dash of JS, but depending on your needs, you might be able to get away from JS entirely.
      • NetMageSCW 1 hour ago
        ASP.Net Web Forms still exists, though it is deprecated.
      • pjmlp 4 hours ago
        OutSystems, but it isn't cheap.
    • pjmlp 4 hours ago
      Hardly, even Turbo Pascal 7 for MS-DOS is more advanced than Go's type system.
    • tester756 10 hours ago
      C# is way to go then
    • HumblyTossed 1 hour ago
      You don't have to use all the features of C#. I make my living at it and don't touch a lot of them. The issue with C# is culture. They went full in on blog driven development so there's way too many people who will yell this is the way to do things this week.
      • hirvi74 48 minutes ago
        It's true. You will incur the wrath of C#'ers if your simple ToDo list app doesn't have a ToDoListItemRepositoryServiceFactory.cs and a minimum of 4 separate layers in which one must update 20 files because you added a property to one class.

        Don't get me wrong, I still love C#/.NET. I use it everyday, but my god, has Swift been a breath of fresh air. The Swift community, when not whining about Swift UI, has been much less dogmatic in my experience.

    • aloha2436 11 hours ago
      > Rust without the crazy town complexity.

      To be clear, the language has a GC then?

      • jayd16 3 hours ago
        I suppose it could have some kind of ARC. In theory some future languages could even have some hybrid approach? A high perf default but you can fallback to a GC allocation for hard things?
        • AndrewDucker 3 hours ago
          I'm pretty sure that there are multiple GC crates for Rust out there. But using them mixed in with non-GC variables presumably makes things more complex.
    • tonyedgecombe 9 hours ago
      >We need Anders to make one final language.

      I do feel like there is a gap for a modern compiled, functional and garbage collected language.

      Go isn't it because it lacks the functional constructs.

      C# and Java aren't it because they depend on a VM.

      Rust isn't it because of its difficult memory management.

      Swift isn't it because it is so tied to Apple and their platforms.

      • metaltyphoon 5 hours ago
        C#, with default tooling, can compile without needing a VM, for windows, macOS, linux and some other platforms.
        • zigzag312 4 hours ago
          I wish that Nuget would show which packages are NativeAOT compatible.
          • metaltyphoon 4 hours ago
            It will probably get there one day since all BCL is annotated. Perhaps this is not done because you can have parts of the library be completely safe to use in AOT while another part not be.
      • rednb 9 hours ago
        What you are looking for is called F#. You get native interop with C# and access to all .NET/C# libraries as a bonus. We use it as a daily driver for a complex B2B2C cloud platform.
        • Sammi 7 hours ago
          Does it not run in a VM?
          • NetMageSCW 1 hour ago
            You can embed the framework into the application so it is a single distributable.
          • rednb 6 hours ago
            Yes you are right, it does not properly support NativeAOT yet.

            But it isn't a need for most use cases, unless you want to do mobile development and meet app store policies. But even then, mature F# frameworks like Fable transpile your F# code to React & Cie.

          • christophilus 6 hours ago
            It can be compiled, but that’s not the use case it was originally designed around, so it’s not quite as first class an experience as with Go or Rust.
      • kryptiskt 9 hours ago
        C# doesn't depend on a VM these days when it is AOT compiled. Same for Java, though C# is rather more user friendly in how it goes about it.
      • HumblyTossed 1 hour ago
        That's the problem though. People want one language to be The One (tm) and that's just not possible. Your The One (tm) isn't mine.
      • jorams 8 hours ago
        There are plenty of languages in that niche you could be using. OCaml, Haskell, F#...
      • fpsvogel 6 hours ago
        Roc might be that language one day. Not yet because it's pre-0.1.
      • EddieRingle 9 hours ago
        Kotlin has a LLVM backend, among others.
    • LarsKrimi 11 hours ago
      Oberon 07?
    • Sharlin 8 hours ago
      The minimal memory-safe language is Go. Turns out it's too minimal for most.
      • andrewstuart 8 hours ago
        It’s not memory safe.
        • Findecanor 3 hours ago
          Please elaborate. I've heard that you could break Go's memory safety through a race condition, but that's as far as my knowledge goes.
    • gucci-on-fleek 11 hours ago
      What about Lua? The language is very minimal, memory safe, and has Pascal-like syntax just like Delphi.
      • ptx 10 hours ago
        Lua's variables being global by default seems somewhat error-prone.
      • andrewstuart 8 hours ago
        verything is an off by one error in Lua.
        • gucci-on-fleek 8 hours ago
          Or conversely, everything is an off-by-one error in every other language :)
    • appsoftware 11 hours ago
      What would you take out of C# etc?
      • wvenable 1 hour ago
        All non-generic container classes and nullable reference types.
        • hirvi74 43 minutes ago
          > nullable reference types.

          What would you suggest instead? I quite like the nullable reference types, but I do know many get annoyed. My brain is often a scurry of squirrels, so I grew to become thankful for the nullable refs overtime.

      • littlecranky67 10 hours ago
        (not OP) I would take out mostly historic stuff, that is in there for backwards compat, that has been superseeded. But this could be achieved using linters.
    • pmkary 7 hours ago
      Yeah exactly.
    • vaylian 11 hours ago
      Sounds like golang to me
      • andrewstuart 11 hours ago
        Without the features I identified,yes, you’re right!
      • steve1977 9 hours ago
        Considering they used Go for the native compiler he might actually agree with you.
  • theusus 8 hours ago
    Wasn’t he fired by MS?
    • algorithmsRcool 4 hours ago
      No. He is a Microsoft Technical Fellow and still a core contributor to the TypeScript compiler.
  • rixtox 10 hours ago
    If you feel that TypeScript, or hell even JavaScript, is becoming more alike C#, it's actually deliberately done by Microsoft in benefiting their ecosystem. In this interview they mentioned they had internal demands to convert/transpile C# into JavaScript or TypeScript. So by making these target languages more like C#, it directly benefits their need. But I don't think this should be the driving force in designing ECMAScript. When they are pushing a language feature, they have an unspoken internal goal, and every choice they make is to make JS/TS look more like C#, and they are more likely to dismiss proposals that preventing them from deliverying that goal. There's likely a bit of conflict of interest there.
    • oaiey 9 hours ago
      As a long term observer: definitely not a goal. But you have to be clear here: JavaScript and C# both are OO languages, both are having origins stories in Java/C++, both are facing the same niche (system development), same challenges (processor counts, ...) and so on. And then, you put teams on it which look left and right when they face a problem and then you wonder that they reuse what they like?

      C# language team is also really good. They did not do a lot of mistakes in the 25+ years. They are a very valid source of OO and OO-hybrid concepts. It is not only TS/JS but also Java and C++ who often look to C#.

      The story was not to transform C# code to JS but to use C# to write the code in the first place and transpile it. Not for the sake of having .NET usage but for the sake of having a good IDE.

      • m132 8 hours ago
        > They did not do a lot of mistakes in the 25+ years

        If my memory serves, .NET and WinFS were the two major forces that sunk Longhorn, and both have been given their walking papers after the reset [1].

        .NET and C# have grown to be mature and well-engineered projects, but the road there was certainly not without bumps. It's just that a lot of the bad parts haven't spilled outside of Microsoft, thankfully.

        [1] https://www.theregister.com/2005/05/26/dotnet_longhorn/

        • Sammi 7 hours ago
          Are we mixing the language and the runtime here? C# the language seems weirdly free of weirdness and footguns.
          • jayd16 3 hours ago
            Not only that, they went as deep as mixing in project issues with language design. A massive rewrite mixed with massive feature changes is always a tricky thing no matter the language.
        • pjmlp 4 hours ago
          Nope, what sunk Longhorn was politics.

          Windows team is a C++ kingdom, and those devs will not adopt .NET even at gun point.

          They redid Longhorn with COM and called it WinRT, irony of ironies, WinRT applications run slower than .NET with COM reference counting all over the place.

          Google has showed those folks what happens when everyone plays on the same team, and now it owns the mobile phone market, a managed userspace with 70% world market.

        • moron4hire 7 hours ago
          .NET was already a going concern before Longhorn even started. What sank Longhorn was the fact that writing an OS from scratch is hard and maintaining compatibility with existing OSes in the process is even harder, especially when you're adopting a completely new architecture. Longhorn would have been a microkernel running 100% on the .NET runtime, mainline Windows is a monolithic kernel written in C++. I don't know how it would have ever worked, whether .NET was "perfect" or not.
          • pjmlp 4 hours ago
            See Android, or Meadows for alternative reality.
            • moron4hire 3 hours ago
              Android still runs on a monolithic kernel written in a memory-unsafe language. I'm finding it suprisingly difficult to find information on Meadow, other than it runs .NET DLLs as user-space applications, but nothing about the structure of the kernel.

              Longhorn was going to be more than that. Microsoft did have Singularity/Midori projects, started around the middle of Longhorn/Vista, and continued much longer after Vista released to build out the managed microkernel concept. It's been about a decade since they've put any work into it, though.

              • pjmlp 2 hours ago
                Microsoft wasn't even able to deliver that, which was my whole point.

                Joe Duffy mentions on a talk, that even with Midori running production workloads, Windows team could not be changed their mind.

                Meadow uses a C++ based microkernel, the whole userspace is based on .NET, by the way.

    • pmkary 7 hours ago
      Not at all. Before the use of TypeScript exploded, they had two features brought into it from C# which were namespaces and enums (both of which are amazingly good features. For the first one, no one knew what was the right choice back then. We had almost a dozen different module systems and TypeScript had gone their way to support all of them and namespaces were their own solution to the mess (remember they were trying to solve their own problems at first, it wasn't to dominate anything). I personally used namespaces and I could have only the TypeScript compiler running and producing a single JS file for rapid development without the burden of --- then very slow --- webpack.

      And for enums, using strings as enums was not a very efficient idea. I think JavaScript introduced Symbols for locked/hidden properties but also meant to use them as enums. It never worked either and then the sum type, union type feature of TypeScript made the whole community to keep using strings as enums. This is still a very bad idea, it is not ergonomic, it is prone to many problems, and very inefficient to compare strings instead of integers. But hey TypeScript tried to fix the problem and almost everyone rejected it. And so enum is now discontinued.

      Rest of the changes to TypeScript came from almost any other language but C#, probably the biggest changes ever to happen to JavaScript came directly from CoffeeScript. And then I personally saw how each of these new changes --- one by one --- arrived at C#. For what I have seen firsthand by reading the TC39 proposals, each feature came from a different community and different programming languages, (think about null operators !/?, the nullish coalescing ??, the incoming pipes, fat arrows and lambdas, mixings) as JavaScript is the only language everyone has to use, and it has benefited everyone to have a language that has all the great things from all other languages.

    • steve1977 9 hours ago
      Well, for one, benefiting Microsoft's ecosystem does not imply being detrimental to other ecosystems per se.

      Furthermore, couldn't the convergence of TypeScript towards C# be simply a result of shared goals and values of the two languages, especially considering they have the same principal designer?

    • epolanski 8 hours ago
      C# is inherently OOP oriented and it's type system works completely differently.
    • tester756 10 hours ago
      It sounds like conspiracy theory that they design TS/JS to convert from C# easier, huh.

      The truth is that C# is probably the best designed mainstream language out there.

      C# was known as a language with lowest amount of WTF per LoC

    • froh 10 hours ago
      that's the "evil MS" perspective

      The sequence of turbo pascal / delphi / c# / typescript which brought us LSP as a sidekick (!) IMHO has benefitted the whole industry at least as much as "transpile c# to ecma script via typescript" . no. much much much more.

      I do not see a problem with MS also having an internal use case .

      you know I wouldn't stop using python "because" Guido now works at MS ...