If you’re old enough to have been around back then, you might remember Java’s early, epic peak. It left the labs, and its hype meter pinned. Everyone saw it as a revolution that would stop at nothing less than a total takeover of computing. That prediction ended up being only partially correct. Today, Java dominates Android phones, enterprise computing, and some embedded worlds like Blu-ray disks.
For all its success, though, Java never established much traction on the desktop or in the browser. People touted the power of applets and Java-based tools, but gunk always glitched up these combinations. Servers became Java’s sweet spot.
Where Java wins: Rock-solid foundation
Java has its share of new features and options, but for the most part it is a stable platform. That makes life much easier for developers who are building something to last.
Where Node.js wins: Ubiquity
Where Java wins: Better IDEs
Java developers have Eclipse, NetBeans, or IntelliJ, three top-notch tools that are well-integrated with debuggers, decompilers, and servers. Each has years of development, dedicated users, and solid ecosystems filled with plug-ins.
Meanwhile, most Node.js developers type words into the command line and code into their favorite text editor. Yes, some of the best text editors like Atom have elaborate collections of plug-ins that do almost anything, but even then it feels like Node.js is more old school than Eclipse. Soon we’ll be replacing our mouse with an Atari joy stick.
Some developers use Eclipse or Visual Studio, both of which support Node.js. Of course, the surge of interest in Node.js means new tools are arriving, some of which, like IBM’s Node-RED offer intriguing approaches, but they’re still a long way from being as complete or as dominant as Eclipse or IntelliJ.
The weird thing is that the developers don’t seem to use these tools. The command line was supposed to disappear 35 years ago with the arrival of the Mac, but no one told the Node.js developers. The options are there. WebStorm, for instance, is a solid commercial tool from JetBrains that incorporates many command-line build tools.
Of course, if you’re looking for an IDE that edits and juggles code, the new tools that support Node.js are good enough. But if you ask your IDE to let you edit while you operate on the running source code like a heart surgeon slices open a chest, well, Java tools are much more powerful. It’s all there, and it’s all local.
Where Node.js wins: Database queries
Meanwhile, many Java developers use SQL. Even when they use the Java DB—formerly Derby, a database written in Java for Java developers—they write their queries in SQL. You would think they would simply call Java methods, but you’d be wrong. You have to write your database code in SQL, then let Derby parse the SQL. SQL is a nice language, but it’s completely different from Java, and many development teams need different people to write SQL and Java.
To make matters worse, many Java coders use elaborate libraries and schemes to convert the data from the SQL query into Java objects just so they can recast it into templates. It’s a crazy process, and ultimately pretty wasteful.
Where Java wins: Types
Many of the introductory programming courses continue to use Java because many serious programmers tend to like statically typed code both for the simplicity and the safety. The code just feels more rigorous after the compiler catches the obvious bugs.
Where Node.js wins: Syntactic flexibility
Where Java wins: Simple build process
Where Node.js wins: JSON
When databases spit out answers, Java goes to elaborate lengths to turn the results into Java objects. Developers will argue for hours about POJO mappings, Hibernate, and other tools. Configuring them can take hours or even days. Eventually, the Java code gets Java objects after all of the conversion. And when it comes to configuration, the Java world still clings to XML and even offers two major parsers to give developers more reasons to fret.
Where Java wins: Remote debugging
Java boasts incredible tools for monitoring clusters of machines. There are deep hooks into the JVM and elaborate profiling tools to help identify bottlenecks and failures. The Java enterprise stack runs some of the most sophisticated servers on the planet, and the companies that use those servers have demanded the very best in telemetry. All of these monitoring and debugging tools are quite mature and ready for you to deploy.
Where Node.js wins: Desktop
Where Java wins: Handhelds
Android apps are often written in Java and 90 percent of the new phones run some version of Android. Many people don’t even use desktops any more because the phones are good enough for everything.
Of course there is a bit of confusion. Many developers are writing Node.js web apps that target the mobile browsers on both the iPhone and the Androids. If this is done well, the performance is often good enough.
But Java is making inroads in another way. The newest Chromebooks will support Android apps, giving Java developers a path to the desktop of Chromebook users. Is there still a chance for Java to conquer the desktop?
Where Node.js wins: Libraries
There is a huge collection of libraries available in Java, and they offer some of the most serious work around. Text indexing tools like Lucene and computer vision toolkits like OpenCV are two examples of great open source projects that are ready to be the foundation of a serious project.
Where Java wins: Solid engineering
It’s a bit hard to quantify, but many of the complex packages for serious scientific work are written in Java because Java has strong mathematical foundations. Sun spent a long time sweating the details of the utility classes and it shows. There are BigIntegers, elaborate IO routines, and complex Date code with implementations of both Gregorian and Julian calendars.
null. Which is right? Well, each has its role—one of which is to drive programmers nuts trying to keep them straight. Issues about the weirder corners of the language rarely cause problems for simple form work, but they don’t feel like a good foundation for complex mathematical and type work.
Where Node.js wins: Speed
People love to praise the speed of Node.js. The data comes in and the answers come out like lightning. Node.js doesn’t mess around with setting up separate threads with all of the locking headaches. There’s no overhead to slow down anything. You write simple code and Node.js takes the right step as quickly as possible.
This praise comes with a caveat. Your Node.js code better be simple and it better work correctly. If it deadlocks, the entire server could lock up. Operating system developers have pulled their hair out creating safety nets that can withstand programming mistakes, but Node.js casts these nets aside.
And then there is the problem of code complexity as the programmers nest endless layers of callback functions like Russian dolls. One callback is easy to follow, but a chain of N callbacks can be mind-numbing. The good news is that the promise model is often easier to read. But you need to remember that many things could happen between the executions of the lines.
Where Java wins: Threads
Fast code is great, but it’s usually more important that the code be correct. Here is where Java’s extra features make sense.
Java’s web servers are multi-threaded. Creating multiple threads may take time and memory, but it pays off. If one thread deadlocks, the others continue. If one thread requires longer computation, the other threads aren’t starved for attention (usually). Most important of all, you—or really your code—is in charge and open to adjustment. Any problems aren’t lost waiting for some call back that never comes like an unrequited Tinder swipe.
If one Node.js request runs too slowly, everything slows down. There’s only one thread in Node.js, and it will get to your event when it’s good and ready. It may look superfast, but underneath it uses the same architecture as a one-window post office in the week before Christmas.
There have been decades of work devoted to building smart operating systems that can juggle many different processes at the same time. Why go back in time to the ’60s when computers could handle only one thread? Yes, dealing with the threads means more work, but you’re tough, right? Sometimes you need to write character-building code to get something that’s great.
Where Node.js wins: Momentum
Yes, all of our grandparents’ lessons about thrift are true. Waste not; want not. It can be painful to watch Silicon Valley’s foolish devotion to the “new” and “disruptive,” but sometimes cleaning out the cruft makes the most sense. Yes, Java can keep up, but there is old code everywhere. Sure, Java has new IO routines, but it also has old IO routines. Plenty of
util classes can get in the way.
Node.js is now old enough to have its own cruft larding up the Git repositories, but much of it is decades newer than the Java. The Node.js developers are churning out endless enhancements to web stack software. The energy is still there.
Where both win: Cross-compiling between Java and Node.js
Voilà. All of the code can link to each other harmoniously and you don’t need to choose.