This page is no longer maintained — Please continue to the home page at www.scala-lang.org

Novell Pulse - Lift at heart

Novell has just announced Pulse, an exciting and much anticipated cloud-based, real-time collaboration platform for the enterprise. It provides a collaboration environment that is secure and draws on the best of instant messaging, document sharing, social connections, real-time co-editing and enterprise controls. At Pulses heart beats Lift 1.0, a Scala based WebFramework that has been used to provide all of the web services for the project.

You can enjoy a very professional Pulse demo given at Novell BrainShare 2010 or learn more about the product and service on the Pulse web pages or follow an introductory series of videos on YouTube: Pulse1, Pulse2, Pulse3, Pulse4 and Pulse5

Daniel Spiewak,Developer and member of the "breakout" team that developed Pulse, talks about the project.

"The great Lift Comet support made the architecture decisions much easier. We had already made extensive use of Comet so Lift's fit was a real benefit. The entire front end, the web application, was written in Scala. Most of the back end is Java, though we do use Scala code to handle really complex functions, like rendering the Google Wave content schema into XHTML. There are some administrative tools still written in C#. Numerous backend services, all hang off of RabbitMQ and push data around through several asynchronous channels. It can all get quite busy!

The front end application fits really nicely into this ecosystem, primarily because of its intense reliance on actors. The entire front end is highly asynchronous, spending most of its time passing actor messages around from point A to point B.

It felt good to see all the pieces come together and just do the job rather well.

We've become somewhat disillusioned with traditional concurrency control mechanisms, and so while we certainly could work with locks and mutexes, it's so much easier just to send async messages. However, there are still several areas where actors do not seem a good solution, the in-memory message cache for example. In these cases, we generally use(and possibly abuse) the java.util.concurrent data structures. We would certainly appreciate seeing a Scala STM to more soundly deal with this type of problem.

We use a patched version of Lift 1.0 due to the fact that later versions in the 1.0.x stream trigger a very intermittent bug in our application's session management, and it was easier to just fork our own version of Lift rather than spend any more time trying to isolate the issue. Dave Pollak, the originator of Lift, has been extremely helpful and we look forward to upgrading to the new features in Lift 2.0 and Scala 2.8 sometime in the near future.

The tooling support (or lack thereof) has certainly been a challenge, but not an insurmountable one. Our team is split roughly 50/50 between the Scala Eclipse IDE (version 2.7.7) and the Scala module for NetBeans. Neither tool was particularly solid at that point, but with enough experience, it was possible to massage them into behaving appropriately. The most important thing is that they both provide debugging support, which I believe is crucial to developing a non-trivial application in Scala. The tool scene is not all darkness and rainclouds though, embedded Jetty works flawlessly with Scala and Lift, and ZeroTurnaround's free JRebel license for Scala developers has saved us cumulative weeks in our development cycle.

Overall, both Scala and Lift have provided a great experience for us. It did take some time for our team of former Java developers to get up to speed with the language and its idioms (a process which led to the first drafting of the Scala Style Guide), but things are flowing along quite smoothly now. Scala is certainly a more powerful language than Java, but its learning curve really isn't any steeper than your average scripting language. Given enough patience and persistence, I would expect any team of competent developers should be able to get completely up to speed with the language in a month or two. There is that initial hurdle, but the benefits are staggering once it is overcome. Expressive, functional code, the cake pattern, built-in XML support, monads, the list just goes on. These features (and more!) have saved us countless man-hours working on Pulse and allowed us to deliver a product into production much sooner than I ever would have imagined."

Copyright © 2012 École Polytechnique Fédérale de Lausanne (EPFL), Lausanne, Switzerland