Need advice about which tool to choose?Ask the StackShare community!
Elm vs Ruby: What are the differences?
Introduction
When comparing Elm and Ruby, it is essential to understand the key differences between these two programming languages. Elm is a functional programming language primarily used for front-end web development, while Ruby is a dynamic, object-oriented programming language commonly used for web development and other applications.
Type System: One of the significant differences between Elm and Ruby is their type systems. Elm is a statically typed language, which means that all variables must have a defined type at compile time. On the other hand, Ruby is dynamically typed, allowing for more flexibility as types are determined at runtime. This difference affects how errors are caught and managed during the development process.
Immutability: Elm is a purely functional language that enforces immutability, meaning that once a variable is assigned a value, it cannot be changed. In contrast, Ruby allows for mutable variables, enabling developers to modify the value of a variable during program execution. Immutability in Elm can lead to cleaner and more predictable code, especially in complex applications.
Error Handling: In Elm, error handling is built into the language through the use of the
Maybe
andResult
types, which force developers to consider and handle possible errors explicitly. Ruby, on the other hand, relies more on exceptions for error handling, which can sometimes lead to unhandled errors if not properly managed. This difference can affect the robustness and safety of the codebase.Concurrency: Elm has built-in support for concurrency through its
Task
module, allowing developers to handle asynchronous operations in a safe and deterministic manner. In Ruby, concurrency is typically achieved through libraries like Concurrent Ruby or by utilizing threading, which can be more error-prone and challenging to manage. This difference can impact the performance and scalability of applications.Community and Ecosystem: Ruby has a larger and more mature community compared to Elm, with a vast ecosystem of libraries and frameworks available for various purposes. Elm, being a younger language, has a smaller community, which may limit the resources and support available for developers. The choice between Elm and Ruby may depend on the specific project requirements and the availability of resources in each community.
Tooling and IDE Support: Ruby has excellent tooling and IDE support with popular editors like Visual Studio Code and robust debugging tools. Elm also has good tooling support with its own package manager and various IDE plugins. However, the tooling ecosystem for Elm is not as extensive as Ruby's, which can impact the development experience for developers using Elm.
In Summary, Elm and Ruby differ in their type systems, immutability, error handling, concurrency support, community size, and tooling ecosystem, impacting how developers approach and build applications in each language.
I was considering focusing on learning RoR and looking for a work that uses those techs.
After some investigation, I decided to stay with C# .NET:
It is more requested on job positions (7 to 1 in my personal searches average).
It's been around for longer.
it has better documentation and community.
One of Ruby advantages (its amazing community gems, that allows to quickly build parts of your systems by merely putting together third party components) gets quite complicated to use and maintain in huge applications, where building and reusing your own components may become a better approach.
Rail's front end support is starting to waver.
C# .NET code is far easier to understand, debug and maintain. Although certainly not easier to learn from scratch.
Though Rails has an excellent programming speed, C# tends to get the upper hand in long term projects.
I would avise to stick to rails when building small projects, and switching to C# for more long term ones.
Opinions are welcome!
We have a lot of experience in JavaScript, writing our services in NodeJS allows developers to transition to the back end without any friction, without having to learn a new language. There is also the option to write services in TypeScript, which adds an expressive type layer. The semi-shared ecosystem between front and back end is nice as well, though specifically NodeJS libraries sometimes suffer in quality, compared to other major languages.
As for why we didn't pick the other languages, most of it comes down to "personal preference" and historically grown code bases, but let's do some post-hoc deduction:
Go is a practical choice, reasonably easy to learn, but until we find performance issues with our NodeJS stack, there is simply no reason to switch. The benefits of using NodeJS so far outweigh those of picking Go. This might change in the future.
PHP is a language we're still using in big parts of our system, and are still sometimes writing new code in. Modern PHP has fixed some of its issues, and probably has the fastest development cycle time, but it suffers around modelling complex asynchronous tasks, and (on a personal note) lack of support for writing in a functional style.
We don't use Python, Elixir or Ruby, mostly because of personal preference and for historic reasons.
Rust, though I personally love and use it in my projects, would require us to specifically hire for that, as the learning curve is quite steep. Its web ecosystem is OK by now (see https://www.arewewebyet.org/), but in my opinion, it is still no where near that of the other web languages. In other words, we are not willing to pay the price for playing this innovation card.
Haskell, as with Rust, I personally adore, but is simply too esoteric for us. There are problem domains where it shines, ours is not one of them.
In 2015 as Xelex Digital was paving a new technology path, moving from ASP.NET web services and web applications, we knew that we wanted to move to a more modular decoupled base of applications centered around REST APIs.
To that end we spent several months studying API design patterns and decided to use our own adaptation of CRUD, specifically a SCRUD pattern that elevates query params to a more central role via the Search action.
Once we nailed down the API design pattern it was time to decide what language(s) our new APIs would be built upon. Our team has always been driven by the right tool for the job rather than what we know best. That said, in balancing practicality we chose to focus on 3 options that our team had deep experience with and knew the pros and cons of.
For us it came down to C#, JavaScript, and Ruby. At the time we owned our infrastructure, racks in cages, that were all loaded with Windows. We were also at a point that we were using that infrastructure to it's fullest and could not afford additional servers running Linux. That's a long way of saying we decided against Ruby as it doesn't play nice on Windows.
That left us with two options. We went a very unconventional route for deciding between the two. We built MVP APIs on both. The interfaces were identical and interchangeable. What we found was easily quantifiable differences.
We were able to iterate on our Node based APIs much more rapidly than we were our C# APIs. For us this was owed to the community coupled with the extremely dynamic nature of JS. There were tradeoffs we considered, latency was (acceptably) higher on requests to our Node APIs. No strong types to protect us from ourselves, but we've rarely found that to be an issue.
As such we decided to commit resources to our Node APIs and push it out as the core brain of our new system. We haven't looked back since. It has consistently met our needs, scaling with us, getting better with time as continually pour into and expand our capabilities.
In December we successfully flipped around half a billion monthly API requests from our Ruby on Rails application to some new Python 3 applications. Our Head of Engineering has written a great article as to why we decided to transition from Ruby on Rails to Python 3! Read more about it in the link below.
When I was evaluating languages to write this app in, I considered either Python or JavaScript at the time. I find Ruby very pleasant to read and write, and the Ruby community has built out a wide variety of test tools and approaches, helping e deliver better software faster. Along with Rails, and the Ruby-first Heroku support, this was an easy decision.
Pros of Elm
- Code stays clean45
- Great type system44
- No Runtime Exceptions40
- Fun33
- Easy to understand28
- Type safety23
- Correctness22
- JS fatigue17
- Ecosystem agrees on one Application Architecture12
- Declarative12
- Friendly compiler messages10
- Fast rendering8
- If it compiles, it runs7
- Welcoming community7
- Stable ecosystem5
- 'Batteries included'4
- Package.elm-lang.org2
Pros of Ruby
- Programme friendly608
- Quick to develop538
- Great community492
- Productivity469
- Simplicity432
- Open source274
- Meta-programming235
- Powerful208
- Blocks157
- Powerful one-liners140
- Flexible70
- Easy to learn59
- Easy to start52
- Maintainability42
- Lambdas38
- Procs31
- Fun to write21
- Diverse web frameworks19
- Reads like English14
- Makes me smarter and happier10
- Rails9
- Elegant syntax9
- Very Dynamic8
- Matz7
- Programmer happiness6
- Object Oriented5
- Elegant code4
- Friendly4
- Generally fun but makes you wanna cry sometimes4
- Fun and useful4
- There are so many ways to make it do what you want3
- Easy packaging and modules3
- Primitive types can be tampered with2
Sign up to add or upvote prosMake informed product decisions
Cons of Elm
- No typeclasses -> repitition (i.e. map has 130versions)3
- JS interop can not be async2
- JS interoperability a bit more involved2
- More code is required1
- No JSX/Template1
- Main developer enforces "the correct" style hard1
- No communication with users1
- Backwards compability breaks between releases1
Cons of Ruby
- Memory hog7
- Really slow if you're not really careful7
- Nested Blocks can make code unreadable3
- Encouraging imperative programming2
- No type safety, so it requires copious testing1
- Ambiguous Syntax, such as function parentheses1