There are any number of technology stacks that a company can use to base their service oriented architecture (SOA) on, the main ones are Java and C++, with Java having the definite advantage in terms of marketshare. In fact, Java left C++ in the dust for many years (most notably during the .com boom of the 90′s), and C++ has only now started to catch back up with options like RogueWave’s Hydra offering and some interesting newcomers like http://www.pocomatic.com/ . Having said that, there are still a host of CORBA frameworks that are still very much alive and kicking.
While the common refrain of ‘no one ever got fired for buying IBM’ may be misappropriated to say ‘no one every got fired for designing in Java’, I am a firm believer in using the right tool for the job. Unfortunately, in my experience that is more and more often Java instead of C++ for a couple of reasons. I’ll talk about cost here.
Cost: Java is just cheaper to develop systems in. Not only in man-hours, but very often in hardware as well (more on this later). The simpler design of the Java language makes writing tools much much easier (I’ve worked on both Java and C++ IDEs and toolchains and I can tell you that C++ is horrible to write tools for). While I’m sure many will scoff at the cost difference in man-hours with a refrain of ‘just hire better programmers’, the cost difference is real regardless of how good your software engineers are.
A simple example of this is when I had to change a type a piece of code in C++. Refactoring mean doing a ‘find . | xargs grep myTypeName‘ . Then editing each of those files with a search and replace in emacs, then rebuilding the code (which took quite a while because the type was used in header files as well as sources), then realizing that I’d forgotten one reference in a header, then recompiling, etc. That whole process took about 30 minutes to change the code, compile and test that things still worked.
When doing essentially the same thing in Java, I right clicked on the type name, choose refactor from the menu, and changed the type name. All references to the type were correctly updated. This cost me all of about 30 seconds of my time.
The time difference outlined above is very real on an organizations bottom line.
The other major cost difference is related to hardware. Multi-threading in Java is pretty easy. Why am I talking about multi-threading when I started the paragraph talking about hardware cost? Let me digress a bit, then I’ll come back and explain the relevance.
The language support for locking in Java is really handy. C++ on the other hand doesn’t have any language support for threading, so you are stuck writing your own locking mechanisms (which is quite error prone), or using some of the prebuilt locking components available to you. The problem with these is that native code running on a multiprocessor machine borders on non-deterministic. That’s why you see idioms like the dbl-check-thread-lock; however, even that isn’t quite thread safe (see this for more gory details on why).
So again, how does this effect cost? Simple, at Amazon, it was decided that C++ services would be single threaded due to problems like this. This means that once your C++ service is running at capacity, you have to start up another instance of it. That means you have to have two (or more) completely separate processes running to handle your requests. That adds a lot of overhead, as you are loading system libraries unnecessarily and using more RAM (you can also run into problems with multiple processes accessing shared resources on the disk and creating contention).
Conversely, for our Java services, you just add more RAM to your JVM and spawn some more threads to handle the requests (note, I am talking about the service itself running out of steam, not any dependencies like databases or downstream services).
The yearly cost of hardware for our Java services is about half that of our C++ services. While that isn’t too much for a single service, when you look at deploying hundreds of services across an organization, that cost savings really does add up (it could easily pay for another engineer or a raise for you, the frugal programmer).
Posted by Mathew Duafala