DEV Community

Jan Küster
Jan Küster

Posted on

What programming language should I learn next?

I am looking forward to learning a new programming language apart from JavaScript. My reasons are mostly extending my overall programming and engineering skills, getting to think from a different perspective but also having a solid tech in my stack with a promising future in the world of software development. Oh, and it should make fun to program with!

In a prior version of this article I did a short (and not well-thought assessment) based on some resources on the web but it turned out to be uninformed and incomplete.

I'd rather like to hear from people here what language is actually joyful to work with (including tools, deployment etc.) and has at the same time a good selection of paradigms, as well as a strong community and extension / package system.

What are your thoughts?

Top comments (44)

Collapse
 
slavius profile image
Slavius • Edited

Could you elaborate on why do you consider C# being "too closed in their scope of usage"?
Also Delphi is not a language but IDE. The language behind Delphi is Object-Pascal.

Collapse
 
jankapunkt profile image
Jan Küster

From my knowledge C# ist basically locking you to the .Net platform, right?

Regarding Delphi, lazy me to search again what this was again but I knew I associated IT with the term legacy. Sry. I think was still correct with that regarding Pascal.

Collapse
 
shaijut profile image
Shaiju T • Edited

Free. Cross-platform. Open source. Supported.

C#.NET is free. There are no fees or licensing costs, including for commercial use.

C#.NET is open-source and cross-platform, with free development tools for Windows, Linux, and macOS.

dotnet.microsoft.com/download

Thread Thread
 
jankapunkt profile image
Jan Küster

So Apps can now also Run on MacOs and webapps can also Run on Linux Servers?

Thread Thread
 
shaijut profile image
Shaiju T • Edited

Yes exactly , You can write in C# and run anywhere.

For Mobile you can use Xamarin and write in C# and Deploy your apps in Android, IOS. All in one go.

This will help you ship your products faster with only one language.

dotnet.microsoft.com/apps/xamarin

Thread Thread
 
jankapunkt profile image
Jan Küster

It seems that xamarin itself is not provided for Linux based distrubutions, so I can only develop with C# and .net core on linux, right?

Thread Thread
 
shaijut profile image
Shaiju T

By the way if you are looking to learn to get a Job, Currently both Java and C# will help you get Job in MNC companies. Also Go language is coming up, i heard many startups are using it for making cloud native apps.

Java and C# has some common syntax style , so you can switch over each other easily.
I feel C# gives developer happiness and makes developer life easy because its easily maintainable for large projects and by providing tools like Visual Studio and VS Code its easy to code faster.

Don't be confused of choosing the best language, Just choose one after your research and start learning, if you don't like you can switch over other easily.

Hope this helps.

Thread Thread
 
shaijut profile image
Shaiju T • Edited

If you are talking about to develop Mobile apps using Xamarin in Linux. I think Its currently not possible. But only possible on Mac OS and Windows.

As you are learning, I suggest learn C# first then start learning building Web App using Asp.NET Core , as of now Web Apps has more Job opportunities.

2 Ways to build Web Apps:

  1. Develop Web App using Asp.Net Core Only - Both UI and Backend

youtube.com/watch?v=C5cnZ-gZy2I

  1. Develop Asp.Net Core Web API and Consume it using JS frameworks like Angular or React
  • Asp.Net Core Web API - For Backend

  • Angular or React - For UI

youtube.com/watch?v=fom80TujpYQ
youtube.com/watch?v=NemyDIUcC64

Thats Just basic CRUD based tutorials, Advanced projects based tutorials like a Ecommerce shop etc you can search online to learn more.

Collapse
 
slavius profile image
Slavius

