PHP and Javascript are my current tools as a web developer. I made some first steps with Python and. Ruby, but did not use it for a real project yet.
There is nothing wrong about PHP or JS, but I would like to learn a new programming language primarily focused on the backend. The problem is that I am not entirely sure which language to pick. That's why I am asking you for advice.
The language I would like to learn should mostly be used to craft backends for all sorts of websites and services: from "simple websites" with contact forms and so on, up to large SaaS products with a broad range of capabilities. It should be easy to start with but powerful enough to handle critical workloads. Ideally, it has mature frameworks which provide a solid base for things like user auth, ORM and database handling.
Also,it should be future proof, meaning no declining but raising usage.
The languages which seem most appropriate are
- Python
- Ruby
- Go
- Kotlin/Java.
The languages in detail
The following list contains some assumptions about the languages. I hope that some could verify or correct them if wrong. :)
Python is one of the most popular languages and is known as a universal language for programming in all sorts of fields, and became quite popular in the AI sector. It has popular frameworks for the web environment. A large con is that it's dynamically typed.
Ruby is used by many top web services such as Github or Stripe. From what I heard a lot of people swear on Ruby. I already worked with Rails a bit and it really is a great tool.
On the other hand I read some comments that it's kind of a dying language because it never had a large market share and now others take over.
Go is kind of the newcomer on the block. I heard a lot of good things about it because it was created to be used for the web, has a strict type system and should be easier to learn. Con seems to be the rather small usege at the moment. I did not find many job offers for it.
Last but not least, Java, or the more modern Kotlin. Java always was an "enterprise language" for me and feels rather slow and bulky, although it's used in many high-class systems.
I am not sure about Kotlin. It looks modern and like a nice evolution of Java, but I did not find many job postings for it.
What do you think about all these modern languages? Which one should one pick if starting fresh into the web programming business and what would be the most important selling point?
Or do you have other suggestions in mind?
Top comments (36)
Starting fresh? Go is almost certainly your best bet. It's not quite as marketable right now as some of the others, but it's also quite simply the best option out there. In particular:
GOOS
andGOARCH
in your build system and almost everything is taken care of automatically.go build
will spit out an entirely self-contained static binary for whatever platform you're building for. Just copy that in, make sure all your static assets are in the right place, and start it.You're right that there aren't as many job offers for Go developers, but a significant part of that is the fact that there's almost no legacy code written in Go (unlike every other language you listed except Kotlin).
What about JavaScript? Express.js I mean.
That's some great details about Go. Will definitely take a closer look into it.
Typescript is as a language great one, you should consider it.,
My choice of language is Ruby and Typescript. Java is great but it's development is quite slow, Scala is awesome too. I have heard good things about Golang, but in my perspective go has ignored all new innovations in languages designs that has taken place in last few decades just to make it simple.
I think if you want to develop web apps you should aim for Python or Ruby. Go is great but I think the developer experience of tools like FastAPI/Flask/Django (for Python) and Rails for Ruby is better than Go's frameworks.
What are you trying to achieve?
Thanks for your first impressions. I updated my post with more information about my intentions.
Thanks Kevin!
I still think my initial recommendation is somewhat valid. You designated Ruby as a dying language and though it's not strictly true, it is true that its adoption is not at the "top of the charts".
Rails is still a solid choice that many companies still make from scratch in the last few years. You wouldn't be wrong picking that: Shopify is probably the poster child of large scale Rails deployment and they have written extensively about how to scale a Rails app.
Python has many examples of large scale web apps deployments (Pinterest, Quora, Instagram's website, The Washington Post). That happens because in web apps, in most but not all cases, the language "speed" is not the bottleneck as most operations are I/O bound and you can deal with those however you choose: single or multi-threaded, async, parallel processing and so on.
Even in the case of numeric computing (so being CPU bound), you can skirt the limitations of languages like Python using tools like NumPy/SciPy/PyTorch as Python can easily call low level code written in other languages.
I personally think investing in Python, starting from scratch, is a tiny bit more flexible of a choice than picking Ruby (whose alternatives for numeric computing and ML have vastly smaller communities). It still doesn't mean that picking Ruby and Rails is a bad choice, the size of the Rails community and projects like Ruby 3x3 are a testament that "Ruby is dead" is a false claim. We use Ruby everyday at DEV and I can assure you it's actively developed :-D
Setting Python and Ruby aside, as I mentioned in the previous comment, I do like Go very much but its "raw numbers" are a bit of an arbitrary reason for picking it. They can't be the only metric: the developer experience, maturity of tools, flexibility of language and many other things have to factor in. Go's "web applications" community is not that big, most people use it to build APIs or microservices in my opinion but I wouldn't write a traditional web app in it. It'd be way faster to build it with richer dynamic languages like Python/Ruby. Go's huge advantage is the single binary deployment, which is nothing new in the history of computing but it's a welcome "come back" as we've all gotten used to scripts that have deploy thousands of files before you see your updates in production :-D
Maybe you can pick a tutorial for FastAPI or Flask (Python) and Beego or Buffalo (Go) and go through it and see what your feeling is.
Just know there's no inherent wrong choice here :-)
ps. I didn't mention Java or Kotlin because I know absolutely nothing about them, or at least nothing that's not probably obsolete knowledge :D
Thank you very much for this detailed writeup. Will definitely keep those points in mind, and going through actual tutorials might be the best idea to get a first feeling for the options.
If you're looking at Java I would definitely look at .Net Core and C#. I use it at my work place and we build SaaS platforms and Web applications using either MVC or Angular for front end. You can get various powerful ORMs such as Entity Framework which allows for code first database development. And it can be deployed anywhere. As for Auth you can take a look at Identity Server 4, which has been written in C#.
Java is somewhat bulky, but it's not slow. Java was designed to be always on rather than on demand. Although with GraalVM Java is also playing the on-demand field.
Java is quite dominant in the Enterprise world.
But unless you are aiming to build a big to huge thing, I would probably not start with learning this as a new thing. I think it's better to pick Ruby or Python.
I'm not saying that Java is not suited for smaller web applications. But if it's something new you want to learn it might be better to pick Ruby. And once your new thing is done, build it again in Java. 😛
Kotlin is awesome! I have been using it for a couple of years now in production and is just a joy to use.
It also does not have some of the craziness of Scala that is best left for academia IMO. Just think of it as what Java would look like if it were written today (null safety built into the language, no checked exceptions, local type inference, immutable data classes, etc.)
Kotlin's interoperability with Java is also excellent, and therefore you can easily call out to third-party libraries that are written in Java.
The perceived speed of all those frameworks in the various languages is imo just a dream, a balloon that will eventually pop.
Sure they may seem to get you up and running quick, but you also inherit all the baggage, lock you into a certain way of thinking, and eventually lead you to run into the limitations. The plugins will rot over time, major framework updates will cause major upgrade pains, often leaving you stuck on the old versions for far too long, and everything that made you fast at the beginning now slows you down.
I do however think they're fine for prototyping some stuff quickly, to find out what you want and need, in the exploratory phase.
Don't get locked into framework prison. Like Uncle Bob advocates in Clean Architecture, such delivery mechanism frameworks just become some detail at the edge of your app.
Don't learn frameworks, but learn patterns, and know when to apply them.
I would suggest to roll your own framework or set of tools, based on low-level libraries, instead of high-level frameworks. It will pay off, in my experience.
Build something with Scala's ZIO, or Typescript's @matechs/effect, or Kotlin's Arrow-fx, for example. Would be my suggestion. But if you don't want to go the functional direction, the same rules apply; gather the libraries and tools that you need, try to steer clear of frameworks.
All of those languages have their pros and cons:
If you are looking for speed go with Rails or python with Django. If you are looking to learn you could take a look at Kotlin and use types along the way.
Thanks for your insights! It is really hard to decide.
All good choices I'd say. I'm a Laravel developer and managed to pick up Go in about 2 weeks. In 2 weeks I migrated a slow PHP script to Golang and put it in production, where it now performs amazing. It's really fast and the memory usage is so low that I often don't see it in the memory management tools. Seeing as you come from PHP as well, it might be a great option for you as well. It can do what PHP does, but faster. It also has a lot of other usagew, because you can compile it to a binary and drop your self containing program anywhere (with the right architecture) and run it. It's something that has helped me and might also help you.
Same story :), Using go, some benefits such as no data type related bugs, performant binary, readability for other developers...
Based on your criteria, Elixir and Phoenix Framework seem like the best fit. Elixir is a language perfectly designed for modern web development–clean syntax, easy to pick up the basics, and runs on a powerful platform that's been around since the '80s. This platform today runs apps like Whatsapp, Discord, Bleacher Report, and many others. Phoenix Framework is a fresh spin on the familiar MVC pattern and has a database access layer called Ecto.
I know I'm not exactly recommending a mainstream tech but if you try it, you'll see why it's so highly regarded.