Hi Martin

It is not my intention to get into a tit-for-tat, but I do think this
illustrates a few good points about Java that we have all just come to
accept, but which appear to be crazy from an outsiders viewpoint:

> object Main {
>   def main(args: Array[String]) {
> [...]
>
> and
>
> object somestuff extends Application {
> [...]
>

As people have already mentioned, the Application trait was an idea
that did not pan out - for those interested the real failure is that
it prevents the hotspot JIT doing its work properly, which is the
reason it has been deprecated (at least from recommendations).
However, I don't think you can blame people for trying stuff out,
especially (and this is one of those crazy Java cases we have all just
come to accept) the Java alternative is:

class CalculateResults {
    public static void main(String[] args) {
        ....
    }
}

Yes - this looks familiar to all of us, but really, you should see the
look in beginners eyes when they see this for the first time. We are
just used to some crazy (and incomprehensible) stuff. You can't blame
folks for trying to improve that, after all from an end users
perspecitive

object CalculateResults extends Application {
   ...
}

would be a lot easier to explain to someone new. It's just a shame it
had a technical flaw when used on the JVM.


> (I have seen 5 ways to write the same simple stuff in other cases
> which I unfortunately can't recall now - just ridiculous it was!). It
> is hard enough to read others code, but such things makes it worse.
>
> 2. Readability
> No, this is not (just to give one example):
> val elems = args map Integer.parseInt
>       println("The sum of my arguments is: " + elems.foldRight(0) (_ + _))
>


I can see why this was presented in this form, since .sum is just one
operation, while foldRight, reduceLeft, etc. can be used for any kind
of operation, but even then a reduce instead of a fold would have made
things more readable here (once you know and are familiar with this
syntax, it can be used very flexibly, and incidentally with my hand on
my heart, the above reads just fine to me and is very understandable -
it probably took me a couple of months to get comfortable with the
underlying concepts, but this is not tricky to read once you have that
familiarity).

On the other hand, an easy counter example is this:


Arrays.sort(list, new AlphabeticComparator());

...

class AlphabeticComparator implements Comparator {
  public int compare(Object o1, Object o2) {
    String s1 = (String) o1;
    String s2 = (String) o2;
    return s1.toLowerCase().compareTo(s2.toLowerCase());
  }
}


or doing it with anonymous inner classes:

Arrays.sort(list, new Comparator() {
  public int compare(Object o1, Object o2) {
    String s1 = (String) o1;
    String s2 = (String) o2;
    return s1.toLowerCase().compareTo(s2.toLowerCase());
  }
});

You need to try seeing this through the eyes of a room full of Java
virgins - as I did many times at Google working as an Android
Advocate. This is just a ton of noise that threatens to completely
obscure the intent of the code. Yes, often things like the casts can
be removed via generics, but then you have the generic syntax to layer
in on top of things as well, and this does little to increase the
signal to noise ratio. Yes, I should probably have @Override in there
too for Java 6, etc. etc.

Now take a look at the same thing in Scala:

val list = List("Hello", "very", "nice", "World")
list.sortWith((s1, s2) => (s1.toLowerCase < s2.toLowerCase))

and yes, you have an alternative here as well, you just need to
understand what you are doing, but the alternative is:

list.sortBy(_.toLowerCase)

which basically tells the sort command to use the lower cased form of
each of the items to sort by - a common case for a sort is to choose
an individual property of, or a function on, the item to determine
order, like in this case. I would argue that either of these two
examples is way easier to read than the Java versions. You even get
code completion in the IDE for the innards of the sort functions,
since Scala infers the typing all the way through.

The point is that there is plenty of scary stuff in Java - anonymous
inner classes being a superb example, and yet people hold it up as the
simpler choice. The truth is that a large part of that is simply
familiarity, or "better the devil you know".

Java's binary backwards compatibility has been it's own curse as well
as reward. We still have artifacts in the language that have pretty
much been accepted to be a bad idea, but 100% backwards compatibility
means that they will continue to be there, and new features will
experience the kind of combinatorial complexity explosion that keeps
new features that might make life better from being added to the
language. It's a double edged sword. If you really need the features
of an older version of the language, why not just use the older
version? With Scala, this is even de-coupled from the JVM, so you can
still benefit from JVM improvements while using an older version of
the language - Python has done very well with this model.

Finally, I would urge anyone complaining about the tooling to give
Scala 2.8 a try with some of the new IDE integrations. I have to say
that for me, NetBeans 6.9 squeaks slightly ahead in this arena than
the others, but they have all got much better with 2.8. There is still
room for improvement, but NetBeans even offers some refactoring
support now, has great code completion, syntax coloring that is far
more extensive and informative than that for Java code, and the
debugger works great. I would like to see code completion for named
parameters, but I suspect even that will come in time.

> 3. Functional approach
> I could never get warm with functional programming, Scala does not
> make a difference here.
>
> YMMV.
>
> > There are definitely features (like Higher-kinded types) that are pretty
> > complex but they can also offer incredible elegance and functionality
>
> I am also thinking about the younger people coming after me. One of
> the major problems I often hear is that it is difficult to find new
> developers (and we experienced as well). When I faced the last time
> apprentices getting into programming, I could not even believe that
> one needs to learn what a loop is. If you ask me what language I want
> them to use then I would never ever give them Scala, because it is
> completely overwhelming for them! Java still is, but much better IMHO!

The sort example above is a higher order function, both in Java and in
Scala. A higher order function is simply a function that takes and
defers to another function internally, as is the case with Sort (it
defers to the Comparator which tells sort how to compare two values
and tell which is larger or smaller). This leads to a much more
elegant solution for sorting, and many other uses. You don't
necessarily miss it until you have had it, but don't underestimate its
usefulness.

>
> > Tooling does *not* compensate for boilerplate
>
> I never ever read about the boilerplate issue before listening to the
> Java posse. Seriously!

I can't comment on this, other than to be a little surprised. I
figured most people have got tired of writing getters and setters,
equals, hashcode, anonymous inner classes, etc. by now. It's so much
faster and more fun when you don't have to.

>
> > C++ is also too Verbose
>
> ROTFL! You lost me here.
>
> > Yes, Scala has issues.
> > It may be less necessary, but Scala IDE support still needs to improve if
> > the language is to gain wider acceptance
>
> A major issue for me and...

It really is getting there - give Scala 2.8 and NetBeans 6.9 a go, or
the eclipse Scala IDE, or IDEA (but make sure it is Scala 2.8). Also,
take a look at the Scala 2.8 REPL (the interactive shell), which has
tab completion built in now as well - very useful for just trying
stuff out.

> Martin Wildamhttp://www.google.com/profiles/mwildam

Above all, keep learning. Scala is just one new thing to learn, and
not the only one, so if not that, give something else a go - but I
believe it will expose you to new ideas. Developers should keep
learning - it's a healthy sign.

Dick

-- 
You received this message because you are subscribed to the Google Groups "The 
Java Posse" group.
To post to this group, send email to javapo...@googlegroups.com.
To unsubscribe from this group, send email to 
javaposse+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/javaposse?hl=en.

Reply via email to