Tuesday, March 06, 2007

"Lean And Mean", Or "Fat And Not So Happy"

As part of my recent babbling on collaborative development of OpenJUMP I repeatedly emphasized how I thought we should incorporate improvements and new features from JUMP “brands” like SkyJUMP and Kosmo into OpenJUMP. I said I thought we should do this as plug-ins rather than changes to OpenJUMP's core. I got the feeling that some of the other developers disagreed with me.

I wanted to take some time to explain my point of view, and give some reasons why I believe sticking to a pluggable design is very important. Please remember what follows is only my opinion, and is not intended to be critical or demeaning to the developers that feel differently than I do. :]

I was first introduced to the concept of a plug-in when I began using JUMP. However, I didn't really understand the concept of a plug-in until I started using Eclipse. I even bought an early book on Eclipse development, which took me a lot farther down the “Eclipse Plug-In” road than I ever intended to go. This journey did have some benefits, and I came to appreciate the real value of a plug-in system in modern software applications. After working with programs like JUMP and Eclipse, I found that I began to yearn for a plug-in system in all of the programs I was using on a daily basis. The best part of this learning process was that I realized JUMP's plug-in system was the best I had seen, even better than the one that is used in Eclipse. JUMP's plug-in sysem was simple but still allowed the plug-in developer to access the guts of the program without recompilation.

Still, JUMP's plug-in system has its limitations. I ran into some of those limitations myself when designing or thinking about the possible design for OpenJUMP plug-ins. That's part of what led to the hatching of Plan “A” for supporting plug-in dependency. I think these limitations of the plug-in system might be partly responsible for the proliferation of the different JUMP “brands”. If you can't implement your new change or new feature as a plug-in you have to modify the core, and it's a lot easy to just maintain your own fork of the code than it is to bother getting your change approved by the other OpenJUMP developers.

Although this “fork-the-core” approach to implementing new features and changes may be better in the short run, in the long run I think it is foolish. Some fragmentation is inevitable in an open source project, but now doubt everyone recognizes the less fragmentation the better off everyone is.

We shouldn't implement new features in OpenJUMP by making modifications and additions to the core unless it is absolutely necessary. Neglecting this type of policy leads to the “fat and happy” program that has every feature you need. (Not to mention it can lead to some pretty heated discussions when one developer's “essential” feature is another developer's “totally unnecessary” feature.) If people want a “fat and happy” GIS program they should pick up an ESRI ArcGIS license. At $2500 an extension they can be ransomed for all the extra functionality they need in a couple of bloated downloads.

We don't have ESRI's budget. We don't have their resources. We don't have there army of developers. We can't compete with “fat and happy”.

I think we can compete if we stick to developing an OpenJUMP that is “lean and mean”.
The OpenJUMP core should offer only the bare essentials of a functioning GIS program. Everything else should be packaged as a plug-in. This will keep our total program size smaller, and will give the user the opportunity to choose the functionality they need, not the functionality we think they need. This system will also force us to develop and maintain a plug-in system that really works well, because if it doesn't work well we will know about it. This will give OpenJUMP an edge over other similar programs that don't offer a plug-in system, or offer a plug-in system that functions poorly. You might summarize it this way, "If a user want's the all-in-one tool for GIS they'll choose a commercial program like ESRI's ArcGIS. If they're looking for a small and fast desktop GIS that they can easily customize for they're needs, they'll go with OpenJUMP."

A good plug-in system is important for another reason. It allows the “curious” developer or user to add functionality to the program in small steps, learning about the program code “as-they-go”. Trying to understand all of OpenJUMP's code, and to then trying to get it building and running successfully would be a great challenge to the novice developer. Plug-ins are the “training wheels” that take this type of novice developer and gives them the knowledge and confidence they need to make larger contributions and improvements.

If you want to add a new feature to OpenJUMP, do it with a plug-in. If it seems like your new feature can't be implemented as a plug-in, take another look. Pretend for a minute that you didn't have access to the source code in the core, and still had to come up with an implementation. If it still seems like your new feature can't be implemented as a plug-in, think about changing the core. But don't change the core to implement your new feature. Change the core so that your new feature can be implemented as a plug-in when you are done.

