There is a vivid discussion about Scala’s complexity going on for some weeks now on the web even with a response from Martin Odersky. I want to throw my 2¢ together with some hopefully new aspects into the discussion.
Scala’s liberal syntax rules and compiler magic like type inference and implicit conversions allow nicely written APIs and DSLs almost looking like prose texts. Take a look at APIs like scalatest and imagine the Java/Junit equivalent:
@Test def demonstrateScalaTest() { val sb = new StringBuilder("Scala") sb.append(" is cool!") sb.toString should be ("Scala is cool!") evaluating { "concise".charAt(-1) } should produce [StringIndexOutOfBoundsException] }
There are really nice features that reduce day-to-day programming tasks to keywords or one-liners. Here are some examples:
// singletons have their own keyword (object), static does not exist! object MySingleton { def printMessage { println("I am the only one") } } // lazy initialization/evaluation lazy val complexResult = computeForHours() // bean-style data container with two scala properties and one java-bean property with getter+setter class Data(val readOnly: String, var readWrite: Int, @BeanProperty var javaProperty: String) // tuples as return values or quick data transfer objects (DTO) for methods yielding multiple data objects def correctCoords(x: Double, y: Double) = (x + 12, y * 0.5) val (correctedX, correctedY) = correctCoords(0.37, 34.2) println("corrected: " + correctedX + ", " + correctedY)
On the other hand there are so many features built-in that really make it hard to understand the code if you are not scala programmer with some experience. I like the differentiation between application and library code Martin Odersky himself makes in Programming Scala. The frameworks I have tried so far (Lift, scalatest and scala-swing) in Scala make your life very easy as long as you just use them. It is really a breeze and much more fun than using most APIs in Java for example. But when something goes wrong or you really want/have to understand what is going on you can have a hard time. This is true at least for a Scala beginner, sometimes perhaps for an pro, too.
Final Thoughts
In my opinion Scala is a very nice language that successfully combines clean object oriented programming with functional features. You can migrate from a pure OO-style to a nice hybrid “Scala-style” like many programmers did when they first used Java mostly with procedural style using classes only as namespaces for their static methods. I am quite sure that a Scala code style and best practices still have to develop. Programmers will need their time diving into the language and using it for their benefit. I hope Scala prospers and gains attention in the industry because I personally think it is a nice step forward compared to Java (which turns more and more into a mess where you need profound knowledge to fight your problems).
Regarding the complexity, which certainly exists in Scala, I only want to raise some questions which may be answered sometime in the future:
- Maybe the tooling is just not there (yet)?
- Maybe you sometimes just don’t have to understand everything what’s happening underneath?
- Maybe Scala makes debugging much more seldom but harder, when something does not work out?
- Maybe the features and power of Scala are worth learning?
- Maybe certain features will just be banned by the teams like sometimes in Java teams (think of switch-case, the ?-operator, Autoboxing e.g.)?