Now that the Ruby Mendicant Project has come and gone, I owe the community a summary of what was accomplished, and what it was like to take 6 months off of work to hack on open source for the community. I will start off by saying that I will make every effort to keep this summary concise. This is not because that there isn't much to talk about, or because I'm too lazy to type it, but because much of this story is best told in person, in the form of a conversation.
Of course, since it's unlikely that I'll be able to meet face to face with everyone who might be interested in this project, I'll do my best to quickly summarize things here and encourage folks to contact me directly if they've got questions or want to know more.
I didn't realize this until the moment I started writing this post-mortem, but if you google "I'd love to quit my job", the blog post that started Ruby Mendicant appears first on the list (as of 2008.11.14, at least.)
This is still surreal to me, because I absolutely wrote that post as a joke, or wishful thinking. I asked if people from the community would give me donations so that I could work on unspecified open source projects. Though it wasn't quite a blank check because I was willing to share my ideas before donations ended, it was much more open ended than a bounty. Because those who would donate wouldn't know exactly what I'd be working on before I closed donations, and because their money wouldn't be refunded if I worked on a project that wasn't interesting to them, it required a certain amount of trust and altruism for people to contribute to this project. Impossible!
But let's fast-forward. A couple weeks later, Ruby Central, Inc. is agreeing to match dollar for dollar up to $5000, and all I have to show for myself is some pitiful looking wikidot proposal page that outlines my crazy-ass idea. At this point, I'm thinking that if I get two weeks off of work, I'll be jumping for joy.
But we step forward a couple weeks in time, and the impossible becomes real. In less than a month 70 individual donors have contributed and MountainWest / Ruby Central have done enough matching where I'm up to $11000, enough (according to my rough calculations, to take 22 weeks off of work
These people are the ones who made it possible, and there isn't a day that goes by where I don't think of what they did for me. There was no possibility of a tax deduction, because I'm not a charity, yet these folks put their trust and support into me anyway. The feeling that there are genuinely nice people out there who support fringe ideas like this... that's worth more than the donations themselves.
By April 2nd, I had selected my project after lots of feedback from the community, which ended up being Prawn. This project was meant to fill in a lot of holes that too many people were tired of falling in to. After a couple weeks of staring at the massive PDF specs, Prawn was doing basic graphic operations. No longer an abstract idea, the real work had begun
I decided I wanted to pledge hours instead of features, because I was afraid that I'd misgauge what we could accomplish and set expectations I couldn't live up to. I also didn't anticipate much help on this project up front, so I was trying to be conservative. However, I did have some specific goals in mind, and made them clear up front
I laid all these claims on the line, first in a lightning talk at GoRuCo. Several weeks later I was talking at the Oklahoma Ruby Group and we'd accomplished almost everything except for those last two goals. A few days later I gave a short talk with a sensationalist title at Hartford.rb, Killing PDF::Writer in 7 features or less.
This talk wasn't necessarily saying these 7 features were all we needed, or that we were even remotely ready to stand on solid ground against PDF::Writer. But it showed exactly the 7 features which would ring the death knell down the line. There was a certain amount of joy in being able to say Prawn was doing things no other Ruby PDF library was doing, even if there was still much work to be done.
Of course, soon after this, the honeymoon was over. By the time Prawn was released, people were already beating down the doors with feature requests, bug reports, and contributions.
As new features creeped in, new bugs came with them. Performance tanked as bottlenecks were introduced, and "Fast, Tiny, Nimble" became more of a goal off in the distance. Sure, Prawn was still faster, tighter, and more flexible than most other options out there for Rubyists, so public interest continued to grow. More and more people were telling me they just ditched PDF::Writer, or FPDF, and that they're putting their chips behind Prawn. As exciting as this was, it was also a disaster, because it meant that people actually would start depending on Prawn, long before it was ready for that kind of attention.
This pretty much sums up the project. There was an exciting and steady ramp-up to 0.1, and a turbulent and wild ride to 0.2. But the path to 0.3 has been long and hard. PDF is like an onion, and every layer we peel off reminds us how much we don't know. About a month before the Mendicant project ended, I polled folks to see whether they wanted me to keep pushing features forward or focus on performance and stability. The overwhelming response was in favor of the latter, and that is why things have been quiet on the outside, but very active behind the scenes for the last several months
What has amazed me though, is the overwhelming amount of support the community has offered, in the form of code contributions and through our logo contest. For a hard, low level project in its early stages, this list of contributors is impressive to say the least
These folks really made my job a lot easier. Hell, Prawn would flat-out not exist without James Healy, and the rest of the people on this list all had their part in making this thing possible. Although Ruby Mendicant is about my efforts on this project, Prawn has a vibrant community of its own that when added up, amounts to something much bigger than I could ever imagine
Despite the fact that I had a lot of help, I still need to report on what I actually did so people know where the money went. It turns out most of the critical goals of Prawn were accomplished, and through community contributions, we managed to attack problems I never thought we'd come close to touching.
The only real goals that got set back were the aggressive push towards feature parity with PDF::Writer, and the integration of Prawn with Ruport. I had planned to do this in the later parts of the Mendicant project, but shifted towards solidifying the core (which is what I'm still doing), because people agreed that was the most important part. I severely underestimated how many subtle problems we'd run into, and for this reason, we've halted forward development and plan to make things solid like a rock before integrating Prawn with Ruport. This will result in much less frustration for our users all around
At this stage, Prawn may be usable in production for certain needs, but is not production-ready or API stabilized. What this means is that things are changing quickly, and that there may be bugs that you would not expect in a post-1.0 project cropping up from time to time. But I am happy to announce that at this point in time, Prawn is useful and usable for many purposes. If you have a side-project you're working on or some non-mission critical production work that needs PDF, you should definitely try it out
So, in general, Prawn has exceeded my expectations, and seems to be rapidly gaining community adoption, which I see as a sign of Ruby Mendicant's success in and of itself. Having extra free time to educate new contributors and provide good support materials such as API documentation, detailed examples, and specs have really paid off
The real sticky point is that I came up short of hours. Even after extending the program by two weeks, I had only completed 336.25 of 440 pledged hours. This may be due to the fact that rather than treating my work on Prawn as a 'job' and recording the hours I spent doing that job day to day, I recorded hours as if they were billable contracting hours, only recording time when I was actively working on something. Another contributing factor to the lack of hours was that I severely underestimated my expenses, as I didn't account for travel at all and had no savings going into Ruby Mendicant. That means some of my time was spent on contracting work even though I didn't plan to. I could have asked for more donations, but preferred to avoid seeming greedy.
So, I feel like I've essentially accomplished most of my goals, fell short on a couple, and was deeply overwhelmed by all the unexpected support that added tremendous value on top of the work I did. I have a gut feeling I've been a harsher critic to myself than the prospective Prawn user might be, so all in all, I think the program was an epic win, despite some setbacks along the way. I hope you feel the same.
I tried to continue to record hours on Prawn after Ruby Mendicant officially ended, in order to 'pay back' my pledged hours. But this ultimately looked like a joke: I will likely do little bits of work here and there as bug reports come in, then spend some days in long sprints when I can free up time. The resulting time record from such things looks silly and doesn't mean anything, so I decided to cut out this mundane part of the process of working on Prawn
Instead, with about 60 hrs of time left owed to the community, I've pledged myself to a timeline that will end up taking much more work than that. The reason for this is that I'm not going anywhere. I think everyone knew that at the time I started the project, and it's worth saying it now: I'll be sticking around for a while.
The immediate plans are to get a Prawn 0.3 which is faster, tinier, and more nimble than Prawn 0.2, out the door by December 15th. Future plans include a Prawn Powered Ruport 2.0 by February 15th, and a PDF::Document version 1.0 (by that time, that'll be Prawn's new name) by June 15th. Though these dates don't reflect the aggressive schedule Prawn was on over the last 6 months, the represent something that is attainable, and something we'll be working hard on making into reality.
Ruby Mendicant was a rewarding, wonderful, painful, difficult, complicated, surprisingly successful project. I would recommend trying this to others, but only if you have a certain mindset, and there are lots of things I would do differently. Please contact me directly if you'd like to talk about this: