If Java Wasn't Cool 10 Years Ago, What About Now?
10 years ago today on this site, readers answered the question "Why is Java considered un-cool?" 10 years later, Java might not be hip, but it's certainly stuck around. (For slightly more than 10 years, it's been the basis of the Advanced Placement test for computer science, too, which means that lots of American students are exposed to Java as their first formally taught language.) And for most of that time, it's been (almost entirely) Free, open source software, despite some grumbling from Oracle. How do you see Java in 2014? Are the pessimists right?
Java is moving into archaic irrelevance faster than ever. That is, the language itself.
The JVM, however, is now more useful and relevant than it ever was. It used to be naught but an implementation detail. Now, rather, it's central to an entire ecosystem of languages that will inevitably send Java the way of C: used only when the greatest speed is necessary.
Scala is basically a next-generation Java. Java with functional programming, or really, vice versa. JRuby make Ruby actually scalable, given the presence of native threads and interoperability with existing enterprise libraries that commonly only ship in the form of Java or C# libraries. Clojure enables LISPers of yore and Schemers of new import explore functional programming as it used to be, without having to drop the wealth of Java libraries available. Ceylon, Groovy, Jython, and dozen of others are paving a way to give the JVM much more to do after Java becomes obsolete.
Java will never die - it'll just become like COBOL, Fortran, and C before it: used in enterprise software, operating systems, and outdated educational assessments.
Colin Dean Go a year without DRM
It was just coming into favour when I left. When I was around it was Modula-2 and Eiffel (for OOP) at University. I have always found Java to be absolutely horrific in practice, being pretty much the worst of all worlds. Today C# is far superior, whatever you think about Microsoft, and it's a real shame that .NET was mishandled at birth in the way that it was.
You only need to learn one oo procedure based language. All others are just a book exercise.
One assembly language and how compilers translate stuff.
And then you should also learn scheme.
That will handle basically everything, reducing it to a book learning experiment.
There almost needs to be two separate considerations. From a language standpoint Java is a bit middle of the road. It has some well known pain factors, but more or less it's one of the easier OO languages to master. It's used in a lot of high profile web site.
The VM on the other hand does a lot of interesting things under the covers that make the language quite fast. When JRuby hit the scene it was faster than the core ruby project at quite a few things because the VM was doing all sorts of optimizations behind the scenes. Also, because the Java OP code is so stable with relatively few changes per major release you have a bit of a boom in languages you can run inside the Java VM. You get all the benefits of the R&D Sun and Oracle put into JIT, while retaining the ability to do interesting and contemporary things with your language.
Clojure, Groovy, Scala, Python being the primary languages with another 16 that can compile to Java Op code.
Were Java fails mostly is as a client application, running with some sort of Windows GUI. Sure, you can do it, but it realistically people who do Java Swing apps are writing some sort of thick client that could almost always could run inside a contemporary browser without any plugins.
COBOL was never cool, either, but is still in use in enterprises.
For learning the craft, they should use what's best to teach it, not necessarily what's relevant at the time (unless it's a job school).
It's a compromise language. Compromises are, in fact, a good thing but purists hate them. Of course. That's what purism *is*. But really, who cares if it's cool? We're geeks, I thought we were supposed to be opposed to "cool" anyway?
It's a known quantity and before you dismiss it you should consider the truly vast amount of software that's been successfully implemented in Java.
Personally I like it. It has it's niggles (if I were king I'd change oh so many things) but it keeps on succeeding like most good compromises.
--- These are not words: wierd, genious, rediculous
What good engineer gives a f**k about what language "cool", aside from considering his/her ability to hire hipsters to staff the project?
If you're worried about the "coolness" of a language when doing your day job, you're almost certainly doing your job poorly.
The alternative view is that it is fast enough to do the things that need to be fast and cleaner than all those scripting languages.
Here's the thing. Java applications are VERY EFFICIENT. It may be difficult (not impossible but a pain in the ass) to write Java code which performs a specific task in a deterministic period of time. In other words it is not really a real-time sort of thing. OTOH if you want a perform a large number of operations with maximum overall throughput and a fairly stable task completion time then you cannot beat Java. You could do it in C/C++, but you'll spend a lot more time and effort to get the same results. 10 years I coded large high capacity high speed feed handlers in Java and people said I was crazy, but that application continues to exist and outperform anything that tries to rival it while being highly portable, scalable, and superbly reliable.
The thing with scripting languages is they are for small projects. Sure, its MUCH easier to whip out a perl script or something to do a small job. Its faster at run-time as well, but as soon as that task grows to somewhere in the 5-20k lines of code range you simply cannot do it using a scripting language anymore and stay sane. Inconsistencies creep in, problems pile up, the code starts to have to be used and understood by many people, and its just not possible to maintain the level of determinism required of a large code base. At this point you NEED something like Java.
And yes, C# is a perfectly nice language, but it is only really usable on Windows in any consistent fashion. I see no reason to be limited to that platform. Most of my customers are perfectly comfortable with *nix systems and for high reliability high capacity line-of-business applications no version of windows holds a candle to RHEL and isn't even on the same planet with Solaris.
"Malo periculosam, libertatem quam quietam servitutem." -- Jefferson
One of the main reasons Java may be "cooler" today than when it was first introduced is performance.
In the early days of Java, it's VM architecture meant that it was significantly behind fully compiled languages like C/C++ in terms of performance. People were supposed to sacrifice speed for portability. Even for non-speed critical applications, slower languages were thought to be "less cool". Real men used C, and real, real men still coded in assembly language.
But the VM technology in Java has gotten so sophisticated that it isn't significantly behind languages like C/C++ in terms of performance, and that can't be ignored. This is allowing some of the advantages of Java over C/C++ such as garbage collection, dynamic class loading, a certain degree of reflection, various safety systems, etc., to win over some programmers. Java may well be cooler today than it was 10 years ago, because it's really grown up and become a fairly useful language.
If I can be modded down for being a troll, can I be modded up for being an orc, or a balrog?
I wouldn't state that C# is superior to Java from a language perspective, both are essentially derived from Ada and C with influences from C++.
If Ada had been more open and better promoted then it would have been a far better choice.
If builders built buildings the way programmers wrote programs, then the first woodpecker would destroy civilization.
What's relevant for learning to program might not correspond to what's currently being used.
Teach a man code a a language, and he's relevant to a small market. Teach a man to program, and he owns them all.
I really wish the academic world would go back to the actual proper learning languages, such as PASCAL. In my university, the introductory course for programming is C++ (as a freshman.) C++ has little 'English logic.' However, if you know English, you should be able to read PASCAL code much better than C/Java code. PASCAL is closer to pseudocode, which is (usually) the first assignment in these classes. Why would you jump from pseudocode to a 'stricter language' like Java? What does /. think?
If speed is absolutely critical, you're going to go with C/C++/ASM/whatever native-compiled-language works well for your problem.
If speed is not absolutely critical, there's plenty of "scripting" languages that get the job done more easily with less code.
Yeah, this is how most 2+-sigma programmers on the right side of the standard distribution of programmers approach problems.
All the rest (the vast majority) need languages with good error messages, good error landing, decent garbage collection, a lack of value/reference handling, etc., and frankly being more procedural than functional is an asset to a below-average programmer.
Code density is not the criterion most mid-level enterprise IT managers need to deal with. Even with a complex project and a team, you can take one guy and have him write the JNI bits in C++ for performance (BTDTGTTS) while the rest of the team handles other parts and they don't have to know as much. It's actually really bad economics to have all top-notch programmers on your team if your project does not require that.
And before all you kids who got trophies for losing a soccer game get into a snit - by mathematical definition, half of all programmers are below-average.
And Java works pretty well for them, and there are stable and scalable deployment platforms for their code. Expect the "cool kids" to be wondering about Java in 2024 - even if there were a better replacement available today (there isn't), the extant code bases would not get replaced in one decade.
My God, it's Full of Source!
OUTSIDE_IP=$(dig +short my.ip @outsideip.net)
I'm in the process of hiring software engineers right now, so I've been exposed to a lot of resumes and had the opportunity to talk to a lot of people on the phone (standard phone screen). Invariably, all recent CS graduates list C on their resume as one of their languages. One of the things I ask every candidate to do on the phone is to describe how C strings work. This is my "marker", the test of how much time they've spent in C (vs Java, or ObjC, or whatever). If you're a serious C programmer, you know how C strings work. No exceptions. If you've spent your entire time in college (or even professionally) programming within an environment where strings are handled by object abstraction, you've probably never had to deal with C strings directly. A suitable answer to the question is as simple as "A C string is an array of chars with a null termination at the end".
You'd be surprised at how many people fail the screening process (and thus are rejected) based on this single question. Probably close to 75%, and every single one of them has a CS degree.
People who say "sheeple" have about as much sophistication as an AOL user, and in fact are probably actually AOL users.
"But the VM technology in Java has gotten so sophisticated it isn't significantly behind languages like C/C++ in terms of performance, and that can't be ignored." I highly disagree. First, For every level of abstract sophistication you add, you may increase the 'agility' of the language, however you are still farther away from raw machine code. Java is notorious for stacking crap on top of crap on top of crap. Second, Java is far behind in performance. Any true huge performance gains are usually done with the aid of a third-party library, coded in C/C++. Java still can't do integer math anywhere near the speed of C. Java WILL NEVER be as fast as C/C++, because C/C++ isn't run as interpreted bytecode. It compiles straight to machine code. In these terms, this is more a physics problem, not (just) a code problem.
Those "suits" you refer to included every major hardware vendor on the planet. Java was only sold as a silver bullet for portability, not speed, not efficiency, not scalability, but solely for it's ability to be shifted from one vendor's platform to another's.
When it comes to straight forward business service and batch job processing, it succeeds admirably at that goal, which is rather rare for what you claim was a "silver bullet."
The "problem" is that all kinds of people have visions of Java doing this, that, and the other thing, ranging from the addition of database bindings that don't allow for stored procedures to 3D graphics. Java's "problem" is that it's gradually becoming too much of a "kitchen sink" instead of staying focused on what it was designed for: portable business programming.
I do not fail; I succeed at finding out what does not work.
Yes, the middle ground has some disadvantages of both extremes, but it has some of the advantages to both.
C++ maps to hardware well. An enterprise web solution, doesn't need that. It should have automatic memory management. The scripting languages are not strongly typed. That makes the code a little less maintainable and a little slower.
When Twitter used RoR, it was a nightmare. It just wasn't performant enough. When they went to Scala things got a lot better.
Would Twitter ever want to use C++? I doubt it. They are probably a bit hardware agnostic and they don't want to deal with the classes of bugs that C++ has.
Democracy Now! - your daily, uncensored, corporate-free
A big problem with duck-typed scripting languages, such as Python, is that the absence of explicitly stated type requirements in the source code. Using types in function signatures and variable declarations is an extremely useful tool for developers to indicate not only how a system is decomposed, but also what potential future usages they intend to support vs. not support.
I've worked on reasonably large Python, C++, and Java projects. The Python code was by far the hardest to make sense of due to the duck typing and other Python idioms (metaclass, i.e. self-modifying code).
Come on, elementary math. That's not true. Half of all programmers are below MEDIAN. If you don't care enough to get THAT right, I'm not going to bother with the rest of your assertions.
The point of java is that you can program more devices on this planet in this language than with anything else.
Java has penetrated all areas of computing, from embedded (down to chipcards) to mobile, from science to database and web servers.
Java has inherent cross-platform mechanisms for elementary things for which c does not have these (treads), and there are (most of the time free) libraries inferfacing in all directions.
Dynamic, standardized binding to databases and XML makes it extremely easy to persist you data in a well-documented and well-tested structured way.
Java has nearly all language features you could desire.
And last but not least: eclipse is a great free IDE. AMong the free IDEs there is IMHO no combination of language+language tools which boots your productivity for specific tasks as eclipse does.
Both Java and C# are nice in that they give you more power than many scripting languages, while obscuring some of the headaches (read: pointers) that come with lower-level languages like C. Both are [IMHO] also cleaner implementations of an object-oriented language than C++.
Another benefit of Java and C# are in their standard libraries. They're a bit more refined and a lot more consistent than the standard libC library. There has been a huge amount of drift in the libC world since wchars, long longs and safer array handling functions have been adopted. When writing portable C code for both Visual C and Klang, I'm constantly having to write wrapper code that deals with missing, renamed or depreciated functions on either the Windows or BSD side.
Lastly, if your Java or C# apps are speed sensitive, you just do the same thing that people have been doing with C and C++ for years: run your code through a profiler and then write your time critical code in a lower-level language that you call as an external procedure. I haven't written a large app entirely in ASM since my Amiga days (even then, it wasn't the norm).
When learning a new language, students shouldn't have to worry about if Getopt() is a valid function or not. Save that for a more advanced class. With Java, you can assign homework and know that students with Windows, Linux, BSD or MacOS will have the same environment. And in the real world, Java and C# eliminate some of the hassles of the C and ASM worlds, while still allowing you to reach back using external calls when needed. I really do find myself programming in C and C++ less and less every year.
I wrote compilers for Modula-2 in University, and was minimally exposed to Java (thank God). I have seen fans of it, but my own experience is that Java is a narcoticized slug. Its bloated (worse than COBOL), and has a learning curve steeper than a cow's face. Worse, unlike C, which is a compact language (you can learn all of the data structures can be easily described in 2-3 pages of any textbook or manual), Java goes on and on and on (the smallest book I've seen is 850 pages). There are 10,000,000,000,000 libraries, with that number being modified every year, and offers by exponents of the language to offer another 3-5 libraries for every one available already. In order to be productive in any way (eg: Hello World), you need to call in at least half of all available libraries (each, seperately, and in the correct sequence), and then hope that all of your current libraries are up to date and work with each other. Then you run the program, and wait, and finally it gives you your output: "Hello World".
I wouldn't state that C# is superior to Java from a language perspective, both are essentially derived from Ada and C with influences from C++.
Haven't used C# that much myself (and am totally out of touch with Java these days) but when I first used it just over ten years ago C# *did* strike me as very obviously a Java workalike, albeit one with a few nice improvements. Of course, it had quite obviously enjoyed the benefit of hindsight over Java, picking and choosing the aspects which worked and being able to ignore the dead-ends and mistakes, as well as the legacy library cruft which- even by the early-2000s- Java already had quite a lot of (mainly stuff from the early versions which was later deprecated).
Yeah, I'll agree with that. I think you're simply too dazzled by the "coolness" of python to see it's many, many, terrible warts.
Required reading for internet skeptics
Create a calendar showing scantily clad beautiful women reclined on cars and motorcycles writing code, and it will appear to be cool. To 12 year old boys.
What is cool? Programming isn't cool. Programmers aren't cool. Being a guitar player in a great band is probably cool. Being a chick magnet might be cool. When has being a Java dev gotten anybody laid?
The only people who care about how "cool" a language is are posers. A professional developer is going to choose the tool that is going to let him/her build what he/she wants with the least fuss. For a lot of today's applications, that tool may well be Java.
What's uncool is a skill that won't get you a job. Java can get you a job, help you buy a car, a house, live your life.
there are 3 kinds of people:
* those who can count
* those who can't
It sorta got there. It's an unmitigated disaster on the browser, for example. It is also awfully touchy about what version of java you're running. The desktops with native java CPUs never happened.
Java definitely isn't Hip and never will be. It is, however, the new COBOL which means it'll be around for a long time.
The one exception is it's use in Android. I wouldn't say the language is hip there but it is tolerated because mobile is hip.
He may have assumed the normal distribution.
It's OK - the poor guy has obviously never been exposed to elementary statistics or he would have recognized what a sigma refers to. I do think it's fair to assume a certain base level of education on Slashdot - it is a nerd site after all. But what a great example of the Dunning-Kruger effect in action!
My God, it's Full of Source!
OUTSIDE_IP=$(dig +short my.ip @outsideip.net)
Jeebus people, just open the story from 10 years and press "reload." There you go, you asked again and got the answers again.
It might be that there are real pros and cons for languages. It might be that the reasons languages are "un-cool" are because they address the needs of the pointy-haired, and don't support pocket protectors.
And it does make perfect sense for Java to be the 1 required language in a CS course; it might be the only way to get kids to learn it, since it is so un-cool, lame, and inefficient for the small projects that students are working on. In a well designed CS course, very few problems have a required language past the basic algorithms classes. (Where standardization allows for a higher quality class when the teachers are grad students)
Anyways, it makes sense to teach Java, because the best use case for Java is to be able to use massive teams of low quality developers, potentially with high turnover, and still make working software. These are the people most in need of the job training type of education. People who are going to work in almost any other area are going to have to be able to learn new tools quickly based on the manuals, and it won't matter what they studied.
"WILL NEVER": gosh, not true and never has been unless you know the exact CPU and execution paths and data sets that you are compiling for, for all executions of the statically-compiled code. Please don't regurgitate this stuff.
When maintaining a C++ build system used internationally by a large bank I had to guess what the optimal target instruction set variant, cache line size, etc, would be over the lifetime of the output code, which was always a compromise over London/NYC/TOK/etc and a huge range of dev and production hosts of various ages. And with most/much of the library stack unsafe for C/C++ threading even though almost none of our machines (eg desktop or server-farm) where single CPU you could not then and could not now say whether C++ or Java would be necessarily faster on a given machine, given all the CPU- and run- specific optimisations the JVM has available to it that C++ does not.
I currently work on a Java low-latency high-frequency trading platform in the day job and an ASM/C/C++ based microcontroller platform for my start-up. And I think that I've been using C++ and Java for most of their existences, amongst other languages (I've been writing ASM for >30y); I have a fair idea of what is fast and what is productive.
Rgds
Damon
http://m.earth.org.uk/
A counterexample would be skill levels (3,1,3,3,7) with a median of 3 and mean above 3. In neither of those definitions are half below average, being 1 or 2, and 4.
Simple math would say at least half would be less than or equal to the median.
Of course, simple math rarely works here to quantify except at the extremes. People have different abilities in different areas, and gray matter is plastic. It changes, and even that rate of change matters.
You don't need an "OO... language" because OO is a methodology. You can learn pure, real OOP using almost any language. Plain C works fine.
You can also write bad procedural code in an "OO language" because that is also a methodology. I see that crap all the time; giant 50+ line methods that do a bunch of things and all the utility functions are procedural-style class methods. Lots of Rubyists don't have any idea even what the difference between OOP and Procedural is, they just assume they must be doing OOP since they're using an "OO language."
Same thing with learning scheme; when you associate functional programming with a language instead of a methodology, the first thing new people do is try to find a way to fake some state and they end up with spaghetti procedural instead of functional.
You only need to learn one oo procedure based language. All others are just a book exercise.
The problem with that is most people think because they can program in that language they understand the paradigm.
There are tons of c++ and c# programmers out there who think object orientation is only about turning UI controls into objects. All other code is more of a mix of bad OO and imperative programming.
I would revise your original statement to you only need to learn one oo language well. Same for functional languages. You are have to know a language well to understand the paradigm.
COBOL was never cool, either, but is still in use in enterprises.
For learning the craft, they should use what's best to teach it, not necessarily what's relevant at the time (unless it's a job school).
Lawyers aren't cool, and they make almost as much money as COBOL programmers. They even have their own schools.
Everybody should learn COBOL though. "Okay class, now we're going to learn what it is like when you only have pass-by-value, and no references. At the end of the unit we will understand why all modern languages use pass-by-reference, except for optimizing literals, and why modern COBOL programmers write all their new code in C libraries."
If Java can be made to do that, that's got to mean something ...
(this is not a
All browser plugins are unmitigated disasters.
Java cleaner than python? Tell me you're kidding.
It is meaningless to argue that one unless you attempt to define "clean," and then both sides will turn out to be using different meanings. Using his meaning of clean you'd probably be forced to agree with him; and using yours, he would likely agree with you.
Is boilerplate dirty, is it cruft, or is it O(1) stuff that isn't even counted and is effectively free? That is the real underlying issue. If boilerplate is cruft, then Java isn't clean. If boilerplate is free and to be ignored, then Java is still verbose, but clean.
Most people who ignore boilerplate probably are using tools that write most of it for them anyways, which brings in its own issues and differences of opinion.
Of course he totally ignores the possibility of using efficient methodologies to write large codebases using "scripting" languages. It certainly can and is done. But you can't hire Dilberts to do it, the way you can with Java. If you're planning to be undisciplined except for the what the language forces you into, then he's right.
Yeah, sorry, I maintain LARGE complex code bases. There's zero chance that's going to be easier using a loosely typed language with porous ideas of module boundaries, etc. I've been there, and a well-architected system built with a classic OO language like Java is just a lot more manageable. Also a lot of the advantages in brevity of things like Python or Perl evaporate when you try to apply some sanity to their use, but the disadvantages are still there to bite you. A 500 line Perl script is undoubtedly a LOT more compact and succinct than some java app built to do the same thing, which will be 2-3 thousand lines long probably. But when you start building well-designed class hierarchies in Perl? You're code will rapidly become just as large and verbose as its Java counterpart. Python and Ruby aren't better, in fact no scripting language will improve on this because all that stuff is NEEDED at scale. I'm an exceedingly accomplished Perl programmer and I can certainly code in other 'P languages' perfectly well, but they aren't the same thing. Each tool to its place.
"Malo periculosam, libertatem quam quietam servitutem." -- Jefferson
I've written a lot of code in the 'P languages' and I don't really believe that anymore. A 15k python app might be perfectly fine, but loose typing and the lack of a standard error handling strategy bite you in the end. I don't actually think that Perl is any weaker here than Python. You may be more familiar with one and comfortable with it, but I've written some pretty large programs in Perl. It HAS the tools, and I'm not the only one. Ruby is probably the cleanest of this sort of languages, but its still things like loose typing and the attendant inability to enforce calling semantics that hurts in all cases the most. When I write Java I know that if I call a method I have the right type of arguments at least, and that if somehow I manage to partially subvert that with reflection or whatnot that my error will be quickly outed by the run time. In dynamic languages you really don't know what the data is supposed to be until something goes wrong. Mostly though you lack the ability to have your IDE vet everything, you can't do static validation, etc. On big projects things like code validation, test coverage, etc are big deals, as is code GENERATION for that matter. All of these things are vastly better supported and easier to do in a statically typed language like Java.
"Malo periculosam, libertatem quam quietam servitutem." -- Jefferson
Back in my (pre PC) college days, COBOL was big in business but wasn't taught or used by anyone in the Computer Science department. If you wanted to learn COBOL, those courses were offered through the school of Business.
And APL was taught by the department of Mathematics, to the extent that APL packages were used in the statistics classes.
Computer science classes weren't about teaching programming languages (we probably went through a dozen or more, from Algol and assembler to Lisp and Simula and Snobol -- we were expected to learn them ourselves depending on the assignment), but about how to think about programming (and operating systems and so on).
-- Alastair
Java combines the wonderfull readability of C++ with the blazing speed of smalltalk. C# is an innovative language from Microsoft that takes those two features of Java and adds in the portability of Visual Basic.
We suffer more in our imagination than in reality. - Seneca
Java was originally the free alternative to the Evil Empire--Microsoft. Because everything Microsoft sold was serious green--and because everything in the Java world could be found for free [Eclipse vs Visual Studio], [MySQL vs SQL Server], [Tomcat, JBoss, etc vs IIS] it was a no brainer.
.NET is dead or dying while Java is the bearded king, hanging on and going strong.
Now, the single reason that Java is allegedly uncool is because it's the incumbent. It has been kicking ass, dominating the Enterprise Tech stack for so long that it's obviously not going to be hip and cool.
Sure you have Python or Perl or Ruby or Go or Hack or Node.js or whatever but they just never seem to catch on in a big way. Sure, you'll find somebody who swears by Python or who thinks that Facebook's Hack abortion is the shit but they just don't catch on and they become curiosities.
Java remains the shit because it was the Anti Microsoft. Write Once, Run Anywhere [which of course was never totally true] but at least it's not Microsoft. Now that Microsoft is dead you have all these companies that tried to dethrone it but they have not been able. Google's "Go"? Even Google chose to base Android on Java. Java is not cool but it still owns the marketplace. For the foreseeable future.
Its a programming language, not a car.. It should be treated like a tool. What should be 'cool' is what you do with it..
---- Booth was a patriot ----
Duck typing is a mixed bag. You can make the requirements clearer in comments and the doc string. It also has great advantages in being more concerned with attributes than declared type or lineage. It allows modules to deal with classes that weren't even imagined when they were written.
The problem is that by an large, code can't be automatically checked against doc strings. (If it could be, then you'd just have a classic type system again.)
As far as supporting unplanned extensibility, it seems to me that interfaces (or pure virtual base classes in the case of C++) provide that functionality in more statically typed languages, so I don't see that as an advantage peculiar to duck-typing.
Java owes little to Ada. Ada has one of the most rigorous data typing systems of any programming language, but its roots are in Pascal, and thence descend to Algol.
Java's syntactic roots come from C through C++, which added OOP capabilities.
C# is somewhat of a zig-zag. In part, it's Microsoft's alternative after they were prevented from hijacking Java. In part, it's reaching back to C++. Along the way, they attempted to cure some of Java's warts.
One bit of irony. Both Java and C# are programming languages designed and "owned" by private organizations, each of which also owns at least one major OS. Java users always had a high degree of confidence that Sun would never abuse that position and attempt to use Java to lock them into Solaris. C# never enjoyed that confidence, which is why there's precious little C# work done on the non-Windows OS's.
Be careful what you ask for. All that typing means that you can find and fix a lot of bugs in the compile step. With dynamically typed languages, you get to find those bugs at runtime. Maybe that is why other posters here believe that Java is for the B programmers.
Precisely. The problem is, that if you design things out ahead of time, it takes longer before you are at the point where you can show "results".
The spirit of the times is instant gratification. The faster you can get from basic premise to displayed web pages, the better you look.
Your actual architecture may be paper-maché over balsa wood and chicken-wire, but if you can show something visible to the PHB and the users ASAP, you're "productive". Even though in a month's time, the whole sysem may end up crashing and destroying vital data. Or worse, sharing it with various unsavory people who broker such things to even less desirable people.
LOL, I don't know what sort of disasterously bad Java shop you work for... I've got a VERY large Java code base. We use a number of the tools you mention and they are quite powerful and useful. There's nothing in the 'steaming mass' category about it. Perhaps you need some new developers! OTOH The last big project I did with a dynamic language became hideously complicated with constant undocumented dependency issues and bizarre almost untraceable bugs that it was finally just literally delivered by the prime contractor as it was. Luckily the whole issue became largely moot as external forces cut the project back. It IS still in use, 7 years later, but if I were to do that sort of project today I wouldn't even consider a dynamic language. Not with the schema complexity and other aspects of it as it was. Java has a vastly more powerful infrastructure for dealing with complex data for one thing.
"Malo periculosam, libertatem quam quietam servitutem." -- Jefferson
Java as a language is a pain to develop with. Java selling points have always revolved around the JVM itself and a bullet proof, over-engineered backbone that is needed for "enterprise" workloads. In big company's who don't have urgent timelines where they are willing to invest time to micro-engineer solutions it's used very heavily. For applications under heavy workloads, the high stress parts are usually built in Java for maximum efficiency but it's been the JVM, JDBC, server infrastructure and the polished library of tools around it that have buoyed it's success.
With the ability to run other languages on the JVM and get ALL those benefits without actually being required to code in Java though...now that's pretty cool. jRuby, Scala, Groovy, Clojure, etc are making the Java world a heck of a lot more interesting. If the early rumblings around the dramatic gains that jRuby is making with Java 8 are true you might just see the world implode at the idea of Java performance with Ruby development timelines. Early public benchmarks on Techempower are already looking about 30% faster than Scala.
"Don't teach a man to fish, feed yourself. He's a grown man. Fishing's not that hard." - Ron Swanson
OK, that's bullshit.
I'm moving more of my own work from Java to JavaScript, but that is mainly because JavaScript is easiest to deploy almost every where. I generally like Java+Eclipse better for big projects otherwise. However, with tools that compile other languages to JavaScript, and browsers that can get near native performance from JavaScript if written in a certain way, I'm hoping the "JavaScript" approach will continue to gain in benefits because it is just easier to deploy than Java. It's too bad Java app deployment to the desktop was never a real priority (even with Java Web Start). As an example of the difference (including in sandboxing), some school teachers can get fired for installing new software without permission (which could include a Java app which can do anything), but they can use a web browser to load up an educational web page which uses JavaScript to run a simulation without too many worries.
I fought against Java back in the late 1990s compared to using Smalltalk. Back then Java was just a mess and a mass of hype. But I can accept Java is now a half-way-decent solution for many things now that many of the worst rough edges of Java have been smoothed off. I still miss Smalltalk though, and to some extent (not all), JavaScript recaptures some of the Smalltalk flavor and community -- if I squint just right, I can kind of see the entire Web as one big multi-threaded Smalltalk image. :-)
A 21st century issue: the irony of technologies of abundance in the hands of those still thinking in terms of scarcity.
C# never enjoyed that confidence, which is why there's precious little C# work done on the non-Windows OS's.
Well, let's be clear: it's not just because Sun had more goodwill than Microsoft.
For a start, Sun made JVMs for all major platforms. Microsoft made .Net for Windows only. They made Silverlight for Windows and Mac, granted, but never even a nod to Linux. Mono had to make its own way.
Oh, and that in Java, the 'culture' is to deliberately avoid anything non-standard or specific to any JVM. In the C# world, though, there are things like WinForms: vital parts of the 'ecosystem' which are platform-specific and non-standard.
Except that once JIT/Hotspot is involved all or most of the executions *are* of compiled machine code, optimised to the particular CPU on hand and the particular data set for this particular job. So things like dynamic inlining *for this particular job* can allow the JVM to produce *better* machine code which will execute more quickly than statically-compiled code.
The translation takes time, but for long-running tasks that may well be easily amortised away.
So single-threaded Java can beat single-threaded C++.
But I can also bring more CPUs to bear on the code safely with Java for a given level of code complexity (well, now C++ finally has some sensible volatile semantics, that's a little less true).
And there are other factors such as the generally forced synchronous nature of C++ heap handling which can work against it.
Rgds
Damon
http://m.earth.org.uk/
I assume you mean generic programming on Windows is easier in C#. Although debatable on Windows, it's less so on some platforms and impossible on others.
All the languages that have truly had longevity have also been generally available on numerous platforms (i.e. not just Windows and Mac).
Some of what I say is fact, some is conjecture, the rest I'm just blowing out my ass...you guess.
Almost. It was designed for running untrusted code delivered via the network to set top boxes and consumer electronics. There are many things that can be said about this, and how well it translated into the world of the web, but consider what Java gave us.
The JVM is a clean bytecode virtual machine, which can be implemented in hardware and reasonably compiled to native machine code. An implementation can statically verify that the code will not misbehave in certain ways. It scales on platforms varying in size from a 1990s-era smart card to a modern cluster.
It gave us the first garbage collected language that the commercial world could handle. It gave us the first programming language which the open source world took seriously and wasn't C. It sparked a new world of research into previously neglected areas, such as JIT compilation, concurrent garbage collection, and so on. It gave us the notion of an "app" and an idea of apps could achieve in the Internet era.
Java may never have been cool, but it deserves an honoured place in the history of computer science and software engineering.
sub f{($f)=@_;print"$f(q{$f});";}f(q{sub f{($f)=@_;print"$f(q{$f});";}f});
In the beginning, Netscape wanted both Java and Javascript in the browser. Javascript was to be the VB of the browser programming world with Java for professional programmers to do the heavy lifting.
The Java side rapidly got the reputation for being slow, crashy, resource hogging, and way too sensitive to sub-minor version differences so it was largely ignored.
Javascript, OTOH was eagerly embraced, first by web designers wanting cutsie special effects and minor amusements and then for more serious pursuits. Then came AJAX..
J2ME could have worked but in the fast moving web world, it was a day late to the party. By the time it came out and demonstrated that it wasn't a lumbering resource hog, the ship had sailed. Javascript was everywhere.
Java isn't available on iOS
Yes, it is.
it isn't really available on Android
Bullshit. Android's implementation may not be completely up-to-date, but it is absolutely a version of Java. Only trademark and licensing issues prevent Google from claiming that it is.
OSX comes (used to come?) with outdated versions where a lot of Java programs don't run properly
Who cares what version is installed by default? OSX can be upgraded to the latest version, and any application that needs it ought to provide an installation package that does precisely that, or at least clear instructions to the user on how to do it.
Linux comes with OpenJDK which doesn't run quite a lot of Java programs either
As of version 8, OpenJDK is the reference implementation. Any Java program that doesn't run on OpenJDK is not a conforming pure Java application. Besides, it is perfectly possible to install Oracle Java on a Linux system if you prefer it. Depending on your distribution, it may be as simple as a single command, or you may need to add an update source first (which turns it into 3 commands on Ubuntu, for instance).
It's "cross platform" only if your definition is "it's a huge pain and doesn't work properly on any platform without extensive workarounds"
I'd hardly call any of these "extensive workarounds". Yes, you may have to refrain from using the latest APIs if you want to target certain platforms. Or you may have to have the end user install an upgrade to their preinstalled Java system. Neither of these is actually that hard.
If you're done everything on Sun Java 1.5, and suddenly Oracle changes it to "Oracle Java" 1.6, you're SOL.
??? I've been writing Java applications since 1.1 was the current version, and I've never had one stop working with a version update.
The only experience I've had with such failures are 3rd party applications where the developer has used the deprecated com.sun.* APIs. The guidelines on using these have been quite clear from the very beginning, though: don't, unless you want to create compatibility problems for your users.
I wouldn't state that C# is superior to Java from a language perspective, both are essentially derived from Ada and C with influences from C++.
But C# is far quicker to incorporate modern language features (like closures and other dynamic programming features), while Java is constantly dragging its feet.
I'd never lock myself into a Microsoft ecosystem by specializing in C#, but as a language, it's more up to date than Java. There's a good reason for the proliferation of other JVM languages like Groovy, Scala and Clojure.
I suppose it depends on your target market. I've written mostly for medical and military, and they never had complaints about Qt's ui. Even did a server based app with no UI, and Qt still made sense as the library because of the cross-platform requirements - lots of shared memory and other stuff is "wrapped up" and platform details handled by the library. I guess I've always been in small enough companies that "outsourcing to the trolls" was the better option - we'd never have delivered anything cross-platform if we had to hire multiple teams for implementation on each.
Medical and military sounds like mostly Windows shops, with maybe a bit of Linux thrown in. Qt apps on OS X tend to be garbage - you can spot them within a few seconds of launch, because they look vaguely like OS X but don't behave at all like it (e.g. modal dialog boxes, incorrect shortcut keys for text field navigation, preferences that need buttons hitting to take effect, and so on).
I am TheRaven on Soylent News
You might be surprised, my first medical app on Qt was targeted to OS-X, for a whole year, but as Director of Software Development, I chose Qt to hedge my bets against the day that OS-X got thrown under the bus for "business reasons." And, yes, especially in 2006, the Qt App was still in Carbon, while Cocoa was what all the cool Objective C kids were doing that week - and our in-house OS-X champion threw a hissy fit about it. Nobody else cared - it was a good looking app, just not quite up to the minute with latest OS-X styles.
So, two things happened by mid-2007. One, Qt updated to use Cocoa, and 95% of the OS-X champion's complaints about the app were solved for us by the trolls - zero code changes required by us. Two, the suits decided that we were merging our design efforts with a larger project that was Windows based, so OS-X did get thrown under the bus, as predicted. It took about 8 man hours to convert our Qt App from one that was written on OS-X, exclusively for OS-X, never tested on anything but OS-X, to running identically on Windows - and 7 of those man hours were wrapped up in converting OpenGL code....
I'm in medical now, and the primary target is Linux - but lots of use cases call for operation under Windows too....
When I read "_how_ C strings work...", I began to think of what I knew about how the C language is actually implemented. And frankly, I don't know how C is implemented (eg. what happens after parsing, how things get converted to CPU instructions). Even though I've spent a fair bit of time writing in the language, I would have stumbled on that question and perhaps have asked you to clarify (something a younger person is less likely to do).
When I read your answer, I realized you were asking "how are strings defined in C" or "how do you use C with string types".
See the difference? On that alone, I guess you may have screened out a lot of good people.
Tangentially, this is also a good reason to not pay too much attention to survey results unless you have actually read the questions that were asked in the survey.
"Consensus" in science is _always_ a political construct.
Its not the design. Like I've said I've done some pretty large perl programs. The work involved in dealing with the bugs that arise that just can't exist in Java generally overcomes the advantages of using perl, and by the time you stick rigidly to classes and modules in perl why not use Java? Frankly I avoided all the one-line amazing wonder-code in my maintainable perl anyway unless it was necessitated by performance reasons, so its not like there was a big difference. There isn't even really that much less type casting in perl vs Java, it is just somewhat obfuscated into the reference syntax.
The one GOOD example of an application that I still maintain in perl is our build system. Its a pretty good sized set of perl modules a couple simple parsers, and some dependency graph tracking code. This is where perl IS great though, I can invoke specific command line utilities and muck around with files and such without a lot of hand-wavy abstractions. Maven used to suck up half our time working around its built-in limitations, Builder barely requires any attention at all at this point and if you need to do some weird thing you can write a new perl module in 5 minutes and do it, assuming the 40 existing ones don't do it already. However, even my most experienced Java guys quail at the thought of understanding the core Builder code, lol.
"Malo periculosam, libertatem quam quietam servitutem." -- Jefferson