I'm a .NET developer, do I need to switch languages?
- Published on
- Reading time
- Simon Waight
Thanks for coming to my TED talk.
I work for Microsoft, but not on the teams who work on .NET or Visual Studio. This piece is entirely my opinion and is not informed via any internal insights I hold!
Seriously though, what does the future hold for .NET developers in 2020?
Just last week I spent several hours on the Application Development stand at Microsoft Ignite The Tour Sydney and had several questions from developers about what they should be learning next.
In some cases it was because they were hearing demand for other languages at their employers (or from the market), the platform they developed for (web) was being replaced by a new one (mobile) where their .NET expertise was not as relevant, or that it seemed that Microsoft was not focusing as much on .NET as it once did.
Let's dig into things a bit more and see how .NET's really in the best shape it's been in for ages!
In a building far, far away... (in Redmond actually)
Talk about coincidences! The following showed up in my timeline the day after I'd had all my discussions with the folks at Microsoft Ignite The Tour...
Ahhhh, simpler times.. Windows ❤ .NET and .NET ❤ Windows.
18 YEARS! 😲
Wow, I feel old (and congrats to .NET to finally being able to legally buy a beer in some places in the world!)
While I'm being flippant, this does lead me to one of the massive positive changes to have happened to .NET since its inception.
Traditionally if you were a commercial / professional .NET developer you'd be building desktop, console, web or API applications to run on Windows. Since about the time Bill Gates was lovingly holding up .NET in a box (remember when software came in a box?!), a group of adventurers were using the published C# specification to build Mono, to provide a way to use .NET on platforms other than Windows.
More on that later..
So many languages, what should I learn?
The answer to this is a resounding 'yes'.
These days you have to be a polyglot programmer, even if you have one go-to language (in my case C#).
These days, given my job, I participate in many vibrant language communities from the well-established (Python) to the relatively new (Golang), but if you asked me to code anything substantial it's probably going to be in .NET.
So then, how to answer the "what to learn" question?
Look around you - what is your team or company building with? What are the trends in the industry? What do you want your career path to look like?
Python is massive at the moment, but it's not because everyone started building Python Flask web applications. It's because it's heavily used in data science. Do you want to learn Python to transition to a different career path (maybe, right!)?
Golang has interest because it has some unique features for building light-weight, easily deployable programs, and is also at the core of Kubernetes...
The point is, there has never been a better time to pick up a new language (or languages). The resources to cross-train yourself are but a click away.
- .NET (covering C#, VB.NET and F#):
Look for opportunities to contribute to open source to learn how to work with a new language, or set yourself a goal of building something with it (last year I built a bunch of web applications and Azure Functions using Python to consolidate by learning).
Find ways to use them at work, but don't create a sprawl of languages nobody else knows how to maintain - be the person to upskill everyone else. I can tell you nothing brings focus to learning something like having to get up and present on it!!
Who moved my cheese?
The next most asked question was around the industry shift away from web / desktop towards mobile experiences. While it's certainly possible to build responsive web experiences using .NET, it's likely that many web applications whose life started prior to responsive web design being possible will never be updated to be so.
Instead, companies are either building, or using existing, APIs that then talk to a new generation of native mobile experiences that are built to deliver the best user experience on that platform.
The challenge has become the need to support multiple mobile platforms (maybe responsive web apps weren't a bad idea after all 😉) which has lead to the creation of multiple technology solutions for native cross-platform mobile solutions.
Chances are if you're a .NET developer you will have heard of Microsoft's offering in this space - Xamarin.
The value of Xamarin to a .NET developer is that you can re-use your existing skills to build on new platforms. Companies or teams building using Xamarin have the ability to have a high percentage of code shared between all mobile platforms, rather than needing to write and maintain code in Objective-C / Swift for iOS or Java / Kotlin for Android.
Now... to the challenge here. Having developed and delivered cross-platform applications the main challenges I've seen are:
- Not understanding platform / device behaviour. A mobile phone is not a PC or web server. The one key item to keep in mind as a developer is that the device (and it's OS) are there to maximise performance while minimising battery drain. This means the application lifecycle events you need to be aware of will be very different to a web or desktop application. If you don't understand this one in particular then almost nothing else matters - the OS will cause your application to behave erratically as it either pauses or throttles execution, or worse, kills the app due to overuse of resources.
- Delivering a tech-driven solution with little focus on user experience (UX) or design, leading to an application that behaves differently to standard apps on each mobile platform (we've all seen the hamburger menu in React Native applications that looks nothing like any standard navigation UI element on either iOS or Android). This is common feedback from business stakeholders who care almost zero about how great it is you share code between the apps.
- Extending the previous point - not understanding target native UI elements. Yes, as a Xamarin / .NET developer you will need to dig into how iOS and Android work natively at the UI tier. This will allow you to build the best user experience into your applications so that you remove things like hamburger menus from your apps. This is where having someone who is already doing native development on the team will come in handy...
Outside of mobile the next change for .NET developers to deal with is that we can now multi-platform our web and console applications. If your team lead or business managers came to you and asked you to build a .NET solution to run on Linux could you?
While many techniques from the .NET Framework work and behave exactly the same in .NET Core on Linux there will be nuances to be aware of. How about shifting that ASP.NET Web Application to running on Linux on ASP.NET Core? You can't rely on IIS modules on Linux, so you need to start to study the platform to understand what's possible.
Some guidance will come from you or your team's experience (build it and learn) and some will come from official guidance. Microsoft is starting to publish content around this space and the teams working on the language come from a multitude of platforms so over time we will continue to see more content appear on running .NET Core on non-Windows platforms.
Open Sourced and free (without a care in the world!)
Let's be honest, it's probably been a bit confusing over the last few years around the positioning of .NET.
When it was just the .NET Framework on Windows things were much clearer.
Then we had .NET Framework, .NET Standard and .NET Core. 🤯
Here's something that will hopefully clear some confusion up:
- .NET Framework: the .NET you know and love if you build for Windows. Closed source and maintained by Microsoft.
- .NET Core: cross-platform .NET that is open source and accepts contributions on GitHub.
- .NET Standard: API definition for APIs that must be present in all .NET implementations. There is no implementation per-se, other than the adherence to the standard by both the .NET Framework and .NET Core implementations. If you 'target' .NET Standard you are allowing your codebase to run on either Framework or Core.
Thankfully this is just a transition period, though it will live with use for a while yet given the support lifecycle for .NET Framework is associated with the support lifecycle of Windows.
Microsoft has landed on a unified story for .NET 5. I would strongly recommend if you're a .NET developer to go and read that linked document.
Some folks said to me that it appears Microsoft is "giving up on" or otherwise minimising work on .NET, especially with it showing up on GitHub. I wholeheartedly disagree with this.
.NET is in the best shape of its life and has by far the most active development it's probably ever had. The community submitting changes or fixes to .NET Core are amazing and are a key reason I say .NET is in the best shape ever.
Additionally, Microsoft has a broad ecosystem of tooling for .NET that is also under active development. The Visual Studio team is working at a much higher release cadence than ever and Microsoft has a strong developer IDE story for both Windows and Mac users. There's also a little thing called Visual Studio Code that seems to have caught people's attention.
As an aside... if you're using a version of Visual Studio prior to 2019... consider upgrading to access this new release cadence which includes bug fixes and new features.
In closing, your honour...
Hopefully through everything I've written you've been able to grasp how .NET fits into the modern tech landscape for developers.
.NET is not going away - you should be coding in more than .NET, and spend time getting educated on platforms other than the one you typically work with (web to mobile, Windows to Linux).
These days the best thing for me is...
dotnet 💙 Linux and hopefully Linux is 💙ing dotnet
Comments or questions? Leave them below!