Party Of One: Develop

May 14th, 2008

As mentioned in the introduction entry, every one-man hobby open source project has three main parts – development, maintenance and promotion. Today, i’m going to talk about where it all starts, and, if you’re not careful enough, where it all ends.

It all starts, of course, with the development. You take an idea and you put it to a virtual life. This is perhaps, the most enjoyable part of a new project, at least for some of us. This is the time where everything seems possible, where there are no implementation complexities, no bugs to fix and no annoying support requests for esoteric environments. Even if you are doing this on your free time, it doesn’t take a lot of commitment to just sit down in front of your favourite editor and start banging away. It is also, unfortunately, a time where a very sizeable percent of the projects simply die.

It takes a serious commitment to continue developing a new project on your own free time, at the expense of your other hobbies and sometimes even a family. This is not only being enthusiastic about your idea. It is about being passionate. If you’re not passionate about the idea in particular, and about its field in general, you might as well not start at all.

There are three main aspects of the development. These are most certainly not specific to one-man projects. However, due to the very nature of such projects (when that one man leaves, the project is no more), not planning the development cycles in advance can have very adverse impact on the project’s ability to survive in the wild ocean of today’s open-source.

The majority of successful open-source projects (no matter how big the development community is) have a very clear set of tenets. This is sometimes referred to as project goals, vision, direction or guidelines. While the tenets do not need to be set in stone, it is crucially important that a project has a clear, concise and simple definition of what it aims to do. A clear project vision helps immensely in deciding what goes in and what stays out. It helps the users to understand whether the project fits their needs, and it makes sure that the project does not end up being a jack of all trades, and master of none.

It is certainly not my intent to create a bad impression on this specific project, and i’ll let you judge its vision on your own:

[…] is a high performance, vastly scalable, embeddable, internet-centric client/server computing platform with a breakthrough adaptive runtime technology.

Speaking only for myself, this is full of buzzwords and marketing speak. Too much information is crammed in here, with too many generic overused words. I had a hard time remembering it a few days after seeing it on the net. Now, compare it to these very focused and plainly-worded tenets of FormLayout project:

It is a very simple and down-to-earth list. It is also very memorable. The entire library is driven by these four statements which set the clear rules for what goes in and what stays out. It doesn’t claim to want to be the best for everybody, and it doesn’t proclaim to provide a solution for all possible scenarios. Instead, it focuses the APIs around a simple and coherent vision, and even explains why some things (that the author considers bad) are hard to achieve.

I will talk about the features in the next entry, but for now i’d like to skip to the third facet of the development – the release schedule. Here is a real example of one of the projects hosted on SourceForge, illustrating the “anti-pattern” or release schedule planning:

On the face of it, everything looks good. There have been eleven releases over the last six years, and the project looks quite active and maintained. However, there are two big sore points with this table – the leading zero in version numbers and the ever increasing time span between consecutive releases.

In this particular case, even the project’s developer does not consider it to be worthy of “1.0” release label. One might say that it is a minor thing which has nothing to do with the actual quality of the project. However, the outside looks count and not only in real life, unfortunately. As cliche as it might be, dress for success is a very good advice, and in virtual world this means stripping the alpha / beta / 0.* status from your project. You have very short time window to impress the potential users, and a solid release number with no greek letters is a must-have. This is the least you can do after six years of development.

The second sore point of this specific project is the ever-growing time frame for each release. It took 2-3 months for the first six (when the initial level of commitment was quite high), which then dropped to 4-6 months for the next two releases, and 11-14 (and counting) for the last two. The potential users that seriously consider investing in your project (using, sending bug reports or even contributing bug fixes) might be rightfully scared by such a trend.

To each his own, but i found that the following release schedule works best for me:

Here, i have three minor releases in between each pair of major releases. I give ten weeks for .1 and .2 release (more on the inner structure of each release later), twelve weeks for .3 release and twenty weeks for the major .0 release. The extra two weeks in the .3 release cycle are spent on code health which will be the main topic of the next entry. The extra ten weeks in the major .0 release cycle are spent on code health, removing all dead code and deprecated functionality (even if it means breaking binary compatibility and existing clients) and allowing the early adopters some time to test the changes and adapt their applications.

