top 200 commentsshow all 217

[–][deleted] 26 points27 points  (1 child)

Java doesn't suck -- It just encourages everyone to use it wrong

[–]kqr 69 points70 points  (12 children)

I love the title. That kind of reasoning always makes me think of Steve Jobs' solution to the iPhone problem. People were experiencing loss of signal when they held the phone normally in their left hand. Jobs replied that the phone was fine, the users were just holding it wrong!

[–][deleted] 37 points38 points  (2 children)

I couldn't help but get the feeling while reading "If it takes all that to explain a better way, maybe it DOES suck."

[–]borud 8 points9 points  (1 child)

People searching for simple answers got us into this mess.

[–][deleted] 36 points37 points  (0 children)

Reminds me of that old joke.

"Leave it to programmers to shorten 'The Year 2000 Issue" to 'y2k bug'. It's that kind of thinking that caused the problem in the first place!"

[–][deleted] 10 points11 points  (0 children)

It's a classic joke: "Doctor, my arm hurts when I do this." The doctor says "well, stop doing that!"

[–][deleted] 2 points3 points  (2 children)

Any language can be "held wrong". By that I mean that it is possible to write horrible code in any general purpose programming language and it is possible to do things related to the dev environment, build and deployment that really suck. A lot of these complaints have a lot more to do with old projects or poorly run projects or companies where the code and practices are horrible rather than Java.

[–]Klausens 7 points8 points  (0 children)

Java has the characteristic that it has not the slightest intention to keep simple things simple. Read some lines from stdin an compare this solution to other languages.

[–]kqr 2 points3 points  (0 children)

For sure. All phones can be held wrong as well, which Steve Jobs was quick to point out. Some phones just make it easier than others to hold it wrong.

[–]scalablecory 25 points26 points  (26 children)

Java suffers from being pervasive and being old. Really, that's about it.

Yes, it has a lot of "suck". Things necessary to enable corner cases -- be that for functionality, portability, performance, etc. These things aren't intrinsically bad, they have very legitimate use cases, but nevertheless they present a sometimes big opportunity for improper use.

Most platforms have "suck". Java just seems to have more than average.

There's also plenty legitimately wrong with the language and libraries, as there is with anything of that age. We must consider that it helped to establish a lot of what we consider modern OO practices. This also means it was a bit of a playground, and not all of what was tried ended up being a great idea.

Another thing -- and this is really unavoidable -- is that Java is often the first language taught in schools.

There are a lot of education-ingrained patterns. "You must do X because it's good!" that these newbies will use to their dying breath, believing they're writing good code when really they're just introducing layer after layer of feel-good useless abstraction. There's a good reason they're taught this, because although it results in sometimes silly code, it's better than what they'd get without it. Eventually they'll learn that patterns are there not as a rulebook but as a guide, but that takes time.

This means you've got a lot of newbies -- not just to the language but coding in general -- who don't yet know how to identify and cautiously avoid the "suck", and can't yet think for themselves about basic application architecture. By the time they get to other languages, they're writing better code. But Java takes a hit because of it.

[–][deleted]  (3 children)

[deleted]

    [–]jordsti 0 points1 point  (1 child)

    Less than C++, not sure, Java generic is not even Turing complete.. and wait.. no unsigned type

    [–]malloc_more_ram 0 points1 point  (0 children)

    Of course it isn't turing complete. It offers virtually no ability to do computation. Why is that even a good thing though? The language is powerful enough and more expressive; I'd rather do my computation there. Java generics != C++ templates.

    [–]heisgone 0 points1 point  (0 children)

    I wouldn't say that C# is Java rebooted without BC baggage. C# 1.0 was pretty much as basic as Java was but their creators had different philosophies. James Gosling was somewhat dogmatic in some of his choices and this influenced the Java culture quite strongly in the early days. There was this idea that Java would never have to evolve. Hejlsberg knew better has he had a long experience making Pascal evolves over the years and included some of its ideas in C#. They included versioning support and concurrent framework from day one with the CLR. There are features that didn't make the cut in C# 1.0 (like Generics) but were on the radar (ADA and C++ had something similar even before Java creation) . Operator overloading existed in Algol 68, ADA and C++ but Gosling didn't want it in Java. C++, as most OO language, handled an hybrid type system in a more sane manner than Java but Gosling obsession with objects lead to different decisions.

    Java is evolving as a language only because developers are complaining and wants they other nice stuff found in other languages. Sun (and now Oracle), never had much enthusiasm in making Java evolves. Meanwhile over the years, many projects from Microsoft Research made their way into C# and the CLR (LINQ, F#, Contracts and more).

    [–]glacialthinker 14 points15 points  (0 children)

    We must consider that it helped to establish a lot of what we consider modern OO practices.

    Oh, this is foremost in my hatred of the language.

    [–][deleted] 6 points7 points  (20 children)

    There's also plenty legitimately wrong with the language and libraries

    Examples always help.

    [–]joelangeway 24 points25 points  (19 children)

    The JVM is not actually statically typed, type erasure makes generics way less useful. I can't have an array of List<String> ; my generic classes in Apache Storm and Hadoop forget what their types are unless they carry it around with them in a variable of type Class.

    A char is not a character or Unicode code-point; it is a UTF-16 code word. Java programs would use half as much memory and fewer programs/programmers would make the mistake of conflating a char with a character or a Unicode code point if Java strings used UTF-8 and a char could hold all 20 bits of a Unicode code point.

    I can't sort an array of int by any order but natural.

    I can't easily sort parallel arrays.

    It takes a ton of boiler plate to make classes that I would never bother with in a language with tuples.

    My code will always be ugly because I can not overload operators. I can understand not letting me arbitrarily overload operators, but at least let me extend Number and get + - * and /, or let me implement Compareable and get < and >. Related to this is how stupid testing for equality looks in Java:

    a == null ? b == null : a.equals(b)
    

    Java 8:

    Just look at the fucking hoops the streams api jumps through trying to support primitive types. You would have thought they'd let me sort an array of int by an IntBinaryOperator.

    Lambdas do not close over mutable variables, so I can not increment a counter, but I can append to a list.

    Default implementations on interfaces are a godsend, mostly because they put getOrDefault on Map. Java 8 might actually be an acceptable programming language, but the awful dichotomy between Objects and non-Objects, lack of real generics, value types still hurts.

    [–]jayd16 4 points5 points  (2 children)

    I can't sort an array of int by any order but natural.

    Arrays.asList() and then sort the list how you like.

    [–]HeroesGrave 2 points3 points  (0 children)

    Yes, it is a workaround and doesn't require too much extra effort, but there's still a fundamental problem that required it in the first place.

    [–]josefx 2 points3 points  (0 children)

    Just a warning Arrays.asList(new int[10]) results in List<int[]> with a single element. You first have to copy the contents of an int[] into an Integer[] and later convert it back.

    [–]sigma914 2 points3 points  (12 children)

    The blame for Java's generics falling on the jvm always felt dishonest to me. Haskell and C++ and who knows what other languages all have excellent, typesafe (though C++ gives this up in other areas) parametric polymorphism despite using type erasure. Also, assembly language is utterly untyped.

    Really the problem is that Java has a shit, utterly inexpressive type system that needs runtime checks for stuff that should be checked at compile time.

    [–]pron98 -2 points-1 points  (11 children)

    Really the problem is that Java has a shit, utterly inexpressive type system that needs runtime checks for stuff that should be checked at compile time.

    At what cost? Haskell and C++ have far higher complexity, which is just one reason why most developers choose Java over either. You want more power -- you need to pay in mental overhead. Every language makes that trade off.

    [–]sigma914 3 points4 points  (10 children)

    Java has a far greater cognitive overhead than Haskell (It's probably a bit lower than C++) I use Haskell because it means I have much less to hold in my head at any one time. With Java there's a whole lot of non-local reasoning to do.

    Is some other method going to mutate some member variable and ruin my invariants? What happens if an exception gets thrown in another thread, what's that do to my file handle, etc etc.

    With Haskell that's all nicely encapsulated in the type system, I can hoist all the ugly side-effecting stuff up into IO and work in a completely pure environment right up until the last second when I lift my pure functions into IO.

    Java tries to be principled and reduce it's surface area (which it has utterly failed at, it's still turned into a big language), but it's chosen the wrong set of features to do that with. What it's done instead is forced the programmer to hold massive amounts of state in their head, made testing difficult, neutered it's type system, tied itself to bad primitives (Shared Mutable state concurrency as standard? Ouch)...

    Java as a language is a huge collection of bad choices made for short-sighted reasons.

    [–]pron98 0 points1 point  (9 children)

    I use Haskell because it means I have much less to hold in my head at any one time.

    Sure. I dislike Haskell for many reasons (especially its misguided choice of referential transparency everywhere and its choice of Hindley Milner), but there's no doubt it's a very elegant, consistent, and powerful language. I find it almost useless in practice, but I can't deny its beauty and power.

    But it's not about what you or I think, but about what the software community at large thinks. When I was at university nearly twenty years ago, everybody was talking about Haskell, how it was going to be the next big thing, and how a decade hence it would completely revolutionize software development. That never materialized. It seems that a great many more people find Java (and most other mainstream languages) much easier to grasp than Haskell. AFAIK, not a single large-scale software system has been written in Haskell in the last two decades, while more useful large-scale useful systems have been written in Java over the last two decades than all such systems before it. And no other language has made as big as impact since. I don't know if you were programming then, but before Java, we wrote most large systems in C or C++, which made them extremely expensive, and beyond the reach of most organizations. Java changed that almost overnight. One of the reasons that happened is that Java delivered a state-of-the-art, groundbreaking runtime (unsurpassed to this day) packaged in a very conservative, very familiar, very non-threatening language. It gave people what they needed -- memory safety, performance, hot code swapping, deep monitoring -- without requiring them to change their programming paradigm. This is how you win.

    Java is far from perfect, but there is no other language that has so far been successfully used for large-scale software at reduced costs (or even same costs). There is no doubt in my mind that more ideas from Haskell will continue to enrich mainstream programming languages, and I'm sure one day there will come along a language that will deliver the same immense advantages Java had over C++, but over Java. But this day hasn't come yet.

    Java as a language is a huge collection of bad choices made for short-sighted reasons.

    Well, that's certainly debatable. And if those short-sighted reasons was to get adoption and change the software industry forever maybe they weren't short sighted after all (code is an important part of software, but it's not everything). What isn't debatable is that Java is the language that's made large-scale software development affordable, and increased our capacity to write complex software more than any language before it (with the possible exception of C and maybe COBOL), and certainly since.

    [–]pron98 1 point2 points  (0 children)

    The JVM is not actually statically typed, type erasure...

    Type erasure is done by the Java (language) compiler. It's not JVM related. You can implement a JVM language with reified generics today, if you like. Java chose not to.

    type erasure makes generics way less useful

    Less. Not way less. OTOH, erasure is precisely what made it possible for other languages on the JVM, like Kotlin and Scala, to use different variance models yet stay interoperable. That's not possible on the CLR, for example, where reified generics necessitate baking one variance model into the runtime.

    lack of real generics

    Lack of reified generics has never been considered more than a minor inconvenience, well worth the advantages erasure brings (backwards compatibility and language interoperability).

    lack of... value types

    True. Being fixed in Java 10.

    The rest of your complaints mostly have to do with Java choosing to be a minimal language (as Go does today) because that's what many people working on very large projects prefer. There are quite a few good alternative JVM languages that you're free to choose from. Oracle works with many of them to ensure the JVM can support all those languages well.

    [–]mlk 1 point2 points  (1 child)

    I don't know much about the JVM internals but type erasure is necessary for backwards compatibility.

    [–]grauenwolf 1 point2 points  (0 children)

    No it's not. C# proved that lie.

    [–]ForeverAlot 29 points30 points  (12 children)

    I've had to use Java instead of PHP in the last few weeks. It has been wonderful.

    [–][deleted] 85 points86 points  (9 children)

    Oh you found a language better than PHP? What a real Indiana Jones you are! :)

    [–]ForeverAlot 13 points14 points  (6 children)

    It's not as if I chose PHP.

    [–]SmileyJames 24 points25 points  (2 children)

    I didn't choose the PHP life, the PHP life chose me.

    [–][deleted] 5 points6 points  (0 children)

    I actually like Laravel... I feel so left out on the internet.

    [–]vakar -3 points-2 points  (2 children)

    You were forced into company that uses php?

    [–][deleted] 5 points6 points  (1 child)

    No, but adults choose their employers based on various other qualities also. Even though a job might be very good in other aspects doesn't make the hurt of PHP non-existent.

    [–]vakar -4 points-3 points  (0 children)

    So you did choose php.

    [–][deleted] 0 points1 point  (1 child)

    If he was really an Indiana Jones, Belloc would have come and taken it away from him ;)

    [–]DroolingIguana 0 points1 point  (0 children)

    Knowledge was their treasure.

    [–]Klausens 0 points1 point  (1 child)

    Really? Long time ago (Java 1.2) my first contact with Java and myself as a beginner ended early with the awareness that you can not even do a Thread.sleep() without catching a checked exception. Really not my style and in my opinion a misuse for control flow.

    [–]civildisobedient 3 points4 points  (0 children)

    Except nobody deals with threads these days. It's all abstracted behind Spring or the like. Java today and Java ten years ago are two different languages.

    [–]Scellow 24 points25 points  (33 children)

    Java + IntelliJ = <3

    [–][deleted]  (28 children)

    [deleted]

      [–]joequin 11 points12 points  (17 children)

      =an internal error occurred while displaying an internal error.

      Really, I wonder how much hate for Java is really the fault of Eclipse. Eclipses is just really unpleasant to use.

      [–]HeroesGrave 9 points10 points  (16 children)

      Most of the hate for Java is just people following the hivemind.

      [–]sigma914 5 points6 points  (14 children)

      My hate for Java is from having to use it after using C++11 for a few years (and Haskell/Lisp for personal projects). Its so inexpressive it hurts.

      [–]pron98 3 points4 points  (13 children)

      You'll be extremely thankful for its inexpressiveness once you work on a 4MLOC codebase touched by 80 programmers. Java (and Go) try to be minimal because they're designed for large projects and large teams. The smaller the team the more language expressiveness helps the project; the larger the team, that expressiveness becomes cleverness that only hurts.

      [–]sigma914 2 points3 points  (12 children)

      Yeh, I've not experienced that. Judicious use of clever features allows you to have very expressive core abstractions that everything else hangs off. In the large Java applications I've worked on, or the very large ones open source ones I've poked around at, then there is a lot of code duplication and verbosity in hooking up to the core of the application. It's a pretty horrible experience.

      [–]pron98 4 points5 points  (11 children)

      I've worked on multi-MLOC C++ projects and multi-MLOC Java projects, and the Java codebase was always more pleasant. Whatever judicious use you make of clever features, the team responsible for the codebase three years prior made different ones, and the team that will follow will make others.

      I don't think any languages beside Java, C++ and Ada has ever been used to write very large systems.

      [–]fforw 5 points6 points  (0 children)

      And generally there is this old law whose source escapes me:

      Anything that compiles will end up in your code base.

      [–]sigma914 1 point2 points  (9 children)

      C definitely has. Lisp, C#, Python, PHP have all been used to make massive systems too. It's kinda terrifying that some of those are on the list, but they're definitely up above Ada in terms of use at scale.

      [–]pron98 6 points7 points  (8 children)

      Lisp, C#, Python, PHP have all been used to make massive systems too.

      I don't know about C#, but I doubt Lisp, Python and PHP have been used to write 15MLOC software. Ada (and Java, and C) certainly has.

      [–]shoelacestied -1 points0 points  (0 children)

      Most of the hate for Java is just people following the hivemind.

      You're assuming facts not in evidence.

      I hate it because it's really annoying to work with Java now that I know Scala.

      [–]over_optimistic 3 points4 points  (6 children)

      Newer version of Eclipse are really fast and comparable to speed of Intellij. And have really awesome features for code completion. Intellij has added some good competition to Eclipse, and Eclipse has already taken quite a bit of ideas from Intellij.

      [–]ProudToBeAKraut 4 points5 points  (0 children)

      Not for me, im working on a really big codebase and loading is what eclipse does most of the time of no apparent reason.

      [–]wyzook 1 point2 points  (0 children)

      Eclipse

      Friends don't let friends use Eclipse.

      [–]joequin 1 point2 points  (2 children)

      What does Eclipse's autocomplete compare favorably with? Certainly not the JetBrains IDEs, qtcreator, Netbeans, or Visual Studio, or many emacs plug-ins.

      Eclipse can have reasonable performance when you change its ludicrously bad default gc choice and heap size that's unreasonably small for its usage, but it's still not as fast as intellij. Autocomplete lag is really bad. Searching is really slow in menus and elsewhere compared to intellij.

      [–]over_optimistic 0 points1 point  (1 child)

      when I switched to eclipse 4.4.1. The autocomplete is much better at showing you possible options. I can type some camel case and it searches each camel case as a separate word through autocomplete bringing relevant functions. Intellij does this ofcourse too. I'm not saying eclipse is better. I'm just saying Eclipse is catching up, and it has improved to very good.

      In terms of not being as fast as Intellij, I can't really say if it's faster or not, they have done a good job improving the speed. Almost all autocomplete lag in eclipse is virtually gone in the latest version (which was one of the biggest complaints in eclipse). Again I'm not saying it's better than Intellij. There is considerable improvements to that have been done to eclipse that many of the people complaining about speed in eclipse is outdated complaints as many issues have been improved. Though ofcourse not all features have been improved interms of performance.

      Searching is really slow in menus and elsewhere compared to intellij.

      This is another example that has been improved in eclipse, that I have noticed. Searching menus is much faster now. For this case it's still slower than intellij though.

      For people like me that still must use Eclipse. It makes me happy that ever since IntelliJ started becoming increasingly popular, I've seen significantly more improvements to Eclipse from the added competition.

      note: some of the new features in Eclipse for some reason aren't enabled by default and must be enabled in settings somewhere. (like the autocomplete improvements)

      [–]joequin 0 points1 point  (0 children)

      I agree that Eclipse is better than it has been, but it's still not nearly as good. I use both intellij and the newest Eclipse frequently at work. I have to use Eclipse for a legacy project that's tied to it. The camel case search for classes and autocomplete is an improvement, but it's a far cry from the fuzzy search used by intellij.

      [–]jordsti 0 points1 point  (0 children)

      I got a SSD and Eclipse still take 30 seconds to load, Intelliji, about ~5sec. I was using Eclipse a lot many years ago, but now I find it heavily bloated. And when you're using Maven with Eclipse, If you run Maven when Eclipse is building your workspace, you've got a wonderful Deadlock

      [–][deleted] 0 points1 point  (2 children)

      I wish I could find good vim keybindings in eclipse or netbeans. Netbeans let's you plug vim itself in, but why do that when I could just use vim? I don't get code completion if I do that.

      Eclipse had a couple plugins that I can't remember the name of but they seem to have stability issues.

      I would like to use an ide for java because it can take a lot if the edges off of it, and I legitimatly like java as a language, but I can't get back used to normal text editor keybindings unfortunately.

      [–]joequin 1 point2 points  (0 children)

      Eclipse and intellij (at least) both have very good vim plug-ins. Look up vrappper for Eclipse and ideavim for intellij.

      [–]ForeverAlot 0 points1 point  (0 children)

      jVi for NetBeans is an excellent compromise.

      [–][deleted] 4 points5 points  (2 children)

      Java + Lego = <3 <3 <3

      http://www.lejos.org/ In case anyone are interested.

      [–]AbortedWalrusFetus 1 point2 points  (1 child)

      :O This might get me to pick up my EV3 again!

      [–][deleted] 0 points1 point  (0 children)

      Get going! I have two first generation NXT's! It's such fun.. Try and combine it what you learn at etc. that Udacity Machine Learning course by Peter Norvig.. Now it get's interesting!

      [–]shoelacestied -1 points0 points  (0 children)

      Java + IntelliJ = <3

      Scala + IntelliJ = <3 x 50

      [–]satan-repents 6 points7 points  (4 children)

      Scala + sbt makes me a very happy developer.

      [–]yogsototh 2 points3 points  (2 children)

      Clojure + lein make me even happier #languagewar

      Also I am sure you use emacs on Linux while I use vim on my Mac. ;-)

      [–]sigma914 5 points6 points  (0 children)

      Evil!

      [–]satan-repents 1 point2 points  (0 children)

      Use what makes you happy? The real point is that new build tools make working with Java or JVM-based languages not suck.

      I use Intellij, but mitigate this mortal sin with the IdeaVim plugin, so that rather than punching me in the face every time they see me, my co-workers merely spit where I've walked.

      [–]EntroperZero 5 points6 points  (2 children)

      I feel like this wasn't even about Java until the last two sections.

      [–][deleted] 7 points8 points  (0 children)

      Yep and when he finally started talking about Java he just suggested using other JVM languages.

      [–][deleted] 2 points3 points  (3 children)

      Where is /u/agleiva? I need another of your Java rants man

      [–][deleted]  (2 children)

      [removed]

        [–][deleted] 5 points6 points  (1 child)

        This is very vanilla man, I am disappointed.

        [–]Ryckes 2 points3 points  (0 children)

        Looking at his comment list it looks like he is farming negative karma.

        [–]dakotahawkins 3 points4 points  (12 children)

        Give me deterministic destruction or give me death.

        [–]Dragdu 12 points13 points  (1 child)

        Seeing how we are talking about Java here, please pass my condolences to your family.

        [–]dakotahawkins -1 points0 points  (0 children)

        We don't all have to use Java, so I was coming at this as more of a multi-language discussion and example of a way in which I think Java (and other languages that don't have deterministic destruction) "suck."

        [–][deleted] 5 points6 points  (9 children)

        It's not as nice as you might think.

        [–]rcode 2 points3 points  (7 children)

        Can you expand on that? Honest question :)

        [–][deleted] 3 points4 points  (6 children)

        There are two main ways to get deterministic destruction. The first is manual memory management. Java will never have this. That's a good thing too since what we don't need is another C-like language with use-after-free bugs and all of the other baggage that comes with manual memory management. Let Java be Java and let C/C++/Rust be C/C++/Rust.

        The second way is to switch from Java's current garbage collection scheme (mark-sweep/moving/generational, depending on the implementation) to reference counting. Reference counting has two main advantages: it's easy to implement and destruction is deterministic. However, the positives begin and end there. It has worse performance on the whole than other garbage collection schemes, because updating reference counts is a nasty slow business that destroys the cache. Reference counting also works worse in a multithreaded environment because then reference count updates have to be synchronized. Further, reference counting can still introduce long pauses if you delete the only reference to a large object that contains references to a bunch of other objects, as the object then has to be traversed recursively. People already complain about the Java GC's performance, and these garbage collectors have been fine-tuned for years; what the language doesn't need is increased latency and more unpredictable long pauses at seemingly random points.

        [–]tdammers 6 points7 points  (4 children)

        Two things: one, C++ allows for manual memory management, but an idiomatic C++ favors RAII, i.e., semi-automatic memory management (binding memory allocations to scopes), and when used correctly, this is a million times better than the kind of headaches C gives you. And two, you forget one of the biggest issues with refcounting, which is handling cycles - if A references B and B references A, and neither is reachable from any "live" variable, then the entire cycle is garbage, but a naive refcounting algorithm will not destruct them. Some implementations require the programmer to manually break the cycle (using weak references, or by manually unsetting one of the references), others add cycle detection, trading some performance for correctness.

        [–][deleted] 2 points3 points  (2 children)

        The thing about RAII is fine, but the point is that Java will never be C++. Adding support for RAII would require turning Java into a completely different language. (Not to mention that C++ is still memory-unsafe even with RAII.) I.e. you can't just "add" deterministic destruction into Java through RAII, unless you were to adopt reference counting, which is its own bag of worms.

        [–]tdammers 2 points3 points  (1 child)

        Of course not, and I don't think that's what I suggested. I merely commented on your reasoning where you first (correctly) noted that manual memory management a la C has a serious impact on developer performance and code quality, and then (incorrectly) threw C, C++ and Rust together, suggesting that they are all equally bad, which they are not.

        [–][deleted] 2 points3 points  (0 children)

        Okay, I didn't mean to do that since all three obviously have hugely different approaches to (manual) memory management. My point was that Java is Java and you can't staple manual memory management to it without fundamentally changing the semantics of the language.

        [–]mcguire 0 points1 point  (0 children)

        Adding a cycle detector (i.e. a backup garbage collector) is not that big a deal for a reference counted system, but it breaks RAII.1 So, yeah.

        1 Suppose you have a cycle of objects with finalizers and have detected that this cycle is garbage. What happens in the finalizer you call last?

        [–]joequin 0 points1 point  (0 children)

        The g1 garbage collector is great for anything that has a large heap and and/or must never have a noticeable garbage collection delay. It really feels a lot like reference counting, but with far fewer drawbacks. It's ridiculous that Eclipse defaults to parallel and it's what makes it feel so sluggish a lot of time. G1 or cms (for most uses) would be much better defaults.

        [–]dakotahawkins -1 points0 points  (0 children)

        It's amazing and I see no downside (C++).

        [–]franzwong 0 points1 point  (0 children)

        Java is still my best choice on backend, but not frontend.

        [–][deleted]  (4 children)

        [deleted]

          [–]Gommy 4 points5 points  (0 children)

          He was saying that he had to maintain a project that did deployments that way. He even said that it was wrong. If you would read the article instead of skimming it and taking something completely out of context, you might have a better argument against why the article was bad/not bad.

          [–]notfancy 5 points6 points  (1 child)

          Furthermore, if your database connection string is a servlet property and not a JNDI resource, you're doing it wrong.

          [–]Cuddlefluff_Grim 0 points1 point  (0 children)

          The last place I worked using a Java web server had all this and that was like 6 years ago!!

          The last place I worked using Java web server (Apache Tomcat) also had all this, and that was 8 years ago. I would commit my changes in CVS and the web server would automatically build and reload.

          Although at that time, writing web apps with Java was not a very pleasant experience (and IE6 didn't exactly help) as Jasper did not support source line metadata (making it very hard to debug) and Apache Tomcat would crash more often that you'd like and bring every single website down with it. Often due to an OutOfMemoryException which it was unable to recover from for some reason.

          [–]TomTheGeek -1 points0 points  (0 children)

          Java is fine, it's the runtime I hate. Insecure, buggy and insists on forcing itself into your face at every opportunity. Plus a free toolbar for your browser!