Things I don't like about ruby:
- two string types, symbol and string, with string being the mutable by default one.
This means given a random thing back from an api, you don't know whether to do thing[:id], thing["id"], or thing.id
This has been acknowledged as a pain point by Matz, which is why in ruby 3 strings will be immutable by default.
- Simultaneously too many names for things and not enough.
Is it .length or .size or .capacity (probably not capacity)? is_a?, kind_of?, or instance_of?? Why can I do .select or .keep_if but not .filter?
- Too many function types.
Do you want a method, a block, a proc, or a lambda? There are subtle differences between each, so choose wisely. I'll note that python suffers from this too (method, function, lambda, comprehension).
- Too much emphasis on magic
Novice rubyists get frequently bitten by all the advanced (and very hard to google) ruby concepts. How do you know what arr.map(&:id) is without already knowing that it's calling symbol.to_proc? How about $1 $? $! (if you know what all these do, you're a better rubyist than I am).
Since the author of the referenced post criticizes django for being too magical, try rails. In addition to the names of files mattering a ton, there's the routes DSL, the migrations DSL (which is not well specified in the guides), and ActiveSupport, which you only realize you're using when it's gone.
- Horrible error messages
undefined method : for nil:NilClass (when you try to get something out of a hash and it's nil)
cannot convert Symbol into Integer (this is on an array being returned where a hash is expected)
Also, if you get a stack trace, it's completely inscrutable. Python's stack traces (at least ipython's) show you both the line number and the line in question (often with context).