There are quite a few advantages of having a regular and predictable release cycle. As long as you commit to the planned release cycle, it allows your users (existing and potential) to align their plans and schedules and make sure that they are not going to slip their schedule because of you. It also gives a very important outward sense of stability and predictability about your project. In addition, it puts a quite welcome (if not necessarily obvious) pressure on making sure that you continue actively looking for the new ways to improve your project.

I’d like to elaborate a little on the last point. When you only have ten weeks for a minor release, you need to be constantly aware that the release must be “justified”. Allowing yourself to postpone your work on the project just because it’s summer, or just because you met this great new girl, or just because there’s some pressure at work is a luxury that a one-man project simply cannot afford. The more you postpone, the more it becomes a norm, and the end result is seen in the previous slide (going from 2-3 months to 11-14 months in between releases). Waiting for a “perfect moment” to work on all those great new features once you get enough free time does not work. The more time you spend away from the project, the harder it becomes to get reacquainted with it when you get back. When you think in terms of “next weekend” instead of “tonight”, it becomes very easy to postpone it to yet another weekend and the one after that, especially if you’re waiting for a chunk of 10-12 straight hours that you want to dedicate to it.

“Justifying” the release means that you need to show compelling reasons to take a new version. It includes bug fixes, performance improvements, reduced memory consumption and new features. When you only have ten weeks to work on a release, it becomes a cycle that feeds itself (just like getting into the habit of postponing the development is a cycle that feeds itself). Developer’s work is never done. We’re constantly striving to expand our knowledge and grow professionally, and this means that the code we wrote yesterday will ever be questioned tomorrow. The project may be “good enough” to some, but the really successful projects are never good enough in the eyes of their developers.

This release cycle has a nice side effect – it adds up to 52 weeks in between the major releases. This means that your project will have a major release once a year, further strengthening the outward appearance of both stability and progress.

The next entries will continue talking about the specific project tasks.

  • Part 3 talks about the maintenance
  • Part 4 talks about the promotion
  • Part 5 summarizes the discussion

The image is available under Creative Commons Attribution NonCommercial license from the following flickr.com stream:

Last week’s JavaOne had a separate track on open source, and there’s been a substantial number of very interesting panels, discussions and presentations. However, i felt that these talks concentrated mostly on big, well-established and very broad open-source communities. While it is perfectly understandable, the few dozens of these high-profile communities do not reflect the specific problems of a much vaster landscape of the open-source in general. Here I’m talking about literally hundreds of thousands of projects that only have a single active developer. I call it the “party of one” type of project, and these pose a number of quite significant challenges to their “owners”, especially if it is done as a part time hobby. I had a number of such projects (where i am the only developer) over the last decade, and some of them are still quite active. This series talks about the specifics of one-man projects and how to maintain a long-term level of commitment.

First, a little bit of statistics from SourceForge:

Statistics, of course, can be used to back up pretty much any point of view, but i do believe that the numbers above are a good reflection on what happens when a developer out there has an idea. Nowadays, it is extremely easy to find a free web-based code repository and wait for the entire world to come. However, the absence of any entry-level barrier to create a project quite often results in the idea being just that – an idea. Just over half of SourceForge projects have any kind of downloadable content, and i’m sure that you saw your share of great ideas that died once their creator faced the first major implementation hurdle (or even when his level of interest in implementing the idea never matured to the actual coding).

While it is difficult to create even a first implementation, it is even more difficult to maintain the level of commitment and arrive at a stable release. As you can see, only one in every six projects were deemed to be stable by their own developers.

When all you need to create a project is an Internet connection and enough imagination to come up with a name, you have another interesting side effect. While every project has a potential to reach millions of developers, they all compete for the eyeballs and attention span of those few tens of thousands that are looking. You can have a great idea, you can even have a great implementation, but most certainly you can’t expect everybody to come. It is a big world out there, and the competition for the attention is even bigger.

