It seems that if you want a multi-paradigm language, Scala is excellent. But if you just want to go down the functional route or OO route (without overlap), there are arguably better choices.
Note that I'm not saying Scala is bad, it just wasn't an easy enough transition for me to justify climbing the plateau. Clojure ended up being a similar situation. These languages are also optimized around writing large software projects and that was a hindrance rather than a benefit to someone that does more scripting than anything.
Also many people are doing scripting on Node runtime instead of JVM.
Anyway I don't think it's worth dwelling on popularity. Networking and political effects seem to be more powerful than the merits of a language.
Not best of both, but it's the ability to solve the task with either FP or OO depending on the task and do it seamlessly.
> Networking and political effects seem to be more powerful than the merits of a language.
That's probably more true than anything, also it's not hipster enough to convince your regular clojurescript aficionados.
All of these factors contributed to Scala adopters like LinkedIn subsequently retracing their steps and doing new development only in Java.
So, academic origins are fine (many good programming languages have academic or at least research-influenced origins), but an academic attitude to the development work that a language should support (predictability of breaking changes, possibility of good IDE support) harms the adoption of a language.
In the abstract, it's the only mainstream language to offer both higher-kinded types and traditional OO ("extends") inheritance. From one side it offers all the good stuff of OCaml, F#, Swift, Kotlin, or Rust, but with a better type system that makes handling secondary concerns via "context-like" types a breeze. From the other side, it offers similar power to Haskell, but with more understandable performance, a better library/tool ecosystem (IDE, profiler and so on), less reliance on memory-unsafe code in practice (a lot of things in Haskell require C-wrapping libraries for things like image formats, whereas the corresponding cases in Scala wrap Java instead), and the ability to use traditional OO style if you want.
Bazel works well too: https://github.com/bazelbuild/rules_scala
But I do accept that sbt is not everybody's cup of tea.
Sure it is not perfect, but the alternatives are much worse and most of the issues people have with SBT projects are other people abusing the build file.
The REPL, fast incremental builds, continuous unit testing, shared SBT sessions, etc makes my day so much better.
I live all day long with: `~testOnly *WalabySpec -- -z killRoo`.
Whenever I have to jump into an app using Maven or only slightly better Gradle it is so frustrating.
Oh, and it's much faster nowadays.
Sometimes Scala teams are more expensive to set up. So there are budget-friendlier alternatives (Java, PHP, Python, NodeJS) for many projects.
See https://scala-ci.typesafe.com/grafana/dashboard/db/scala-ben...
Also SBT has been much less of a nuisance recently. They've made quite some effort to get rid of the most obscure syntax and with the recent improvements in compiler speed it's inching to 'acceptable' territory.
I admit that I really love the language, though.
I seldom see conference talks how to optimize Maven builds, Gradle talks about build optimization, at least one per Java conference, and several per Android one.
Just Google IO 2019 had three talks about it.
I've never had a gradle build that didn't manage to remember I've only just compiled the code and haven't changed any of it. I can't remember ever having a maven build that could tell I didn't need to compile every single time. And the same the whole of the way down the stack.
Nice attempt to imply gradle isn't declarative though.
Again just Google IO 2019 has three talks about tackling build performance issues.
Maven never required a build performance profiler tool.
Gradle is just like Ant, give DevOps a programming language DSL and they will make a mess of build scripts.