If you are looking for something that will maximize your capability as a professional developer, absolutely yes. If you are looking for something to dabble in just for fun, I'd say its a much less important thing to worry about.
For me, the magic of C#/.NET (when used appropriately) is that the language can fall away and allow you to think almost directly in business terms. Features like LINQ are a major part of this experience. When I am working with a complex business domain, I really don't like the idea of playing code golf with my tools. Making the customer happy is far more rewarding to me than anything I could do on my computer.
Also, being able to minimize your vendor footprint to just "Microsoft" helps out a ton at due diligence time if you are selling software to other businesses.
What about the developers tools and the developer environment? Since C# is cross-platform, it would be easy to develop software also in a UNIX-like setting, right?
It is easy. You can write C# in anything these days, Rider becoming a favorite pretty quickly for many. Everything like dotnet CLI just works on Linux too.
I'd say close to just works. I've spent the last 6 months developing with Rider on Arch and it hasn't been a completely smooth ride. Admittedly, a lot of my pain just came from inexperience. I screwed up permissions; it took me ages to setup the right .net packages due to the nomenclature (which, when I installed Visual Studio on Windows, is easily glossed over); function apps took a while to get working.
But it really is satisfying once you've got everything working.
Yes. Without a doubt. More so, if dynamically typed languages are the only ones you know.
I've been avoiding them as they were Windows only early days, and Entity Framework Core was too immature at the beginning after the open source wave.
Some points, from my PoV of developing business/CRUD type applications;
- .NET framework is well engineered solutions to most of the standard requirements in software development. I've spent countless hours looking for solutions in Python for common things like structured logging, validation, websockets, datetime utilities, cryptography, cli, unit conversions etc. when working with Python.
- There are a lot of features for reducing boilerplate. Getting better with every release.
- Static typing doesn't get in your way. Just the opposite. Eagerly waiting for discriminated unions.
- LINQ, especially when combined with EF Core, is godsend.
To follow on a bit, I've been using .NET since 1.0 (yes, literally. Not 1.1). C# and .NET in the current form are spectacular!
There are a handful of projects I still have going that are in .NET 3.5 (there are still users out there on Windows XP), but the vast majority of my server-side stuff has been moved over to .NET Standard and newer. Most are running in K8S.
Aside from the old stuff that I still have to support, most of it can be run on my M1 MBP
My experience, so far, has just been in Python developing with FastAPI. Next, I would like to learn a statically typed language, but I am not sure what. I was wondering about Go and C# of course.
Both has it's advantages and disadvantages depending on the use case.
If you primarily develop user facing applications (web applications, line of business applications etc.) C# is a good choice. There are a lot of companies (including Microsoft) using it for these use cases, so there are good ready made solutions, tutorials, documentations for the common features that you'll require.
If you primarily develop "system" level software (Docker, Hashicorp products etc), Go is a good choice for the same reasons.
This is a bit of a generalization as both languages can be used for both use cases, and you need to take a lot of different things into account on deciding which one to focus your attention on (familiarity, job availability and many other things). As always, it's about the tradeoffs you are willing to make.
Keeping that in mind, it would be a safe bet for me to say the a Docker alternative in the future won't be developed in C#, and the some big business application won't be developed in Go.
Another thing I want to add: The decision to learn a language doesn't need to be an 'OR' decision. Learn both, and use the one that fits your requirements best.
Coming from a lot of python knowledge, including deep language junk draw trickery and being able to do all sorts of interesting tricks with it… and having looked into go to do a bunch of things where Go is basically the only supported language (kubernetes operators and some other niche stuff like that) … and now diving into .Net 6 with c# for a few new projects after some past experiments with Unity.
c# all the way…
Go is like hunt and peck typing with my nose while I’m strapped into a strait jacket. It’s deliberately designed to make it hard to be clever, hard to deepen your knowledge, and for me this makes it hard for me to be efficient… Other than small edits of other peoples code I have never once found Go enjoyable. It’s intuitive to a fault because it’s so minimal and restrained. Like a set of Duplo blocks compared to a set of Lego blocks. It’s really hard to convey this feeling of mental abrasion I have while using it… if I’m not fixing/extending something else where there’s likely only one good way to do something and I’m not in a position to change anything outside the little bit I’m working with… every time I use Go I am constantly ignoring the part of my brain that sees how inefficient this language is for my time I have to sit there typing out so much god damn useless shitty boilerplate that every other language gives you tools to avoid by way of better syntax, syntactic sugar for more advanced patterns, tools for polymorphism and meta programming and all the other things go rejects… hell until very recently it didn’t have generics (I haven’t been forced back to using it since this so maybe it’s slightly better now)
C# has a powerful type system, good enough and growing ecosystem of language level packages to empower you to work well. But it does have one big negative, it’s rather IDE dependent, and the package/module/import system is very “implicit” as opposed to the explicit Pythonic way of doing things. So it takes a while to get used to (still doesn’t feel right but my brain no longer bristles at the sight of it anymore) how everything is imported an entire package or module at once and the compiler just takes care of optimising out unused stuff. It also makes it harder to read peoples code samples which cycles back to how much you have to learn to let the IDE do the work, because it’s often the only antidote to tersely referenced object names that have been pulled in from a large package namespace. I’ve gotten rather used to just asking JetBrains Rider to add the necessary using statements.
For all the downsides C# doesn’t feel like sandpapering my brain while using it, it’s more employable, .Net 6 is a real boom time for new open source code as they have finally unified the weird .Net Framework vs .Net Core mess, it’s one target and everything lives here now. And Microsoft are supporting cool new technology like gRPC/Web and Blazor which might get us back to the days where you could just design a UI around a push/pull function call model and deploy to desktops which could perform RPC via the LAN to the back office server. Exciting times!
Re: IDE, I see this as an advantage. As a lifelong user of editors (emacs, Sublime Text, VS Code) other than checking some IDE out here and there, I've committed to using an IDE (Rider) for the first time while working with C#. When the platform and the language you are using allows good IDE support (static typing and friends), the experience is leaps and bounds ahead of using an editor in a dynamically typed languages.
I was also using all kinds of meta programming magic to bend Python to my will, so an IDE had nothing more to offer.
I'm also employing the same ideas with C#, but this time they are encapsulated to a few input/output locations and supplemented by design-time code generation where possible, resulting in nearly everything is type safe. Now Rider can work as a partner, instead of being a hindrance.
Always embrace the powers of the platform you are using. If it's a statically typed language, learn to work with the IDE, don't fight with it.
> Always embrace the powers of the platform you are using. If it's a statically typed language, learn to work with the IDE, don't fight with it.
Very much agree! For me as a big fan of IDEs for all my work, my biggest adjustments have been learning all the .Net specific things, how to do them in the otherwise familiar JetBrains Rider (I use PyCharm for my python work), and a slow acceptance that while there are ways to "work more explicitly" (fully specifying names and not touching the "using statements") the IDE does indeed have all the power it needs to understand what I cant see because of the powerful type system and all the .Net machinery under the hood that I don't yet know to the level of my deep python knowledge.
Yes. C# is an excellent language, and it has frequent updates that make it more concise and flexible (as well as improving the type system).
The ecosystem is mature and there tends to be a C# version of every SDK.
It's very refreshing to use a modern language without spending much (or any!) time searching through hundreds of libraries and trying to pick the not-dead ones.
I currently have a large, mature C# code base that has about 12 dependencies. I have a Node code base in the same domain that has 78, and I spent hours selecting many of them.
It's all about what you're interested in. If that's gaming or app development, C# is a fine language.
Just don't be a "language guy", my love for C# has kinda boxed me into a lot of enterprise software roles, particularly in desktop legacy and Cloud ERP. If that's what you want, more power to you.
People here love to rip on Java for a myriad of reasons, the ecosystem, boring enterprise roles. Well, Microsoft Java isn't too far out of that realm, don't let LINQ and fancy lambdas seduce you into thinking otherwise.
When you look at ugly old enterprise legacy code, it doesn't really matter what C-like language it's written in.
I know this wasn't asked, but last to say is, companies value employers who have a really good understanding of their products internal details and infrastructure. That's something you can't learn in a book or at school. They absolutely do not care about skills in these languages beyond expected competence. It certainly doesn't hurt, but there are a million other C# programmers who know advanced programming language features.
> Just don't be a "language guy", my love for C# has kinda boxed me into a lot of enterprise software roles, particularly in desktop legacy and Cloud ERP.
I'm in a similar situation. I love the language but I hate overall community and environment being all about Microsoft in most cases. It's really hard to get out too since most people will see you as the 'MS .NET guy'. There aren't that many companies that want generalists and good devs, most will look at you through the prism of being '.NET Developer' and having '.NET experience', not just 'developer' and 'experience'. It's a pain point of mine, even though I quite like .NET overall and productivity it comes with.
> There aren't that many companies that want generalists and good devs
That's the brutal honesty, but to be fair it's on us to distinguish ourselves. It's weird, I used to look forward to development in the real world because I wouldn't have to use all the "useless crap" I was forced to learn in College. Now that I finally see the practicality, I can't ever using it without a lengthy debate. The amount of a CS degree that's actually needed to do these jobs is ridiculous. I used to think bootcamps were a joke, but if I had to guess there's a lot more hungry devs out of there that blow grads out the water. While I grumblingly retire to my office chair like Richard Nixon.
> It's really hard to get out too since most people will see you as the 'MS .NET
guy'.
Idk if this is regular job hunting behavior, but I get messages on LinkedIn for almost nothing but recruiters telling me about some DoD secret clearance .NET job, they never reveal the company unless you ask which I find weird, and then I shortly find out it's a .NET legacy job with pre generic C# and Visual Fucking Basic. Maybe I take myself far too seriously, but I can't help and feel offended when I get offers like that.
The only time recruiters contact me for something outside .NET, it's for C++ embedded systems, which does sound more interesting, but I found the embedded world stressful a lot, to be fair it was my first job so I dont really know.
The enterprise culture is why I left. C# + Visual Studio remains the most productive combo I’ve worked with, though. I just can’t see myself going back, due to the culture. Also, I’m a VIM and Linux guy now, and hope to never run Windows again. .NET was not a first class experience in VIM the last time I tried.
Did you find work in Software Development for Unix?
In university, I was the other way around, when I got out I said "time to roll up your sleeves and stop using printf to debug things, VS is where things get done".
Little did I realize I'd transition from a chipper, curious regex piper into a jaded highly productive custodian.
I became a web developer, basically. Doing web apps, web services, etc in Ruby, Node, and Go. It was a pretty easy transition. If you know and love programming in C#, my guess is you can pick up just about anything in a short amount of time.
Anything popular like that you're gonna find good support available on .NET, that goes for any corporate backed language ecosystem. I think that's why Node has a reputation for being a mess in terms of reliability, there's just so much sub par crap with no company to be responsible for. .NET has a package community as well, , but on average, the stuff in there is just....better lol.
But again, nothing about these languages are distinct or remarkable enough to make career changes, the bigger picture here.
Yes because if there is one thing about it is it's easy to pickup and be productive. So you're investing a little time for a lot of gain.
An advantage is it's not opinionated on how you should write your code. Which means there isn't the one true way of doing things you need to learn either. It's not like lisp, or rust with it's borrow checker, or C with it's pit traps for the noob. Or C++ where more people understand quantum mechanics than know all it's features.
Most of the things you might want to do there are documents and examples how. And unlike other languages those are usually solid. Microsoft have built a vast and curated library for many many things like import and manipulate an excel file.
> Which means there isn't the one true way of doing things you need to learn either.
A nitpick/disagree here. While it’s true that both C# and the framework are pretty lax about things, there’s definitely a “right” way of doing things as recommended by Microsoft. Following that guidance means it’s easier to hop between .NET codebases
Yes. C# is the best OO programming language with good support for functional and procedural programming paradigms. For business applications, it is the best programming language that can be used in both frontend/GUI (MAUI) and backend.
If you are looking for something that will maximize your capability as a professional developer, absolutely yes. If you are looking for something to dabble in just for fun, I'd say its a much less important thing to worry about.
For me, the magic of C#/.NET (when used appropriately) is that the language can fall away and allow you to think almost directly in business terms. Features like LINQ are a major part of this experience. When I am working with a complex business domain, I really don't like the idea of playing code golf with my tools. Making the customer happy is far more rewarding to me than anything I could do on my computer.
Also, being able to minimize your vendor footprint to just "Microsoft" helps out a ton at due diligence time if you are selling software to other businesses.