It takes determination, commitment and perseverance to be willing to continue working on a project when nobody but you seems to be interested in it. It takes discipline and clear prioritization to understand that while coding is fun, every project has less pleasant (to us as the developers) tasks, such as bug fixing, testing, documenting and promoting. It doesn’t matter if your project is big or small. However, if you’re the only one working on your project (and here is specifically don’t use “the only developer”), you don’t have anybody else to do the “boring” tasks. And without understanding what these tasks are, and being ready to step up and make sure that all these secondary tasks get done – you might as well not begin in the first place.

 The next entries will talk about the specific project tasks.

  • Part 2 talks about the development
  • Part 3 talks about the maintenance
  • Part 4 talks about the promotion
  • Part 5 summarizes the discussion


The images are available under Creative Commons Attribution NonCommercial license from the following flickr.com streams:

Here are some Swing links that you might have missed during this week:

  • Christophe Le Besnerais has a custom implementation of Paint interface to paint a glossy button with arc-shaped gradient. Paint is one of the more advanced concepts in Java2D and it’s tricky to create a performant implementation. The only visual thing that is missing for here in the whole “web 2.0” concept is the soft-clipping along the arc itself (especially visible if you change the value of the third slider that controls the color of the top part. Chris Campbell has written about this problem before, and his solution involves an intermediate image.
  • Roman Kennke posts an update on progress of Caciocavallo project that aims to create an AWT implementation for X Window System without using any of Sun’s internal classes.
  • Jacek Furmankiewicz continues working on the SwingBuilder project, adding more support for bindings, long running tasks and integration with Commons Validation.
  • Hans Muller‘s swan song has been sent to the users mailing list of AppFramework (reference implementation of JSR 296). I have already mentioned that this project has been effectively dead for the last six months, and Hans has quite a long list of to-do things in his posting. This project has been heavily promoted throughout the entire desktop track at JavaOne this week, and even though Amy Fowler assures that it will continue to be developed, it would be wise to wait and see if the words are backed by @Actions :)
  • Geertjan Wielenga writes about using Maxim Zakharenkov‘s SwingExplorer inside a NetBeans module.

And some stray thoughts on JavaOne:

  • Underpromise and overdeliver. Good example – the playback video support for JavaFX and Java. Bad example – javafx.com.
  • I wonder why the video support hasn’t been featured more prominently during the keynote (instead of the frozen single-threaded demos). This is a very significant step forward for client Java, much more so than glitzier eye-candy dragging applets to the desktop. On the other hand, when the hype is that applets are back, who am i to judge?
  • I was almost hoping that the video support would address the number one wish i had for desktop Java in 2008 – cross-platform support for H.264 and FLV. We’re still not there yet – the cross-platform codecs are rather unknown in the general desktop area (one from On2, and another from the Open Media Commons project that has yet to deliver any binaries), and H.264 and FLV will only be supported when native codes are installed.
  • And no, those were not 200 different video streams mapped on the rotating cube. Those were 200 different views on a handful of different video streams. Still impressive.
  • The best presentation that i have attended did not use a single slide from Sun’s template. Those of you who are familiar with work of Garr Reynolds and Nancy Duarte should already know the answer to “why?”, and Ben Galbraith’s reputation has apparently allowed him to swerve past Sun’s lawyers and copywriters to present a very strong, clean and focused talk on user and interaction design.
  • And while we’re at it – do we really have to ruin every single session title and slide that use the word Java? I think we can figure out if Java is Java™ technology, Java™ platform or Java™ programming language by ourselves . At least they didn’t turn “Effective Java” into “Effective Java™ Programming Language”…
  • Literally bending and picking ugly things off the stage, having dozens of people come and go, showing IDE screens with 50+ lines of code, demoes freezing on the most important day of the year. Makes one wonder why Steve Jobs’ presentations get so much hyped before, during and after…

We’ve just finished presenting our Birds-of-Feather session on high resolution monitors. Thanks to everybody for coming at such a late hour, and thanks to Mike for presenting this session with me. To all of you who attended but want to see the slides once again, and to those of you who couldn’t attend, here are the slides: