I'm learning Java and Ruby, and I saw few posts about functional programming. So I thought that the next step should be learn a FP language. But I saw so many people hating Scala. Is there a reason for this?<p>edit: Ok, Hatred is a strong word. I shoud have used dislike instead.
People who actually use Scala love it. For instance, Scala is one of the most loved languages in the recent StackOverflow developer survey. The survey had more than 26'000 respondents, so this is pretty significant.<p><a href="http://stackoverflow.com/research/developer-survey-2015#tech-super" rel="nofollow">http://stackoverflow.com/research/developer-survey-2015#tech...</a><p>But you are completely right that there's also a lot of negative sentiment around it. Here are two possible reasons I can think of (I am sure there are others).<p>1. Scala does not form part of an established programming language tribe. It is neither a better Java nor a Haskell on the JVM. So people are challenged in their assumptions; they don't know what it is, and react negatively in order not to have to learn more.<p>2. Scala is pretty successful. So people in neighbouring language communities sometimes feel frustrated that a seemingly (to them) inferior language gets traction and their perfect language gets less. I saw some of that when Java eclipsed Smalltalk in the 90's. I never met a community as spiteful of Java as the Smalltalk one.
I have used Scala for building business solutions since 2012. I had been maintaining PHP and Rails systems of 50k to 150k LOC prior to the switch. I still have to maintain PHP and Rails systems. The move to Scala was driven by the need for better performance, system resiliency, and to mitigate the effect of multiple developers coming in & out of a codebase. It turns out to be ideal for this.<p>Idiomatic Scala is not a grab bag of features or paradigms. It is firmly based on programming with expressions and using the type system to improve abstraction. Statements and mutable data structures show up when interfacing with external systems or for performance reasons. The Collections libraries are arguably "object-oriented" as that term is commonly understood, but this is not typical for application code. However, object-oriented features such as objects, classes, and traits are the basis of Scala's module capabilities.<p>For programmers coming from 20th century mainstream languages that are all based on programming with statements, mutable variables, and are arguably a thin abstraction over the machine itself, programming with Scala can be a challenge. If you want to do your familiar imperative style of programming, Scala is going to be painful. Use another language. But if you would benefit from a type system and good support for expressions, then Scala is possibly the best choice currently for growing business applications. We are not in 2005 any more.<p>Scala is not ideal as an introduction to functional programming. Other languages, such as F#, SML, OCaml, and Haskell have better, simpler syntactic support for features associated with functional programming.<p>People who dislike on Scala are probably either stuck in the past or don't have pain that Scala would solve.
In my opinion (and I have worked on large scale development in Scala in the past) it is just unnecessarily complicated.<p>Random annoyances off the top of my head - you can't necessarily understand an isolated function unless you know what implicits are being used, crazy overuse of operator overloading and slow compilation times (this has improved over the years).<p>You don't have to learn Scala, you could learn Clojure, F#, OCaml or Haskell. They would all teach you interesting aspects of programming and then you could come back and examine Scala with a broader perspective.
There has been an... unfortunate community attitude. Some people were quite unwelcoming to newcomers. I think this is down to two individuals; nowadays many friendlier folks are writing Scala libraries and hopefully the community will improve.<p>I get the sense the Java community is also unused to interacting with other languages, because for a long time the JVM was a world unto itself. Most languages have a spectrum of "neighbour" languages and so users are used to working with at least slightly different alternatives. Scala is possibly Java's closest neighbour (Groovy is not really popular enough to show up on the radar of most Java devs) and it's become something very different, so there's a real culture shock just trying to talk to each other. A lot of Scala folks take a lot of assumptions for granted that are very alien to Java folks.<p>None of which really takes away from the language itself, if you're willing to learn on your own or tolerate a few insults when you ask for help. IMO it is very much worth it: Scala is genuinely the best practical language available today (it has more than its fair share of warts but they're mostly for JVM/Java compatibility, which makes it so much easier to introduce to business than e.g. Haskell).
This might be worth a read:<p><a href="http://codahale.com/the-rest-of-the-story/" rel="nofollow">http://codahale.com/the-rest-of-the-story/</a><p><a href="http://codahale.com/downloads/email-to-donald.txt" rel="nofollow">http://codahale.com/downloads/email-to-donald.txt</a><p>Having worked with Scala; I'd say I love it.<p>Having worked with Scala; I'd say don't use it for most projects.<p>It is not the best language to start learning FP. Wrap your head around a dedicated FP language and if you still feel the need for a hybrid FP/OO language Scala is definitely worth a look.<p>However as it is a hybrid I've felt it made my code just too complex. Compared to Java there are a dozen more ways in Scala to fix something; and often you struggle to find the best way. This takes a lot of learning and it just isn't worth it. It's a great and elegant language in many ways, but I've come to dislike a lot of features of it.<p>Simplicity is one of those things that make a beautiful codebase. See also (recently featured on HN);<p><a href="http://kotaku.com/5975610/the-exceptional-beauty-of-doom-3s-source-code" rel="nofollow">http://kotaku.com/5975610/the-exceptional-beauty-of-doom-3s-...</a>
In 2015, XML is a first class citizen but JSON get a third class treatment. JSON parsing in Scala is ridiculous. <a href="http://www.reddit.com/r/scala/comments/2l7v5u/json_parsing_in_scala/" rel="nofollow">http://www.reddit.com/r/scala/comments/2l7v5u/json_parsing_i...</a>
I dabbled in scala for a while a few years ago and ultimately decided not to invest the time becoming an expert in it for the following reasons.
1) Slow compile times, I really value fast feedback and if it takes me over a second to compile and run a unit test that just doesn't cut it for me.
2) No clear idiomatic style and having many different ways of doing things each of which can imply different behaviour in different contexts.
I don't hate it. Scala looks cool and I might use it if I had to use the JVM.<p>What turns be off from looking into it much:<p>Verbosity. It seems that it can't infer types in as many places as an ML. I prefer rather succinct code. I understand Scala has a powerful type system and it isn't always possible, but... ugh.<p>OO. Scala <i>seems</i> to want to really embrace Java's OO model fully, and that's a bit ugly. It's probably a good practical decision but feels like a turn off. Again, I haven't used Scala, this is just an impression I have.
I don't hate Scala but I did not pursue it after only a few 'lessons' : transitioning from Java to Scala was smooth and not intellectually stimulating. On the other hand , Clojure programming forces me to think differently and the solutions are more elegant. I understand Scala is also functional but it is too permissive and I slide back in imperative all too easily. Clojure is highly disciplinarian and opinionated and I find that refreshing.
I've written C# for most of my career, and have in the last couple of years been exploring functional programming. I started learning Scala, and getting involved in the community and I found it to be quite interesting.<p>Something I find different is that most C# developers like writing C#, they may dislike many other parts of the ecosystem, but they generally enjoy the language. However with Scala developers, I find that many of them seem to dislike the language.<p>To cast a broad stereotypical brush, it seems like there are 2 main groups of Scala developers. There's those who are really into FP, and would love to be getting paid to write Haskell all day, but unfortunately Scala is the only option they can convince their employer to adopt. So they begrudgingly choose it because it has some of what they want, but they are forever wishing it was better & making their frustrations known.<p>Then there's the other side, which are developers coming from Java (or other OO languages) after hearing about the benefits of FP/Scala. They're either not using Scala professionally, but want to learn, or are just starting to use it at work. They are much more enthusiastic about the language.<p>Unfortunately, the first group are often more vocal, and it puts off newcomers.
I wouldn't say hate. Scala is a OO-functional language, so it's bound to have people who dislike it from both of those camps.<p>I started learning Scala (it got me into functional programming) but dumped it for the same reasons as Java. It's bloated. I also question Scala's longevity.<p>I'm happily using Elixir and Clojure these days, but I mainly do web stuff so YMMV.
Programming languages are a new thing for humanity. I'm pretty sure that we aren't making programming languages correctly yet. And even worse there almost definitely isn't a One True Programming Language (it seems suspiciously like there's going to be more than one "right" programming language per domain (ie embedded, web, server side, etc) and to make things even <i>even</i> worse the right language to use might even be different based on the person using it).<p>If you find yourself in the future "hating" <i>all</i> the programming languages, this isn't necessarily problematic, it might just mean you have a good understanding of programming languages. Just try to remain polite and remember that there's more than one way to see most scenarios.
I am not really sure. I come from a Ruby and Python background and just love scala. It's a joy to work in and relatively easy to introduce at work compared to other FP languages.
I'm currently learning Scala (background in Python and Haskell) and I have encountered a few road blocks:<p>1. The REPL is not very helpful: You cannot look up documentation a la IPython (i.e. myFunc?) or inspect objects easily to find out how things work<p>2. There always seem to be 10 ways to do the same thing. This makes it much harder to understand other people's code than when there is just one way to do it.<p>3. The type system seems less helpful than Haskell's (e.g. why is "asdf" + 3 not a type error?)
Everyone agrees Scala is too complicated. Beyond that, there's a flexibility problem: Scala allows you to write a global mutableMonadFactoryFactoryMonad.<p>That said, nothing does exactly what Scala does. Fluently mixing imperative, lazy, OO and functional styles isn't really common. Neither is the wealth of concurrency constructs available to Scala programmers through the standard library and Akka.<p>I'm writing a compiler in (not for) Scala right now and it's pretty sweet.
Here's one: <a href="http://blog.gmane.org/gmane.comp.lang.scala.debate/month=20110301" rel="nofollow">http://blog.gmane.org/gmane.comp.lang.scala.debate/month=201...</a><p>Apart from occasional issues in the community Scala is criticised for being too complex: <a href="https://www.youtube.com/watch?v=uiJycy6dFSQ" rel="nofollow">https://www.youtube.com/watch?v=uiJycy6dFSQ</a>
If you compare it to Java or Groovy, Scala is the winner. Even the designer of Groovy admitted by saying something like "If I knew the Scala back in 2003 I'd probably have never created Groovy" But compare to Haskell, it looks like a bit bloated. On the other hand, Play Framework has been a great catalyst for Scala.
For me personally, main problem with Scala is somewhat hard to explain, but can be summarized with few very abstract phrases which are overlapping:<p>* Dirty (opposite of Clean) language.<p>* Relationship between theory and practice is so far away from being "1 to 1".<p>* "Not In My Head" anti-patterns (something that will constantly require checking your notes/internet if you haven't worked with it within e.g. a month) everywhere.<p>Everything seems to be made overcomplicated on purpose for no reason (apart from JVM compatibility I guess, which is no excuse for me as user). Starting from simple things, variable function declarations, so many ways to declare functions, so much theory on var/val/def/lazy/ and how they differ at some corner cases. Function vs. Method stuff in combination with currying/partial application makes things so overcomplicated with so many corner cases which I will never be able to remember. I mean I have many pages of my notes from time I studied Scala, consisting just of corner cases and explanations of why they are present.<p>If you consider how Golang is viewed by many - as huge step back in our knowledge of language design. I consider Scala as step back in what is known in clean code, overall lessons from designing nice products. It just makes me feel like, it betrays everything I care internally and if Scala becomes dominant platform, it would just show to me that we as an industry just don't have standards and can accept just anything, we will never have something nice, close to perfect.<p>So my stance on Scala:<p>* If you just want to learn functional programming - pick something else, F# for me looked a lot cleaner and much closer to "1 to 1" - you can just apply functional theory without fighting the language.<p>* If you looking for language to make you happy - don't pick Scala. Unless you're into "The Abyss" thing @ Crockford.<p>* If this is for the money or because it sucks less than X (e.g. Java) in some ways - Scala is good consideration.
I was a big fan of SML, and really wanted to like Scala. The reason I didn't pursue it was the language is really complex (imo) kitchen sink as others have said, and as others have also said, there's no one best way to do things, no clear idiomatic style. Plus there was a bit of churn in the language in the beginning. I concluded that if I was going to use the jvm, may as well just stick with Java, or another jvm language with more wide spread acceptance (jython, groovy, ...).
I've been programming in Scala for around a year and a half. I hate one thing about Scala, which is the community.<p>It's split into two, the people who wish Scala is Haskell (shapeless, scalaz &c) and the people who want Scala to be Enterprise Quality™<p>It causes lots of issues, as their goals for the language are completely different and Scala devs are usually in one camp or another.<p>As an aside, I always think that if your problems are much better expressed in Haskell, why are these developers not using Haskell?
If any one from the scala community is hearing. This is what I have to say as a newbie who started learning Scala a couple of days back.<p>Free learning resources. There are no good free scala books which can teach you the language in the way it is supposed to be learned. Not something expected of a language which wishes to compete with something like Java on the longer run. The biggest issue I have faced so far is learning from scattered blog post all over the internet explaining the powers of scala, even before introducing how to use the very basic features to build simple things.<p>There is too much assumption about what the programmer already knows, or about the programmer's background is; while introducing these features. As some one who is not familiar with the Math behind most of these functional programming concepts, every thing goes over like water poured over a stone when the documentation talks about Types, Category theory, Monads. In fact it took me a great deal of simplification, and thought to understand concepts like map, reduce, foldLeft, foldRight. Most of it was in language totally unpalatable to an ordinary programmer. Talking in a language understandable only to Phd students won't work for nearly all of the programming world.<p>So far my introduction to Scala has been similar to seven blind men describing an elephant by touch various parts of the elephant's body.
as a reasonably seasoned non-scala programmer who was fairly new to scala, I think that it's a combination of 3 things combined together. Implicits combined with non-alphabetic dsls (somewhat combined with the removing the dots from the method calls)<p>.. additionally, I always found the scala equivalent of the javadocs harder to read.<p>The end result (for me) was that I'd download, say an HTTP library, all the method names would be things like '/' and '?' - and you couldn't actually see what a minimally functioning code should look like due to all of the implicits flying around.<p>If you compare this to java, which was undoubtably more verbose, but was easier to take and unfamiliar library, squint a bit, and see how the building blocks roughly fit together, using a combination of reading the docs, and looking at the intellisense in your IDE.
Previous discussion may be pertinent:<p><a href="https://news.ycombinator.com/item?id=7458588" rel="nofollow">https://news.ycombinator.com/item?id=7458588</a>
I can speak from my own experience with using it on a growing team: Don't.<p>It's a very powerful and expressive language. That translates to "completely unreadable by people without at least a few months direct experience in it." If you plan on introducing people with little to no scala experience to your code base regularly you will probably want a different language or to severely limit your allowed feature set.
It's disappointing to see Scala diehards coming here and downvoting anything that isn't glowing sycophantic love of scala. That's not leaving a good impression to the neutral crowd at all.<p>Here's an example of a post censored from StackOverflow: <a href="http://stackoverflow.com/questions/3606591/why-does-intellij-idea-compile-scala-so-slowly/3612212#3612212" rel="nofollow">http://stackoverflow.com/questions/3606591/why-does-intellij...</a><p>Here's a backup of the post that was mirrored: <a href="http://w3facility.org/question/why-does-intellij-idea-compile-scala-so-slowly/" rel="nofollow">http://w3facility.org/question/why-does-intellij-idea-compil...</a><p>There is one word to describe the mind of a scala die-hard: Solipsism. The view or theory that the self is all that can be known to exist. [1]<p>[1] <a href="https://news.ycombinator.com/item?id=9389563" rel="nofollow">https://news.ycombinator.com/item?id=9389563</a><p>You see the way they squirm? They can't accept any criticism and therefore refuse improvement. They just want to sit there and be hobbyists. Not on my investors' dime!
I think it's because they went into it for the wrong reasons. If you jump into a language because it is the latest fashion, and not for solid engineering reasons, then it will be an uphill struggle to reach your goals.<p>I have only dabbled in Scala myself, kicked the tyres as it were. My question was, is this an Ocaml or Haskell with good interop with the Java ecosystem? The answer is no but I don't hate Scala for it, I just moved on. But many folks would have persisted and tried to make it into something it's not and gotten miserable in the process.