Basically, you can write .Net Core code on Windows (Visual Studio, VS Code, Rider), Mac (Visual Studio for Mac, VS Code, Rider) or Linux (VS Code, Rider) and it runs on Windows, Mac and Linux on x86, x64, arm32 and arm64 desktop or server (headless).
You can write console applications (.Net Core), backend APIs (.Net Core REST API), web applications (ASP.Net Core + Razor), reactive front-end applications (Blazor - plain HTML + C#, no javascript/typescript required unless you need to access advanced browser features like sensors, etc.), IoT applications (.Net Core IoT), Machine Learning applications (ML.Net), desktop applications (WinForms and WPF) or mobile applications (Xamarin). All with just .Net Core.
You can compile and pack applications as single-file multi-platform executable (with .Net Core framework embedded).
All as open-source. .Net has progressed quite a lot over the years.
Yes, you lock yourself to Microsoft but not to Azure as it can run anywhere. But the same can be said about Java, Rust or Golang.

Thread Thread
 
harounhajem profile image
Haroun Hajem • Edited

C#, the best upcoming news is Blazor. C# -> WebAssembly -> then run in minified Webrowser(Electron). That will give C# the ability to run anywhere. The ProofOfConcept is already done, now they are looking into how much they can minify the webbrowser. Current size is a couple of MB, but the dev-team at MS wants to shrink that to KB. =)

Thread Thread
 
slavius profile image
Slavius

Even the server-side Blazor over WebSockets is nuts.

Thread Thread
 
jankapunkt profile image
Jan Küster • Edited

I don't understand. Can you please elaborate?

Thread Thread
 
slavius profile image
Slavius

Can you please be more specific what you don't understand and would like to get explained? I'd be glad to help.

Thread Thread
 
jankapunkt profile image
Jan Küster

Even the server-side Blazor over WebSockets is nuts.

I totally don't get the meaning of the sentence, since I rarely know Blazor nor it's relation to Websockets.

Thread Thread
 
harounhajem profile image
Haroun Hajem • Edited

Did anyone say WebSockets?! =D Have you seen the draft for the upcoming replacement for WebSocket? It's called WebTransports and it will/can run through the Quic protocol instead of HTTP1/2. Which makes it blazing fast as a streaming protocol. I suspect that Microsoft will integrate it into Blazor as well. Here is the link for the draft: WebTransport

 
slavius profile image
Slavius • Edited

Ah, I see. Basically while Blazor is front-end framework for building reactive applications (similar to React, Vue or Angular) it has in contrast 2 modes of operation. Client side rendering (similar to other frameworks based on Javascript or Typescript) where the code runs on the client. For this, of course since it is based on C# .Net you download minified version of .Net framework at very first run which technically is running as WebAssembly and AFAIK is currently based mostly on Mono (Open source .Net compatible framework for *nix systems that existed prior to multi-platform .Net Core).
The second mode of operation is Blazor server-side rendering using WebSockets. How this works is that your browser instead of downloading whole front-end application downlaods minimal WebSockets client that connects to the server, bootstraps your app and every request you do is handled and rendered at the server over this WebSockets connection where your browser downloads only resulting HTML and displays it by replacing the appropriate DOM elements.
The latter way was introduced in .Net Core 3.1 the former (client side) was until .Net Core 5.0 experimental but is getting wider adoption now.
Both have advantages and disadvantages, e.g. server side does not expose business logic but cannot work in offline scenarios (however supports automatic reconnection to the server) and updating it is easier and faster as all the code is on the server. Client side needs to load so far several megabytes of client binary (WebAssembly .Net Framework) at first run that is cached in the browser.
Hope that helped.

Collapse
 
ahferroin7 profile image
Austin S. Hemmelgarn

Two suggestions: Python, and Elixir.

Python Is a resonable choice because:

  • It’s different from JS in a very large number of ways. This makes it a good choice if you’re looking to diversify.
  • It’s dead simple to learn. It was actually designed to be usable as a teaching language, and most existing programmers can get the basics in no more than a couple of hours.
  • It’s in relatively high demand.
  • It has a very comprehensive standard library. It’s not unusual for very simple Python projects to not need anything outside of the standard library, and when they do it’s usually only a couple of things.
  • It has good documentation. In fact, the official documentation for the reference implementation at docs.python.org/ is one of the standards I regularly use when evaluating the quality of documentation in other FOSS projects.
  • It’s very portable. Easily runs on Windows and all modern UNIX-like systems and makes it relatively easy to write portable code.

The big downsides to Python are that packaging and dependency management are a bit complicated, though still better than something like C, and concurrency is rather difficult (it has similar issues to JavaScript in that it’s not really designed for proper concurrent execution).

Elixir is also a reasonable choice given that:

  • It’s also very different from JavaScript, but in different ways than Python is.
  • It’s also reasonably simple to learn, though not as easy as Python. The complicated parts here aren’t the syntax though, but the abstract concepts it’s built on.
  • Builds, packaging, and much of the tooling is reminiscent of NPM in many respects, though I’d argue it’s better in quite a few places (for example, unit testing is treated as a first class citizen in the bundled tooling).
  • It’s absurdly scalable and reliable if you use it right. The underlying language it compiles through, Erlang, was designed for commercial telecom systems, and Elixir inherits all the reliability and scalability of design that went into that.
  • Like with Python, it has rather good documentation.
  • While it’s technically tied to a particular runtime platform (BEAM), said runtime platform is very portable (runs on Windows and almost any UNIX platform, as well as a number of other places, including some theoretical work on hardware implementations).

The big downside here is that the ecosystem beyond certain very specific libraries is not great, but on the flip side a lot of the stuff that you would find yourself needing to add yet another dependency for in JS just doesn’t need it in Elixir (for example, it includes Unicode normalization functions as part of the standard library).

Collapse
 
jankapunkt profile image
Jan Küster

Thank you I really appreciate this addition. Your points on Elixir are really interesting. Which of both give you the more joyful experience? You know, the flow feeling :-D

Collapse
 
ahferroin7 profile image
Austin S. Hemmelgarn

It really depends on what exactly I’m working on. I much prefer Python for small one-off stuff, or prototyping, or even automation and system management stuff (I actually use Python for this as much if not more than POSIX sh). Whenever I’m doing something where performance or concurrency really matter though, I tend much more strongly towards Elixir.

Collapse
 
avalander profile image
Avalander

Although there are Kotlin and Scala, which are a little revolution in the Java development I still exclude them for their missing ecosystem equivalent to NPM.

What would an "ecosystem equivalent to NPM" be like? There are like millions of packages in the Maven Repository.

Collapse
 
jankapunkt profile image
Jan Küster

You're right and I was very vague here. I personally count dev experience with Maven as too technical and overly complex compared to NPM. I will clarify that in the post.

Collapse
 
alainvanhout profile image
Alain Van Hout

Maven uses XML. Generally speaking, that's the extent of its complexity, at least in regular day to day usage. Besides that, maven tends to be much more reliable than npm, both with regard to how it functions and with regard to the packages that are available.

Thread Thread
 
jankapunkt profile image
Jan Küster

These are technical arguments and I agree with them on the technical side. Still lacks UX to me and in my post I mentioned it should also make fun.

For example: How do you search for, let's say a "currency converter" package and estimate, based on the results, if the package/library could be worth to become a dependency of your project plus then install it? I mean please prove me wrong but this was not really a joyful experience for me or maybe I just did it wrong.

Thread Thread
 
alainvanhout profile image
Alain Van Hout

You Google "Java currency converter maven" and try the handful that come up. Something to keep in mind is that although it's not hard to publish to the Maven repository, the barrier is higher than for npm. As a result, people tend to not use the Maven repository as a Pastebin, meaning that the average quality tends to be much higher.

Collapse
 
darrencearnaigh profile image
Darren Kearney (he/him) • Edited

Python has a fantastic standard library which will be very refreshing for you as a developer who first learned JavaScript.

I've saved so much time using python's core modules, where the alternative would be lots of JavaScript libraries and dependancies. Having access to simple things like Sets and Tuples out of the box can really help solve your programming problems.

Lots of other programming languages have these features too. I just think you might appreciate Python the most as it is not too far a jump from JavaScript in terms of how you create software.

The latest version of Python 3 also has some lovely quality of life feature for string formatting that will suit your existing JavaScript skills nicely.

Collapse
 
jankapunkt profile image
Jan Küster

Python is actually very high on my list of candidates. Are there also things that annoy you when using Python? What about the indentation based syntax? Is this something I could tackle with a linter (if there is something like this for python)?

Collapse
 
ahferroin7 profile image
Austin S. Hemmelgarn

Yes, there are actually some pretty good linters for Python. The two most used are flake8 (mostly focused on coding style over anything else) and pylint (which covers coding style, but also covers a bunch of other things).

The off-sides syntax though is surprisingly easy to get used to because it tends very strongly to follow logically from where you would be indenting anyway in other languages. The only tricky part is remembering that you need to explicitly mark empty code blocks with pass and remembering that it is usually harder to read one-liners.

The big complaint for most people with Python is how the package management isn’t really designed in a way that makes handling of concurrent versions of the same thing sane. Essentially, packages default to being global unless you use a tool like venv (included in the Python 3.3 and newer standard library) to create an isolated environment, in contrast to how NPM defaults to all packages being local unless you tell it otherwise.

Collapse
 
darrencearnaigh profile image
Darren Kearney (he/him)

Most code editors will have support for Python indentation based syntax without any further configuration required. If your needs are greater then there is a rich ecosystem out there to cater for you as Python is one of the most popular programming languages in the world.

Most Python projects will follow the PEP-8 coding style. Python's seemingly restrictive syntax has a great benefit; It makes looking at other peoples code easier since everyone has to use the same whitespace rules. The PEP-8 style guide allows you to quickly understand the source code of most python projects by removing coding style as a barrier.

Link for official docs for PEP-8 standard (they are kinda dry, so I recommend a tutorial instead!) - python.org/dev/peps/pep-0008/

All good Python programming courses deliver course content in PEP-8 coding style so you will build muscle-memory for this as a matter of course. They likely note this in the course description.

Good luck in your learning!

Collapse
 
storytellercz profile image
Jan Dvorak

Never tried Rust. I tried Ruby, specifically Ruby on Rails. I wasn't as excited about it as my colleagues, but I had no major issues with it.
I saw Python being used a lot in academia and data analysis, so that is one thing to consider for it.
Personally I would probably go with Ruby and focus on the system outside of Rails, but that is also because of personal preferences and goals.

Collapse
 
programmerbyday profile image
Arman @programmerByDay

You learnt javascript which is the prominent language for front-end.
I'd say now learn another one that is for back-end mainly.
Between Java and C#, I'd suggest C# as it has lots of cool framework and features with upcoming .NET 5.
By learning that you basically open your way to system designs, mobile development, cross-platform development as well.

Collapse
 
kspeakman profile image
Kasey Speakman
  • F#
    • Ecosystem: .NET back-end or npm front-end
    • Typing: static
    • Paradigm: multi, functional first
  • Clojure
    • Ecosystem: Java back-end or npm front-end
    • Typing: dynamic
    • Paradigm: lisp, functional first
Collapse
 
leob profile image
leob • Edited

If I look at your stated goals then maybe you could learn a pure FP language like Haskell or Clojure, because it's a totally different paradigm. But they're pretty hard - maybe something like Elixir would be more gentle (very good tooling and a focus on "developer happiness"). Another one I can recommend is Rust (which also supports some FP concepts), that's a very well designed language.

Collapse
 
nickfazzpdx profile image
Nicholas Fazzolari • Edited

Consider learning C# and .NET platform development. Once you get the fundamentals of C# and .NET you can extend your skill set into web development with C# and .NET by learning ASP.NET. Beyond that if you feel like it's a development platform you find value in you can enter into a more specific track and add Kendo UI to your stack. Kendo has bindings for JQuery, React, Vue, and Angular, which really diversify the platform.

If you're learning for a potential employment path you need to conduct some research and see how many C# .NET jobs are available in your immediate area. Or if you're willing to relocate or work remote.

My rationale to learning the C# and .NET stack is derived from two main points:

  1. C# and .NET are the native Windows development platform and Windows isn't going anywhere any time soon. There will be demand over time.

  2. With the introduction of .NET Core x.x you can now target Linux/Unix systems and develop cross-platform.

I've seen some people mention that learning C# and .NET is too limited in scope. I think the issue with that argument is that the scope of what you can do with C# and .NET is broad enough that the limiting effect is void.

Collapse
 
sirseanofloxley profile image
Sean Allin Newell

Try these:

  • elm (specifically for front end web apps, specifically designed to be a joy)
  • python - i recently am switching to this, and its been a joy so far!
  • F# - full stack with Fable, super fun, compat with .NET core
  • C# on .net 5 (netcore)
  • Ruby w/ rails, i hear ppl really love this
Collapse
 
crenshinibon profile image
Dirk Porsche

Give Go a try, especially if you are dealing with backend, api or command line stuff.

I have worked with many languages and tried a few more. But the simplicity of the language and the amount of things you can do with just Go itself is amazing. You barely need much else. But the community is great as well.

The support in VSCode is great.

The cloud runs on Go (k8s, docker).

...

Collapse
 
oliverradini profile image
OliverRadini • Edited

Ruby is probably just as closed as any other language in its actual use scope - from what I've seen, it's for rails, and other usages are a little niche. Glad to be corrected on that, but if C# is 'closed scope' so is Ruby.

Python is very flexible and relatively simple to get started with. I don't know as any other non-javascript languages really do packages in the same way as npm, and that might be a good thing, you'd learn a lot from finding out the pros/cons of the different ways of managing packages.

It depends what your goals are but I think most developers would benefit from having experience with either C# or Java. They're massively popular and are used all over the place. You'd also learn something about OOP in the process.

You should probably consider a functional language if you want to take your abilities further. You don't have to use the concepts you'll learn, but it's very beneficial to gain new perspectives.

Collapse
 
jankapunkt profile image
Jan Küster

Thanks a lot. I think I have to reconsider and review again. I will Update that Post soon.

Collapse
 
gabrielfallen profile image
Alexander Chichigin

extending my overall programming and engineering skills

unfortunately largely contradicts

solid tech in my stack with a promising future

Thus I'll first make a list for the first requirement, and then a separate one for the second.

First, important aside. To very large extent "engineering skills" are completely independent from particular programming languages. There's a whole (research) field of "Software Engineering" that pretends to be language-independent, though to my taste it (has been) concentrating and revolving around OO-design and languages too much. Anyway, from 30000 feet Software Engineering is comprised of Requirements Engineering, Software Architecture, Quality Assurance (Software Testing, but also Verification and Validation) and overall Project Lifecycle and Management. There are books and books on each of these topics, and learning any and all of them will make you much better developer.

All right, enough of boring stuff let's talk about languages! A list of select languages to make you "think different" and become a better programmer:

  1. Scheme (Racket)
  2. Prolog (PiCat)
  3. Haskell

The order is mostly irrelevant, though the first two being dynamically typed are significantly closer to JavaScript. Some comments on these languages.

You've probably noticed that Functional Programming kinda eats out client-side Web development: React (especially with the Hooks), Redux, Elm and TEA and many less popular technologies. Thus learning a language that basically kickstarted modern FP (Scheme) seems reasonable. Another famous trait of Scheme programming is advanced meta-programming facilities in the form of Hygienic Macros (and we all now know how paramount hygiene is). Racket is a modern Scheme derivative further developing meta-programming facilities and incorporating systems programming features and package management. Not mentioning Contracts, Types (Typed Racket), Laziness (Lazy Racket) and cross-platform IDE with REPL and images support. Though the most valuable thing might be How to Design Programs book that in itself is arguably the best introduction to programming out there.

Even further than Functional Programming down the declarativeness line lies Logic Programming. And Prolog is the father of it all though PiCat is much more modern language incorporating Imperative, Functional and Logic programming with some important extensions like Constraint Programming and Planning. Worth learning especially considering there's a nice book on it.

And Haskell is just a cornerstone of contemporary programming languages, it's so important and distinctive there's a whole host of memes about it. It's the most practical of all research languages and the most pure and mathematical of all practical ones. Due to almost complete functional purity it forces you to really learn the ways of Functional Programming whether you want it or not. Besides arguably modern Functional Programming is all about Type Systems and Effect Systems (for strong reasons) and Haskell is both the testbed and the integration point for the Industry for research in these fields. Additionally to that GHC has one of the most advanced compilers among all of them and one of the most advanced and stable runtime systems (on par with JVM, Erlang and Go).

OK, let's finally talk about future technology.

First of all it depends on how far in the future one looks. If we think 50 years ahead programming as we know it won't be very important and as lucrative as it is now. That future will be dominated by BioTechnology — Genomics, Bioinformatics, Bionics, Neurointerfaces and somewhat biomorphic Artificial (General) Intelligence. But for us it's too late to switch fields as the body of necessary knowledge is huge. I kinda looked at it and got scared.

So the most practical and useful among recent and interesting languages might be Rust. It's a bit hard to learn without knowing C/C++ or Haskell (as it borrows — no pun intended — from both worlds) but many do and many find it to be a pleasure to work with not the least thanks to the tooling. It has pretty strong Web-dev support and expands into Embedded and IoT world, which in itself continues to expand and penetrate both our lives and our industries.

Closer to the client-side Web-dev is WebAssembly which is a success already and going to become much more important and ubiquitous in the near future. Too many languages already can compile to Wasm, but the most prominent are Rust (again) and AssemblyScript (which looks a lot like TypeScript).

For a little bit more distant future technologies (about 10 years give or take) I'd look at Probabilistic Programming (and Probabilistic Programming Languages in particular), Bayesian Inference and Judea Pearl's "the Science of Cause and Effect". I expect it all to make quite a splash going mainstream on that time horizon after overcoming some technical and pragmatical challenges.

Collapse
 
slimdestro profile image
D\sTro

JoyFul programming language?
well, every programming language is joyful as soon as you start getting it. i started my career with PHP and HTML/CSS around 8-9 years ago. designing tables, image rendering thru HTML was interesting but when i started first day of PHP, i was almost prepared to leave this field because it was completely new to me. now i enjoy almost all programming language including Go, Python, Rust, Ruby and Frontends.

thing is, making thing joyful is not others job, its yours. you start thinking theres a ghost inside the house, you will find the Ghost.

Collapse
 
kayis profile image
K

I'm learning Rust right now.

I think, it hits a sweetspot of good DX (nice type-system, docs, community), good performance, and not being bound to one company.