(As an example, I wanted to see if I could add a new renderer to OpenJUMP. This wasn't possible without modifying OpenJUMP's core. Instead of modifying the core to “hardwire” my renderer into OpenJUMP I found a way to make renderers “pluggable”. This meant the next guy would be able to implement his new renderer as a plug-in, instead of hardwiring his addition into the core as well.)

Remember, we want “lean and mean”, not “fat and happy”. If you don't beleive me, just ask any of those pretty girls at the beach. They'll tell you what they prefer. :]

The Sunburned Surveyor
Posted on 9:18 PM | Categories:

Kosmo - What fruit will you put in your basket? (Kosmo)

The last couple of weeks there has been some great discussion on a handful of different topics. Most of this discussion has centered on one of the JUMP 'brands” called Kosmo. Kosmo's development team has shown interest in contributing to the development of OpenJUMP. This has us very excited, as Kosmo contains a variety of great enhancements and new features. There were a few different ideas about how this collaboration with Kosmo could take place, and even some suggestions that we “jump” to Kosmo's code base. I wanted to take some time to talk about Kosmo and some of these ideas in a little more depth.

Kosmo demonstrates a very important reality. This is a reality that is important not only to OpenJUMP, but to other efforts at producing open source GIS software. Kosmo is currently maintained by 9 full-time developers. That wasn't a typo. You read it correctly. I said 9 full-time developers. Now I realize that 9 full-time developers is chicken feed to a lot of big software development corporations, but for a small open source program like OpenJUMP 9 full-time developers is an amazing commitment. (For OpenJUMP even 1 full-time developer would be an amazing committment.) I don't even think JUMP's parent company Vivid Solutions has the resources to throw 9 full-time developers at JUMP.

Kosmo's bold development of the JUMP code base shows us two important things:

[1] Given a serious commitment, an open source program like OpenJUMP can produce serious results.
[2] OpenJUMP/JUMP is a viable platform for commercial development and support.


If nothing else, Kosmo is worthy of mention and merits a measure of respect on for its demonstration of these 2 things alone.

I must, however, urge some caution and a little bit of restraint. I think the team maintaining Kosmo is doing some great work, and I hope we can tap into that work to improve Kosmo and OpenJUMP at the same time. However, we must not loose focus of some important traits that make OpenJUMP worth our time and energy. Traits that may not be shared by Kosmo. A lot of these traits I've mentioned before, when we talked about merging with Vivid Solution's JUMP core. But I'll take a few moments to mention them again.

The maker's of Kosmo are running a for-profit company. There is nothing “wrong” or “evil” about running a for-profit company. I work at a for-profit company, and if the owners didn't make a profit I wouldn't be able to pay my rent. Nor is there anything wrong with making money from the support and/or development of an open source program like JUMP. However, it is important to remember that the fate of Kosmo lies in large part with a single entity. This is a single entity that is driven by one primary goal. Profit. Sometimes the goal of profit creates no conflicts with the goal s of the user community, and sometimes it does.

Remember that OpenJUMP offers something that Kosmo and even Vivid's JUMP do not. Community driven development and maintenance. You don't have to worry that profit will taint decisions about how we will manage or maintain OpenJUMP's code base. Our decisions about OpenJUMP are always made with the best interests of our user community in mind, within the reasonable limits of our own natural biases and prejudices.

This community driven development philosophy means that we can achieve goals in OpenJUMP that we might not otherwise be able to. We can keep our code base lean and mean, without the pressure to continually add more and more features. We don't have to sacrifice code quality for the sake of a corporate deadline. We have the liberty to explore new features just because they interest us, not because its what a paying customer is willing to foot the bill.

Kosmo contains some really neat “stuff”. I'd love to see some of that “stuff” in OpenJUMP under the right circumstances. However, lets not forget that we develop OpenJUMP to appeal to a global community, and I think our focus with OpenJUMP is larger than the typical corporate agenda.

Some of the other developers have mentioned concerns about Kosmo's size and external dependencies. I think that these are valid concerns. Instead of adopting large chunk's of Kosmo's source code wholesale, lets be picky customers, considering carefully each piece of produce that is placed in our basket for inclusion into OpenJUMP.

The Sunburned Surveyor
Posted on 8:24 PM | Categories: