Popularity of Web Application Frameworks September 27, 2009

September 27th, 2009
The following is a rundown of the adoption rates of various web application frameworks by programming language, according to Indeed.  Keep in mind that there are many other considerations, besides popularity, when choosing a framework. Framework feature sets vary dramatically and this is just as important as popularity.  This article simply displays the adoption rates (according to indeed) of the various frameworks listed in the Wikipedia Comparison of web frameworks article and gives some brief summary information.  In some cases there are so many competitors that it takes some effort to narrow them down.  The intermediate graphs (prior to narrowing down the number of items on each graph) are not shown.  To further narrow down the criteria, I will only look at frameworks that produce web based output that can be viewed without a plugin (thus Flash and Silverlight frameworks will be ignored for this article).  Lastly, there are some framework names, such as “PHP Work” (I mean really, you’re going to name your framework THAT?!?!  Ambiguous names are a Microsoft FUD trick to hide a technology’s unpopularity until it’s marketing department convinces the world that it is taking-off), are too generic to be search on and so thus are ignored.  Lastly, this article then pits the winner from each category to determine an overall winner.
PHP Web Frameworks:
PHP Web Frameworks

PHP Web Frameworks

PHP Frameworks: Agavi, Akelos, CakePHP, DooPHP, CodeIgniter, Drupal, Elixon, jFramework, Helix, Horde, eZ Components, FUSE, Kohana, KumbiaPHP, LISA, Orinoco, PEAR, PHP For Applications, PHP Work, Qcodo, Rapyd Framework, Samstyle, Satya Portal Pack, Seagull, SilverStripe, Simplicity, Solar, SPIP, Symphony and CMS, Tekuna, Tigermouse, Vork, Wigbi,Yii, Zend,  and Zoop.
PHP Observations: Joomla is not listed.  Is this not considered a general-purpose web framework?  PHP Work and PHP For Applications are ignored.
PHP Winners:  Drupal, cakephp, and CodeIgniter.  Nothing else is shown on the graph because there are no close fourth-place PHP frameworks.

Java Web Frameworks:

Java Web Frameworks

Java Web Frameworks

Java Frameworks: Apache Cocoon, Apache Struts, Apache Wicket, AppFuse, Aranea, Eclipse RAP, Google Web Toolkit, Hamlets, ItsNat, IT Mill Toolkit, JavaServer Faces, JBoss Seam, ManyDesigns Portofino, OpenLaszlo, OpenXava, pirka, RIFE, Shale, Sling, SmartClient, Sofia, Spring, Stripes, Tapestry, ThinWire, Vaadin, WebObjects, WebWork, ZK, and ztemplates.
Java Winners: GWT, Tapestry, JBoss Seam, Wicket.

Python Web Frameworks:

Python Web Frameworks

Python Web Frameworks

Python Frameworks: CherryPy, CubicWeb, Django, Grok, Pyjamas, Pylons, TurboGears, web2py, and Zope.
Python Winner(s):  Django

Other Web Frameworks:

The other category includes languages other than PHP, Java, and Python.  Flex framework was excluded because we are only interested in frameworks that deal with HTML/Javascript.

Other Web Frameworks

Other Web Frameworks

Other Frameworks: AIDA/Web, Apache Click, ASP.NET MVC, Axiom Stack, BFC, Camping, Catalyst, ColdSpring, Csla, CppCMS,DotNetNuke, Flex, Fusebox, Grails, Helma, Interchange, Kepler, Lift, Mason, Maypole, Mach-II, Merb, Midgard, Model-Glue, MonoRail, Morfik, Nitro, onTap, OpenACS, Orbit, Ruby on Rails, Seaside, Sinatra, Sproutcore, Wavemaker, and Wt.
Other Winners: Ruby On Rails, Grails, ASP.NET MVC, and Mason (Perl).

Overall:

Overall Web Frameworks

Overall Web Frameworks

Overall Winners: Ruby on Rails (by a wide margin), Drupal (PHP), GWT (Java)

If we remove our top three performers (Ruby on Rails, Drupal, and GWT) then we can see the remaining winners more clearly in our graph:

Overall Web Frameworks without Top Three Performers

Overall Web Frameworks without Top Three Performers

The remaining popular web frameworks are, in order of popularity: Django (Python), Grails, CakePHP, Tapestry, JBoss Seam, Wicket, and CodeIgniter.

Of the most popular, the following appear to be growing quickly in popularity: Drupal, GWT, Grails, Django,  CakePHP, CodeIgniter, and Ruby on Rails.

Uncategorized , , ,

What is the most popular IDE, regardless of language?

September 19th, 2009

What is the most popular IDE, regardless of language?  That is a tough question to ask for a number of reasons.  For one, there are lots of open source IDEs that may have a tremendous home-user backing, but not a good backing in the business world.  Also, Eclipse is a platform, and as such it goes by many names.  You add a sliver of usage here and a sliver of usage there and it starts to add up.  Next, I’m not an SAP expert, so maybe there is some great IDE in that universe that can give our heavy hitters (below) a run for their money.

I like Indeed because it aggregates job postings and resumes from many sources.  I think it does a better job at filtering noise than Google trends.

Anyhow, a picture tells a thousand words.  Looking at the graph below you can see that  Visual Studio reigns supreme.  This is because of its virtual monopoly on .net language development (Yes, I tried many different combinations of IDEs in the graph below, but I remove the ones that don’t register at least a little blip).  VS is the gatekeeper of .net!  Eclipse itself (without Aptana, Flex Studio, IRAD, etc) amasses a huge second place victory.  Looks like Zend might be an up-and-comer.  With all of the PHP developers in this world, it sure seems like there should be a dominant PHP IDE.

Surprise: Low Netbeans numbers doesn’t surprise me only because I’ve seen it before.  But as a frequent user I’m always amazed that this terrific product doesn’t do better.

IDE Comparison

Ok, this is really boring since there are no real competitors.  When I first ran these numbers, Delphi showed up as a major player.  The problem is that it is also a city, so it was skewing my statistics.  So I qualified it as “Delphi and Database”, since its primarily used for database applications.  Once I did that, Delphi became one of the little guys.

In summary, happy coding in whatever IDE you choose!

Uncategorized , , , ,

Universal Health Care in the United States

August 15th, 2009

Sorry tech aficionados, I have to take a time out from technology and speak my mind about universal health care in the United States.  It’s important that President Obama first address these issues before pushing universal health care.

 

1)      Taxes are out of control.  First, each American pays Federal and state income taxes and sales taxes.  But what most people don’t consider is that corporations must recoup the money they pay in taxes by raising the cost of the goods and services the sell.  This means that the end consumers ultimately pay the corporate taxes as well.  Once you start adding up all these numbers, the average American pays anywhere between 60% and 75% of their money, depending on how it’s calculated, to government taxes.

2)      One of the main reasons why health care costs are out of control is because our legal system is out of control.  If we hide these costs inside the federal budget, we mask the problem rather than fixing it.  First FIX THE REAL PROBLEMS, then we can talk about federalizing health care.  This problem is perpetuating itself because we keep voting lawyers into congress, and lawyers don’t seem to have a problem with all profits from every industry ultimately ending up in the hands of lawyers.

3)      Figure out how UHC is going to work by first fixing Medicare, Medicaid, and Social Security.  I’ve seen different estimates for impending doom, but even the most optimistic forecasts for these programs don’t look good.  It comes down to a fundamental reality of group collaboration.  The full natural lifecycle of any entity is from struggle to success to bureaucracy to failure.  No entity, whether it be corporate or government, is exempt from this natural evolution.  I know there are companies that reinvent themselves and prolong their natural lifecycle, but all successful entities ultimately collapse under their own bureaucracy.  What is the oldest standing government?  We, as Americans, can stagger the damage caused by essential reinvention by following the example of our constitutional authors and placing as much power in state and local government as possible.  Then we have state-by-state competition to sharpen the system.  We have monopoly laws, but they can’t protect us from a federal monopoly.  This is a fundamental flaw that will destroy us if we continue down this path.

4)      Historically, congress has proven to be the creators of knee-jerk regulation.  This is why even our allies have strained relationships with the USA.  Our foreign policies reverse themselves every time a new president enters office.  Do you want your health care mandated by an institution that is going to reverse its policies on virtually everything the instant the public is sick of Democrat rule and votes a Republican majority back into office?

 

Please, President Obama, fix fundamental problems first, then we can talk about universal health care.

Uncategorized

Universal Data Entities a Necessary First Step towards Interchangeable Global Services

July 3rd, 2009

First, I want to plug Jonathan Sapir. A colleague pointed me to this gentleman while we were discussing End User Development. I read most of his blog entries on http://www.powerinthecloud.com and came to the conclusion that his description and thoughts on what he calls “Situational Applications” are remarkably similar to my own ideas. Amazing…

There’s lots of smart people, including Jon, asserting that services are the future of software development. Jon says, “In the future, there won’t be such a thing as an application. Applications are artificial barriers. You just need services that you can synchronize.”

I think this viewpoint is MOSTLY correct, but its missing a key element. Currently, OOP has a blinding stranglehold on software development. OOP is a wonderful tool, but one of its key tenets may be holding us back. The problematic tenet is the integration of data and logic. The problem rears its ugly head when you begin to think of the world as an enormous collection of compatible services.

The problem is that data has a much broader application than logic does. For instance a Person data entity has much broader usefulness than any set of logic that is wrapped within it. The situation becomes worse when you consider that data objects are tied to their APIs/framework/technology stacks. If I create a Person object in Java, I can reuse it in .net.

I’ve put a lot of thought into Universal Data Entities over the years and I’ve come to the conclusion that data needs to finally make a clean break from its technological chains before we can finally realize the true productivity benefits of worldwide software reuse.

Why shouldn’t data objects automatically be compatible by name and/or attributes? If Application A uses a Person object with 5 attributes and Application B was written on another continent using a Person object with 3 attributes, all of which are in the Person object from Application A, then why shouldn’t Application B accept the Person object from Application A?!?!

The likelihood of two incompatible data objects sharing exactly the same attributes is extremely unlikely. And we could avoid it completely with a few ground rules. For instance, entity and attribute names can use the “extends” construct, and introduce a new construct called “aka” that provides a list of synonymous terms. Attributes would need to match by name or one of the aka names. Entities on the other hand can match up even if their names don’t match, as long as their attributes do. Perhaps the matching would trigger a warning if the names were not matched by name or one of the aka names.

There are some problems to be solved, such as implicit use of measurement units. If we had two Person objects that both had a Height attribute, then we would almost certainly encounter a unit problem. So any attribute that quantifies a value in space or time would need to also handle the unit of measure. This could be as simple as some form of Hungarian notation. For instance, the Height attribute would need to be HeightInch, or HeightFeet.

The aka construct could even go a little further by providing conversions from one unit to another. So, for instance an attribute named HeightInch might be declared as;

HeightInch aka HeightFoot computed as HeightInch/12

I’m quite certain there are many other details that need to be worked out. This type of object would certainly need a text-based intermediary representation to become universal. I think it would be relatively easy to produce an XML notation (Schema). I’ve also considered using JSON, but there is not yet a specification that gives data objects their well-deserved universal liberation from logic and implementation. I’ve produced a proof of concept implementation that I would be happy to share if there is some interest. I do believe that the Universal Data Entity is a necessary first step towards the vision of a global Services library. It almost certainly is a necessary first step towards creating a Situational Application development environment that is both powerful and user friendly.

Thanks for your time!

Uncategorized

Social Media Monitoring

June 19th, 2009

I’ve been investigating Listening Platforms off-and-on for weeks. There are tons to choose from, and yet they all seem to want hundreds or thousands of dollars per month. Is there anybody out there that charges a sane amount just to play around and surf data?

Another question is; why can’t I just grab one or two decent aggregators (that give me the entire content of the post), suck the data I want locally, and then just use some sort of off-the-shelf business intelligence dashboard? Or if I really wanted to be low tech, look at it in Excel?

PS: My Technorati Profile.

Uncategorized

A Single-File Virtual File System for Info-Binder

June 19th, 2009

Its been more than two months since the last beta release of Info-Binder.  Now you know what I’ve been doing.  I knew that I could simplify the user experience if I could come up with a way to put all images and attachments in one file, rather than having a separate resources directory that needed to be managed by users.

To make a long story short, I created an experimental branch to integrate TrueZip into Info-Binder and test it.  First let me say that it is a terrific product.  Next let me say that it doesn’t work for Info-Binder because it didn’t scale.  Performance degraded linearly with the size of the archive file.  This is not the fault of TrueZip, but a consequence of using zip as the underlying archive format.

Thus, I found myself doing something I swore I wasn’t going to do.  I wrote my own Single-File Virtual File System.  It wasn’t quite as painful as I thought it would be.  But still, its not for the faint of heart.  It so far is proving to be quite robust and remarkably performant if I do say so myself.

So please try the latest beta of Info-Binder and let me know what you think.

P.S. Developers;  I have released the source code for the VFS under the LGPL license.  You can download the compiled jar separately if you prefer.  The javadoc is also available online.  Go here to get it.

Uncategorized

The Internet Hurts

April 27th, 2009

When something revolutionary comes along, and the internet most certainly qualifies as revolutionary, it takes many years to see the indirect consequences of it.  I wouldn’t want to live without the internet, but it sure is making life difficult…

(1) If you love going into a bookstore and browsing, the internet is making life difficult.  I love the smell of new books.  How long will the dinosaurs like Barnes and Noble and Borders be around before they are undercut into extinction?

(2) If your any kind of journalist, the internet is making life difficult.  The local newspapers are drying up faster than you can say “This just in…”  My buddy has been a sports journalist for 16 years, and is now facing foreclosure and bankruptcy while finishing his teaching degree.

(3) If you’re a real estate agent, your days are numbered.  The internet is making life difficult.

(4) If you’re a phone company, your days are numbered.

(5) Blockbuster, your days are numbered.

(6) If people keep stealing music, kiss the music industry goodbye.

I could go on and on.  I agree with the counter-argument; its great to give the little guy a chance.  But if all we are is a country of “little guys”, nobody is going to make any money.  If nobody makes any money, nobody is going to be buying anything.  What are we all going to do for a living?  We can’t all be nurses…

Uncategorized

Latest Info-Binder Beta Adds Reporting Capabilities

March 9th, 2009

The 3/8/2009 beta of Info-Binder has replaced the plain-text HTML source editor with a proper HTML editor supplied by Fifesoft, with syntax highlighting and many other advanced features.  (see http://fifesoft.com/rsyntaxtextarea/ to get a feel for the features it offers).

The latest Info-Binder beta has a new HTML code editor.

The latest Info-Binder beta has a new HTML code editor.

Most importantly, it implements REPORTING.  The reporting subsystem shares the scripting language from the export subsystem.  In the coming weeks I plan to write a series of articles entitled “Anything You Can Do, I Can Do Better” that compares Excel to Info-Binder and demonstrates that you can do most of the same types of things just as easily in Info-Binder as in Excel.

Not only that, but there are many circumstances where you’re far better off to use Info-Binder.  For instance, with Excel, your calculations are forever entombed in your output, meaning that if you created a useful set of calculations/projections for a client, you wouldn’t be able to send it to them electronically without giving away all of your secrets. With Info-Binder, there is a distinctive separation between Input and Output.

To get a feel for how it works, install the latest version and select File->New Organizer. The new-organizer template now includes a “Contacts” report. Right click on the root node and select “Generate Report…” Select the “Contacts” report, and click [OK].

You will notice that it generated a new node under the selected node (root node) named “Contacts <today’s date>”. It is a static report, meaning that it does not automatically update if you create new contacts. You must generate a new report to have a version that reflects your latest list of contacts.

To begin peeling back the covers to see how this works, click on the Organizer-Properties icon (or select it from the file menu). Then select the [Reports] tab. Double click the “Contacts” report from the list. What you will discover is that you can write reports that generate any type of text-based output. In most cases, you will be utilizing HTML to create rich reports with text and graphics. If you’re anxious to get started, then see Appendix C in the Users Guide. It may be a little ugly right now, but up to date! Also, if you position your cursor within the code editor of the report , create a blank line, and hit control-space, you will discover Code-Assist, a feature that can dramatically simplify the process of creating new Reports.

The Report Editor from the latest beta of Info-Binder.

The Report Editor from the latest beta of Info-Binder.

In the coming weeks a feature to import reports into existing Organizers will become available. Also expect to see new features for creating custom graphs and charts inside reports.

This is an exciting time, as Info-Binder begins to grow into a new tool in the software arsenal that finally can complement the rich power of the spreadsheet.

Uncategorized , , , ,

Safe General-Purpose Local Storage Mechanism for RIAs

January 3rd, 2009

The problem I have with “cloud” computing is that I’m too possessive. When I purchase software, I pay the extra money to have the physical DVD shipped to me. The reason I do it is because I have a sense of ownership in the applications I buy (Yeah, I know, “license”, not “buy”).  That sense of ownership is even stronger when it comes to my data. I don’t want my data off in internet-land, where if the company hosting it goes out of business or gets acquired, I find myself paying $49.99 per month for access to it, or worse, lose it. I also have a fear that my data could be mined or exploited.  I can’t possibly be the only one that feels this way.

So how do we create a safe general-purpose mechanism for accessing persistent local storage from web applications?

The Google Gears approach is to create a server to be run on the client’s machine. Then, the user is running a web application from a server hosted locally. I’m by no means a Gears expert, but I feel it becomes a slippery slope to ask end-users to run servers on their desktops. Savy end-users will no-doubt understand the risk of opening up a port to the public, but many will not?  I think the Gears server blocks direct public access, but couldn’t any arbitrary web page embed a reference to the local Gears server, and use client-side scripting to expose the file system?  The only way to safely protect it would be to limit the capabilities of the Gears server.  This is a less-than-ideal solution because it imposes a limit to the capabilities of all RIAs.  At the very least, this approach will be incompatible with many corporate infrastructures.

Even if Gears manages to get all of the kinks worked out of their security mechanism, there is still one enormous problem with their approach; it’s not a general-purpose solution.  Gears appears to provide it’s functionality via a fairly extensive JavaScript API. Don’t get me wrong, there’s absolutely nothing wrong with JavaScript. But I don’t want to be writing some of my business logic in JavaScript, and some of it in another language.

I’ve considered writing an application that ran in the browser and provided programmatic access to the file-system, either through a plug-in or via a Java applet. The Applet would be cool because the user wouldn’t have to install anything, but just grant authority to the Applet when the page loaded.  On the other hand, many users would be confused by this request each and every time it loaded.  Not only that, you don’t necessarily know what applet is requesting permission, so it wouldn’t be good to train users to grant full permission to any old arbitrary public web page..  Plus, an Applet would need to be downloaded to the client machine every time it was utilized (cached for each web page utilizing it?).

A plug-in would be a better solution.  Once its installed, it doesn’t need to beg for permissions.  As long as its provides safety from being hacked, life will be good.  But now, the question becomes, “how do we make it hacker-proof”?

If you think about it, we already have a fairly safe File-Upload component.  So why couldn’t we employ the same strategies to create a Data-Save component?  What makes the file-upload component safe is that the user is provided a familiar component that is (1) easily recognizable, (2) can only be manipulated by the user and not by code.

Today I had an idea.  Every browser-based technology I can think of provides intercommunication with JavaScript variables. This means that we could use JavaScript variables as the mechanism for storing and recalling data. It would work like this; A plug-in could be created that is able to load and save the state of a particular JavaScript object, lets say for purposes of discussion, an object named “StateSpace”.  For instance, if we had an application that wanted to save off the coordinates of a 2D point, it might set StateSpace.X and StateSpace.Y.

The plug-in would then provide a user interface that appears on the user’s browser as shown in Figure 1.

StateSpace Sample Interface

Figure 1: The proposed StateSpace interface.

To prevent a web application from directly accessing the local file system, there would be no programmatic access to the functions that save and retrieve data. All file interaction would be controlled exclusively by the user via the StateSpace UI.  This prevents the plug-in from being used to bamboozle users into exposing their file system.  Not only that, but only ASCII files in JSON notation could be loaded.  An attempt to load any other type of file would simply fail.

The RIA developer embeds the Flash, Silverlight, JavaScript (,etc) application into the HTML of the web page, along with the StateSpace object.  The embedded object would provide the UI (Figure 1) in a window in much the same way that an embedded Flash object does.  The beauty of this arrangement is that the StateSpace plug-in would be instantly recognizable to the end user since (1) it has its own unique interface, and (2) it would appear on the page of all StateSpace-enabled web applications.  Users would immediately recognize when an RIA is able to save and load data via StateSpace, and trust that it will be safe.

To help visualize this better, imagine a spreadsheet RIA written in flash (A possible RIA replacement for Microsoft Excel).  The flash application would save off the data within each of the cells to the StateSpace JavaScript object using its own strategy.  For instance using two-dimensional arrays to hold the state of each of the cells.  The user could save off the state of these JavaScript variables using the StateSpace plug-in by clicking on the [Save] or [Save As] buttons on the StateSpace interface within the browser window.  Later, the session could be recalled upon returning to the web page by clicking on the [Open] Button withing the StateSpace interface.

To make this work, three additional issues must be addressed;

(1) The user should be able to identify whether or not there is unsaved data simply by glancing at the StateSpace UI. There must also be a JavaScript function, for instance isSaved(), that returns a boolean value.  RIA Developers could then check the value when the page is being unloaded,  and warn the user that unsaved data will be lost if they navigate away.

(2) The StateSpace UI would have an INFO button that would provide access to various metrics about the JavaScript object available to be saved, most importantly the amount/size of the data-set being saved.  It could have an options panel where the user could set a maximum size-limit so that a warning message would pop-up if the object exceeded a certain size (for instance 1 megabyte).

(3) The StateSpace UI would automatically associate data-sets with the URL from which they were saved, so that the user knows which data-sets go with which URLS, and can easily retrieve their data from a prior session.  Obviously, it would also need to allow users to open data-sets created from different URLs too, if they desired to do so.

The StateSpace strategy would allow quite a bit of flexibility. A StateSpace enabled application could organize the JavaScript variables however it see’s fit.  For instance the application could have its own internal mechanism for subdividing data into “projects”, etc.  I would imagine there would ultimately be JavaScript libraries that simplified this task.

Please help me to identify any possible weaknesses or exploits.  Will it work? Am I missing anything?  Please comment (either publically or via email).

Uncategorized , ,

The Relevance of the Apple Macintosh

December 22nd, 2008

I spend entirely too much time thinking about and worrying about cross-platform compatibility.  This is because I love OSX and everything it stands for.  Coming from a UNIX background, it all makes perfect sense to me.  The Apple business model makes sense too; creating an exclusive hardware and software club with stringent requirements improves the quality and reliability of the Mac platform.  It is then poised as an upscale alternative to the conventional PC.  I’m also intrigued by Linux.  An open source alternative is a romantic notion.

But then reality hits.  I try Linux every few years, just to be disappointed.  Last time I installed it was a few years back.  It always seems to require massive amounts of research to figure out how to support the hardware.  There are always a few aspects of the computer that are compromised in the process, perhaps the video card doesn’t work quite right, or I can’t get the network card working, or I’m using some strange generic audio driver with lousy quality and/or excessive latency.  The thought that ultimately puts the nail in the Linux coffin is, “considering that I want to develop end-user applications, how many end-users in my target market have the patience and knowledge to utilize Linux as their desktop?”

I’ve owned two Macs.  In the Mac world you can’t be a value shopper, as I am.  If you are, then you will be obsoleted within six months of your purchase.  That’s what happened to me.  I first got caught on the tail end of the G3, and couldn’t upgrade to Tiger.  Then, I had my G4 for about a year and was told I’d have to upgrade to Intel Mac else be stuck in the dark ages.  I don’t know about you, but I don’t have $1500 to spend on computer hardware every year or so.  I sold my Mac and bought a Sony VAIO.  It may not be as sexy as a Mac, but it still runs all the latest software,  and it was a heck of a lot cheaper.

Back around 2000, when Apple was desperate for market share, they supported Java as an equal to Cocoa.  But in late 2005, Mac’s market share was big enough that Apple decided that Java should no longer support the latest OSX features (see their press releases).  (Its obvious to me that the Apple business model is to “get leverage and then rip, sucking people into the Apple vortex).  The iPhone frustrates me to no end.   At a time when no mobile platform has more than 20% market share, Apple’s decision to force us to use cocoa essentially destroys the ability of the little guy to compete in the market.  Companies are stuck developing multiple versions to provide their application(s) to all (or most) mobile platforms.  Only the gigantic corporations have the resources to do that.  Hey Apple, do you know that you are sticking it to the little guy?

My latest round of cross-platform analysis-paralysis was provoked by two things; (1) A recent news article claiming that 66% of all computers sold over $1000 were Macs, and that their total market share was around 12%.  I’m unable to find that article now, but I did find this one from October claiming Mac has a 9% market share, and (2) my recent search for new employment (which brings me to the inevitable conclusion that Microsoft .NET is slowly taking over the business world).  My own [unscientific] independent research shows that Mac’s market share is nowhere near 12%.  I think it would be optimistic to claim 6%.

It’s clear that if I want to continue to be employable, I have no choice but to be a .NET developer.  Not only is it taking over from a purely development perspective, but it is also taking over via value-added platforms, such as SharePoint and MOSS.  The latest numbers don’t lie.

.NET is slowly overtaking Java… Cocoa is a non-player;

java and sql, c# or vb.net, xcode and cocoa Job Trends graph

The Java portal is a dead dog and SharePoint is taking off;

sharepoint, jsr168 or jsr286 or "websphere portal" or "sun java system portal server" Job Trends graph

Adobe Flex is taking off, but Silverlight is hot on its tail.  Who knows what will happen with JavaFX.  Sun has yet to create the designer tool for it, so we probably won’t have an answer to that question for least another year;

adobe and flex, silverlight, javafx Job Trends graph

Vista looks to continue Microsoft’s tradition of Windows domination.  This chart has a smaller scale, so you can see that the popularity of cocoa has increased in recent months, no doubt because of the popularity of iPhone and Apple’s insistence that iPhone apps be written in Cocoa.  You’re kidding yourself if you don’t think this is part of Apple’s strategy to increase the sales of Macs (running XCode), and increase the number of Cocoa developers.  Outside of specialized markets, they just can’t seem to break into the business world.  The business world shows a declining interest in OSX, while Vista has clearly begun its march to market dominance. Not even iPhone can stop this trend.

.NET is winning the desktop race.

.NET is winning the web-app race, but PHP is hot on its tail.  Ruby on Rails is a viable solution to a problem, but if you’re hedging your employment bets, you’re far better off learning .NET, PHP, or JEE (J2EE).

Sorry, I’ve been ignoring C++.  This is because, despite what the C++ and QT pundits claim, I just don’t see C++ as a viable platform for business applications.  The continued popularity of C++ is largely a function of its applicability to embedded development.

In conclusion I have no conclusion.  I only have more confusion.  This is because I’m still searching for the silver bullet.  But there is no silver bullet, and technological religion has nothing to do with it.  If I want to be employable as a business-application developer, I’m stuck in the .NET or Java world.  I suppose if I worked near the Apple headquarters in California, I might have a shot at being a professional Mac developer.  If I develop in Java, I’m a second rate citizen on every platform (as you will discover when you go to integrate Java into SharePoint or MOSS on Windows, or when you read the hatred for Java in the Linux world, or when you read Apple’s press releases regarding the status of Java as a programming language).  I’m starting to believe my best bet is to be a .NET guru and hope that MONO and Portable.Net continue to grow in popularity and capability.

I fully understand the Ruby/Python/Linux crowd arguments.  I appreciate their certain distaste for my opinion.  I welcome their suggestions for how to make a viable living off developing Ruby applications.  But until they prove I can make a reasonable living off it, I’m going to be realistic and hedge my bets by sticking close to Microsoft… for now…

Uncategorized , , , , ,