wonko.com

Hi! I'm Ryan Grove: Sorcerer at SmugMug, lover of movies, eater of pie, connoisseur of awesome.

Posts tagged with “open source”

Displaying items 1 - 10 of 10

YUI from the inside

Remember when I complained about YUI's opaque governance model and lack of external committers? They've fixed it!

These changes have been a long time coming and most of them were already in the works when I wrote that post, but I want to thank the YUI team for listening to me and to others in the community and making things better.

New contributor model

At YUIConf last month, Dav Glass announced YUI's new contributor model in his keynote. He also announced the first two non-Yahoo! committers in YUI's history: me and fellow SmugMugger Luke Smith.

The contributor model is based heavily on the Meritocratic Governance Model and outlines the distinct roles (users, contributors, committers, and reviewers) within the project, as well as their rights and responsibilities. It also defines a decision-making process based on lazy consensus, which is designed to prevent roadblocks.

But perhaps the most important thing Dav announced—and certainly the most surprising—is that most of the YUI team are committers, not reviewers. This means that even though they're Yahoo! employees paid to work on YUI, they have exactly the same rights and access as external committers, and any significant changes they want to make must be approved by a reviewer. It also means that their votes carry no more weight than the votes of external committers.

This is a bold move designed to ensure that the YUI project is truly in the hands of the community and can't be too heavily influenced by Yahoo!. While there's currently only one reviewer—Dav—I'm told the team hopes to add non-Yahoo! reviewers in the future. This fills me with joy.

More transparency

In addition to posting more development details on YUI's GitHub wiki, the team at Yahoo! has opened up their weekly meetings to external contributors and users via Google+ Hangouts On Air.

Every Thursday at 2pm Pacific Time, YUI users can join the hangout (or just watch it live on YouTube) and discuss project decisions, pull requests, and more with members of the YUI team at Yahoo!. This is the same weekly meeting I attended while I was on the team, and the same discussions take place, only now they're open to the world and recorded for folks who can't catch the live hangout.

The weekly hangout isn't the only forum for discussion, though. Ad hoc hangouts occur frequently and are announced on IRC, Twitter, and the YUI Blog. Pull request activity has increased, and the new contributor mailing list is spinning up.

Eric Ferraiuolo held a great community town hall at YUIConf in which he laid out his vision of how the YUI project can embrace its community and be more open.

Gallery 2.0

YUIConf also served as the backdrop to Dav's introduction of a vastly improved process and tools for contributing and maintaining YUI Gallery modules. Everything I complained about was addressed, and because he's Dav, he also added a significant helping of awesomeness that I hadn't anticipated.

The Future

I'm excited about YUI's future. Yahoo! has shown a willingness to listen to criticism and address the project's problems. The community asked for more transparancy and more control, and Yahoo! gave it to us. Now it's up to us to make YUI what we want it to be.

Like any long-lived project, there are parts of YUI that are new and awesome, and there are parts that are old and crufty. Those old and crufty parts have often been frustrating to YUI's users, because it hasn't always been clear how we can improve them.

In my YUIConf talk, I advocated not using certain parts of YUI and thinking carefully before using others. I'm eager to tackle YUI's "bad parts" and improve them, especially now that I feel like I really do have the power to influence the course of the project despite no longer working for Yahoo!.

As I said during Eric's town hall at YUIConf, "the YUI team" used to mean "the Yahoo! employees who work on YUI". Now, that's no longer the case. There are still Yahoo! employees who work on YUI, but referring to them as the YUI team feels wrong, since that "team" now includes anyone who contributes a pull request or takes part in a hangout or offers a suggestion on the mailing list.

It sounds corny, but we're all the YUI team now, and that's exactly how it should be.

Why I believe in YUI

Some people mistook my blog post last Friday as a condemnation of YUI, or of the YUI team. I’ve heard that the team is feeling some heat as a result, and this is unfair. I want to set the record straight, and I also want to apologize for my part in the negative tone this discussion has taken in some quarters, since that’s not helping anyone.

Credit where credit is due

First, I want to make it clear that the YUI team is fully aware of every problem I mentioned. Nothing I wrote in that post was news to the team, and they’ve been working on some of those problems for a while now. If the YUI team were to fix every single one of those problems tomorrow, it would be because they’ve been busting their asses for months, in some cases years, to solve them. It would not be because they read about them on my blog.

If I thought the YUI team were unaware, unwilling, or incapable of fixing these problems, I would fork the project and be done with it. I’m not doing that, because I believe in the team and its leadership, and because I know how resilient they can be in the face of seemingly unsurmountable obstacles. If I thought YUI couldn’t or wouldn’t change, I wouldn’t have wasted my time writing that blog post.

That said, YUI can’t succeed in overcoming these obstacles without the community’s help. And the community can’t begin to help until the YUI project becomes more transparent, less secretive; more of an open source project and less of a Yahoo! product.

The team is not entirely to blame for this. I’ve been in their shoes. I know exactly how easy it is to slip into the mindset of working on a product instead of on a community project, and how hard it is to remember what it means to work on an open source project when you’re being paid to spend eight hours a day in an office (even if, as in my case, it happens to be a virtual office most days).

It’s not the team’s fault that Yahoo! itself tends to see YUI as an internal product meant to serve the needs of internal customers. Nor is it really Yahoo!‘s fault. A publicly traded company can’t be expected to fund projects that don’t serve its bottom line, so YUI must serve Yahoo!‘s bottom line. YUI exists because Yahoo! needed a shared JavaScript and CSS library. It would be a waste of time and money for every Yahoo! product to build its own single-use framework. YUI is only public because the developers working on it, and the engineering managers who’ve led the team, wanted to give something back to the web and convinced the company to allow them this indulgence.

Yahoo! and YUI should be commended for this.

But what Yahoo! and the YUI team need to understand — and this is the source of my recent frustration and the reason for my blog post on Friday — is that, if they’ll let us, there’s a whole lot the web can give back to YUI, and to Yahoo! as well. In order for that to happen, Yahoo! and the YUI team need to change some of their ways of thinking and challenge some of the ways they’ve historically done things.

My blog post on Friday stemmed from my frustration at how it feels to be an outsider wanting to contribute to YUI — frustration that I probably wouldn’t feel so acutely if I hadn’t had the experience of contributing to YUI from the inside. I wanted to be frank, but I also wanted my criticism to be constructive, which is why I suggested solutions instead of just complaining.

It wasn’t my intent to be discouraging, and I think I probably should have waited a while and written that post from a place of less frustration. I stand by what I wrote, but I regret that it was couched in negative emotions. I owe the YUI team an apology for that.

Good news

Since Friday, I’ve heard a few encouraging things from individual members of the YUI team that I’d like to share.

  • I’m told that the team is planning to be more proactive about managing and responding to pull requests. I’m already seeing increased activity and transparency on pull requests, which is awesome.
  • YUI hopes to be able to provide commit access to trusted non-Yahoo! committers soon. This was already in the works, unbeknownst to me.
  • Dav Glass has big plans for Gallery 2.0 — some of which are already in the works — and my complaints certainly weren’t news to him. In fact, the solution I proposed in Friday’s post was directly inspired by much of the work he’s already done on making the rest of YUI more npm-friendly and easier to build and maintain, so my proposal isn’t news to him either.

I haven’t heard much else yet, but I do get the sense that the team generally agrees with the need for more transparency and more community involvement.

I want to stress that these changes (and any other changes you see from the YUI team in the near future) aren’t my doing. All I’ve done, if anything, is provide a little bit of a window into the sausage factory.

On the awesomeness of YUI’s engineering managers

I’d like to take a moment here to kiss some asses, because frankly, these asses deserve to be kissed and don’t get nearly enough credit.

The YUI team currently has, and has always had, fantastic leadership. From Thomas Sha (who founded the team) to Eric Miraglia (who managed the team for over five years) to the team’s current manager Jenny Donnelly (herself a former YUI engineer), YUI has been led by the best engineering managers I’ve ever worked with.

I want to single out Jenny in particular, both because she’s the team’s current manager and because she keeps a pretty low profile and lets the kudos go to the engineers she manages, which prevents her from getting the credit she deserves. If you’ve been to YUIConf in the past few years, Jenny’s the person who made it happen, and she’s the one you saw running around making sure everything went smoothly — often (as luck would have it) while also extremely pregnant.

Jenny, like Eric and Thomas before her, is an engineering manager who gets it. Any engineer can tell you how truly rare and valuable this is.

If there’s one thing I regret about my blog post last week (and, let’s be honest, there are several things), it’s that Jenny will probably take heat for it, and she doesn’t deserve that. Jenny is as passionate about YUI and YUI’s community as anyone, and more so than most. She’s one of the best things YUI — and Yahoo! — has going for it.

I have full confidence that Jenny and the rest of the YUI team will, with the community’s help, overcome the challenges facing the project and that YUI will continue to be one of the best JavaScript libraries in the world. You should too.

On the awesomeness of YUI

Like any project worth caring about, YUI has problems. All software projects have problems. Particularly open source projects. The difference between an open source project with problems and any other project with problems is that an open source project’s problems ideally get discussed and dissected in the open.

Please don’t confuse my attempt to discuss YUI’s problems in the open for an attempt to convince people they shouldn’t use YUI. That’s the last thing I want, especially since I personally use YUI and want to see it thrive.

My personal decision to stop contributing to YUI until I feel my time is better respected doesn’t mean I’m going to stop using YUI, and it doesn’t even mean I’m going to stop working on YUI itself — it just means I don’t plan to contribute that work upstream until the process has been smoothed out.

If you currently use YUI, there’s no reason to stop. If you don’t yet use YUI, you should consider it. It’s a fantastic library, and it’s still my first choice.

YUI from the outside

Update, 2012-09-10: I’ve posted a followup to this post entitled Why I believe in YUI. Please read it.

When I quit my job at Yahoo! a few months ago, it didn’t feel like I was really quitting. I was leaving the company, sure, but I still planned to continue working on YUI, even though Yahoo! would no longer be paying me to do it. Getting paid to work on an open source project has many benefits, and one of them is that if you love your job, you can keep right on doing it even if you decide to leave the company.

I’m extra lucky that my new employer loves YUI, uses it extensively, and is more than happy to let me contribute the work I do back to YUI whenever it makes sense. Since I left Yahoo! I’ve sent ten pull requests to YUI. Some for minor bug fixes, enhancements, or performance improvements; others for brand new components like LazyModelList, Template.Micro, and node-scroll-info.

This has been one of the most frustrating experiences I’ve ever had contributing to an open source project.

Pull request graveyard

Even though I’m still in touch with the core team and talk to many of them on a daily basis, several of my pull requests sat in limbo alongside over 40 other open pull requests on the YUI 3 project (some dating back nearly a year). Compare this to jQuery, which — despite being more popular than YUI — currently has only 22 open pull requests, none older than two months.

Not all my pull requests were large. One was a minor change that fixed a critical performance bug in Y.Attribute#getAttrs(). Another was a minor change that improved the performance of Y.merge(), a core utility method used throughout the library. In both cases, the pull requests sat unreviewed as release windows passed them by, even though reviewing them would have taken minutes.

No external committers

Why send pull requests? Why not just commit these minor changes myself? Because there are no YUI committers who don’t work for Yahoo!. Despite having been a trusted senior member of the core team for over two years, I lost commit access to YUI the instant I stepped off the Yahoo! campus for the last time.

What many people don’t know about YUI is that the YUI GitHub repository is just a read-only mirror. YUI’s actual source-of-truth repo lives on a server inside the Yahoo! corporate firewall, and can only be accessed by Yahoo! employees. The reasons for this have to do primarily with typical Yahoo! bureaucracy and not with any desire on the part of the YUI team to exclude external developers, but nevertheless, that’s exactly the effect it has. YUI has many external contributors, but the only way to get commit access is to draw a Yahoo! salary.

The YUI team also has no actual set procedure or policy for dealing with pull requests. In theory, when budgeting time and making development estimates for each release cycle, team members are expected to budget time for handling pull requests, responding to community questions, etc. In practice, the team members who actually care about that stuff make time for it, and the ones who don’t care as much don’t make time for it. So some team members respond to pull requests, hang out on IRC, and drive YUI’s community engagement efforts, while others are completely invisible and unreachable to the YUI community.

Unfortunately, some of the team members who don’t care very much about engaging with the community outside Yahoo!‘s walls are also very senior members of the team who “own” many important parts of the library. Because they avoid spending time interacting with the community, they’re often out of touch with what YUI’s users need and care about, and tend to say “no” far more often than they say “yes”. They also tend to either ignore pull requests or excuse themselves from dealing with them by citing how busy they are.

As a result, some of the most important parts of YUIY.Node, Y.Event, Y.Base, Y.Attribute, and more — are also the most ignored, and the hardest for external developers to contribute to.

Long story short? Important changes and improvements to YUI are frequently blocked by people who rarely interact with the community and cannot be held to task by the community. These team members mean well, and they do what they do because they genuinely think it’s good for YUI. But it’s often not, and I’ve learned that fighting with them from the outside is far more difficult than fighting with them from the inside was.

The Template.Micro fiasco

A few weeks ago I opened a pull request for a new YUI component called Template.Micro. This is something I created for my own use, but I thought it would be a great addition to YUI. Some fantastic community discussion occurred on that pull request — lots of developers, including members of the core team, had excellent feedback, and we worked together to make Template.Micro awesome. Eric Ferraiuolo and I even chatted about Template.Micro in a public Google Hangouts on Air session and posted the recording on YUI Theater.

Once everyone who participated was happy with the pull request, Eric (who is a member of the core team) arranged to discuss Template.Micro at one of YUI’s weekly engineering meetings. These meetings are normally private, but the team occasionally invites external contributors to join in, and they invited me to talk about Template.Micro.

Every YUI team member in that room who had an opinion had already participated in the discussion on the pull request, except for — guess who? — the ones who rarely engage with the community. They hadn’t looked at it. Not even a glance. Naturally, they were the only ones who objected to merging it in. They objected strenuously and continuously for nearly two hours as I summarized and reiterated every discussion that had already taken place on the pull request or on IRC. Eventually, with the help of others on the team who had participated from day one, I managed to convince them it should be merged.

Then nothing happened, and nothing has continued to happen for over a week. Rumor has it that someone changed their mind (or just “doesn’t have time” to review the fiftyish lines of code, not counting comments) and has decided Template.Micro shouldn’t be merged after all. Code freeze for the next release approaches. I can’t actually get an answer on the pull request itself, so it sits unmerged, and I have no idea whether I or anyone else who wants to see this in the library will be able to use it in the next release.

I’m left feeling that I’ve wasted my time, and I no longer have any desire to contribute to YUI. It’s not worth it. This is just one of the battles I’ve had to fight recently, and fighting battles is not how I enjoy spending my free time, nor is it a good way for me to spend my employer’s time.

What needs to change

Problem #1: There’s no incentive for YUI core team members to review or merge pull requests.

Everyone on the core team is busy (usually incredibly busy) with their own tasks. No explicit time is ever set aside for managing external contributions, so the only time this happens is when someone takes the initiative to do it. There are people on the team who rarely take this initiative, and others who are often too busy to take this initiative. As a result, even small pull requests tend to sit around for a long time. This provides a significant disincentive for external developers to contribute minor fixes, and an incentive for them to simply bake monkeypatches into their own code, which YUI will never benefit from.

My recommendation: YUI should make it part of everyone’s job to triage and manage pull requests. They should strive for zero open pull requests at the end of every sprint — any pull request that shouldn’t go into the current sprint should either be denied or scheduled for a future sprint (and then should not be forgotten when that sprint rolls around).

Problem #2: There are no external contributors with commit access to YUI.

Obviously only highly trusted contributors should have commit access to YUI. The core team is highly trusted. Luke Smith (another recent former YUI team member who still contributes) and I were highly trusted when we were on the core team. As soon as we turned in our Yahoo! badges, we became just as untrusted as everyone else on the Internet. This is strange.

The weirdest thing about this? I’m now dogfooding YUI far more than I ever did when I was paid to work on it, so I’m naturally finding a lot of things I want to improve. I feel like I have a much better idea of YUI’s pain points and opportunities for improvement than I ever did before — but I also feel like there’s so much of a process barrier that the amount of effort required to get my changes back into YUI begins to approach the amount of effort required to simply fork YUI. That’s really scary to me, because it makes me wonder how many other YUI users and potential contributors have the same feeling.

My recommendation: Make GitHub YUI’s source of truth repo. Grant commit access to highly trusted external contributors, on the condition that non-trivial changes must be reviewed by the core team first. If an external contributor screws up, it’s not a big deal — revert the commit. If they screw up often, revoke their commit access.

Problem #3: There’s not much external visibility into YUI’s release planning and scheduling process.

I didn’t realize how frustrating this could be until I was on the other side. I want to contribute lots of stuff to YUI. Not just new stuff, but improvements and fixes. Naturally, I want to do this in a way that aligns with YUI’s own plans and schedules, but I also want to do it in such a way that I don’t have to babysit my contributions for months until they can be integrated into core.

Knowing YUI’s release plans and what the team is focusing on for an upcoming release would be a huge help in budgeting my time. I could look at the team’s plans and say, for example, “Hey, it looks like YUI is focusing on performance improvements for this release. I’ve got some of those on the back burner, so this would be a great time to contribute them.” Or “Well, I’ve cooked up this new widget, but it looks like the next YUI release will be a bug fix release, so I should roll this into a gallery module for now instead of letting it rot in my fork for three months.”

Efforts like YUI Open Hours and This Week in YUI help a little, but they don’t provide the nitty gritty insight into release planning and scheduling that are really needed, and Open Hours in particular requires a level of time commitment that people just can’t always make — it’s a lot harder to watch an hour-long screencast and try to extract meaningful info than it would be to read a blog post that simply says “here’s what we’ve got planned for the next release and here’s how you can help”. Even just knowing the dates for preview release windows would help contributors immensely in prioritizing our contributions.

My recommendation: Post the results of planning discussions and other non-confidential internal discussions on the blog (or on GitHub, with an announcement on the blog or Twitter) soon after they happen. A public document of some kind should be the end result of any non-confidential planning meeting or discussion. Consider inviting trusted external contributors to participate (via G+ Hangouts) in discussions that won’t involve confidential Yahoo! information.

Problem #4: Creating and maintaining gallery modules is far too much work.

The usual response to “it’s too hard to contribute to YUI core” or “YUI core doesn’t want my awesome new widget” is “well, just put your stuff in the gallery”. But it’s so painful to create, publish, and maintain a simple gallery module that I’d just rather not do it at all. It eats up far too much time that could be better spent writing code.

The main problem is how much manual labor there is, and how difficult it is to organize and maintain gallery modules as a result. Dav and others on the team are aware of my specific complaints in this regard, but until something is done, I think the team needs to stop using the gallery as a crutch to justify not solving problems 1 through 3 above.

My recommendation: Change the gallery to rely on the exact same build tools and procedures that YUI core uses. Remove the requirement for all CDN-hosted gallery modules to be maintained in a single yui3-gallery repo, so that gallery modules can use their own GitHub repos as their source of truth. Remove the manual form-filling required to create a gallery module on the website, and instead rely on the module’s own metadata and a simple tool that publishes gallery modules similar to how npm publishes npm modules.

If it were as easy to create a gallery module as it is to create an npm module, I’d have so many gallery modules people’s heads would explode. In a good way.

Problem #5: YUI can be a community project or a Yahoo! project. It can’t be both.

The primary mission of any good internal Yahoo! project is to further Yahoo!‘s corporate goals. The primary mission of any good open source project is to further the goals of its community. Since its inception, YUI has tried to do both. This isn’t working.

I can tell you from my time working at Yahoo! on both YUI and other projects that YUI is unlike any other project at Yahoo!. It sometimes doesn’t feel like it’s even part of the same company. And I can tell you from my time working on open source projects that YUI is unlike any other open source project, and in many ways doesn’t feel like an open source project. YUI tries to be a hybrid of both, and as such it tries to serve two masters — the corporation and the community.

This is why YUI is subject to Yahoo!‘s bureaucracy, it’s why some team members feel justified never engaging with the community, and it’s why contributing to YUI is a major pain in the ass. When I worked for Yahoo!, it was easy to assume that the external users (and non-users) who complained about this were just being too sensitive, too selfish, or too shortsighted. Now that I’m one of them, the shoe’s on the other foot and I’ve achieved enlightenment.

Despite the efforts and dedication of many members of the core team — seriously, YUI has an incredible group of core developers — YUI is not really an open source project. It’s a Yahoo! project whose source is public. The open source community has zero involvement in the management of the project. They have zero transparency into day-to-day happenings except for the mirrored source tree and whatever information leaks out via the blog, IRC, and Open Hours. There is no true sense of community ownership or responsibility for the project, and community members often feel frustrated at their inability to influence YUI’s direction.

My recommendation: Create a YUI foundation, separate from Yahoo!, and entrust the governance of the YUI project to it. Encourage Yahoo! and other companies that benefit from YUI to provide funding. This isn’t a new idea — it’s something that’s been discussed both inside and outside of Yahoo! for years, and is a structure embraced by many other open source projects — but it’s more and more apparent now that it’s crucial to YUI’s future.

I still love you, YUI

YUI has many flaws, whether we’re talking about the code itself or how the project is governed. But it’s also an amazing library with a vibrant, intelligent, devoted community. I plan to continue using it, and I hope to be able to contribute to it again at some point. But until some things improve, contributing to YUI just isn’t worth my time.

Etherpad source includes JSMin, which Google Code doesn't allow

Last week, Google banned my PHP port of JSMin from Google Code due to a quibble over a line in the license stating that “The Software shall be used for Good, not Evil”, which they believe makes the license non-free. When I asked Google’s Chris DiBona whether all Google Code projects including JSMin would be subject to bans due to this clause in the license, he replied, “Sadly, yes”.

Today, Etherpad (which was recently acquired by Google) released their source code on Google Code. Unfortunately, their source tree contains at least two different JSMin ports (one in JavaScript and one in Python), thus making Etherpad non-free and violating Google Code’s terms of service. I’ve notified Google via an email to the Google Code mailing list.

I bring this up not because I have anything against Etherpad or Google Code, and not because I want to start a fight, but because it demonstrates the slipperiness of the slope Google launched themselves down when they banned jsmin-php last week. While I may disagree with their interpretation of the JSMin license as non-free, Google is certainly within their rights to refuse to host it. However, since JSMin is so widely used by so many open source projects, Google now has to choose between banning popular, high profile projects (including their own) or applying their rules selectively and thus promoting a double standard.

So what will it be, Google? Will you remove JSMin from Etherpad, ban Etherpad, or just be—dare I say it—evil and ignore your own rules when they’re inconvenient?

If you need a new host for the Etherpad project, the lovely folks over at GitHub don’t seem to have any problem hosting JSMin.


Update (2009-12-18): Chris clarifies: “As a side note, it’s not a matter of violating the terms of service, which don’t mention specific licenses, it is against our practices, though.” I’ve updated the title of this post accordingly. Chris has also asked the Etherpad maintainers to remove JSMin, which seems to indicate that Google is going to do the right thing and follow their own rules. Admirable!

Update 2 (2009-12-18): There are several other Google-sponsored projects that fall afoul of this ban as well:

JSMin isn't welcome on Google Code

Google’s Chris DiBona emailed me this morning to tell me that unless I removed a specific line from the license of my jsmin-php project (a PHP port of Douglas Crockford’s JSMin), Google Code would no longer host the project.

The license in question is the one attached to the original jsmin.c, and is a slightly modified version of the MIT License. Here it is with the offending line emphasized:

Copyright (c) 2002 Douglas Crockford (www.crockford.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

The Software shall be used for Good, not Evil.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

As Google (and some others) interpret it, this additional requirement constitutes a vague use restriction and thus makes the license non-free. Chris explained that if I were to remove that line from the license and “return to a proper open source license that we support”, then jsmin-php could stay on Google Code. Otherwise, he said, “we can’t host you”.

Of course, I can’t change the license, because it’s not my license. It’s Douglas’s license, and he wants people who use his software and derivative works of his software to use it for good and not evil. All derivative works and copies of jsmin.c either include this license or are in violation of it.

I added jsmin-php to Google Code in 2007. Since then, it’s been downloaded over 20,000 times. As of today, its new home is GitHub.

I don’t really mind moving the project—I’ve been intending to do it for a while anyway—and I certainly appreciate the fact that Chris was kind enough to send me a personal email about this before taking any action. But jsmin-php is unlikely to be the only project affected by Google’s discovery of JSMin’s license.

In my reply to Chris, I asked him:

There are quite a few other projects on Google Code that are ports of jsmin.c or include either ports or the original. Does this mean those projects will also be banned from Google Code unless jsmin.c's license changes?

Chris responded: “Sadly, yes.”

I don’t know if Google intends to proactively hunt down all projects using JSMin or whether they’ll only take action when someone rats you out, but if you currently have a project on Google Code that is derived from or includes jsmin.c, you might want to consider migrating to a new host with less restrictive policies.

I asked Douglas what he thought of this. He responded: “When did Google stop being against evil?”


Update (2009-12-09): Via @miraglia, here’s a hilarious excerpt from Doug’s talk, “The JSON Saga”, in which he gives some background on why he added this clause to the license and how often people ask him to remove it:

When I put the reference implementation onto the website, I needed to put a software license on it. I looked up all the licenses that are available, and there were a lot of them. I decided the one I liked the best was the MIT license, which was a notice that you would put on your source, and it would say: "you're allowed to use this for any purpose you want, just leave the notice in the source, and don't sue me." I love that license, it's really good.

But this was late in 2002, we'd just started the War On Terror, and we were going after the evil-doers with the President, and the Vice-President, and I felt like I need to do my part.

[laughter]

So I added one more line to my license, which was: "The Software shall be used for Good, not Evil." I thought I'd done my job. About once a year I'll get a letter from a crank who says: "I should have a right to use it for evil!"

[laughter]

"I'm not going to use it until you change your license!" Or they'll write to me and say: "How do I know if it's evil or not? I don't think it's evil, but someone else might think it's evil, so I'm not going to use it." Great, it's working. My license works, I'm stopping the evil doers!

Audience member: If you ask for a separate license, can you use it for evil?

Douglas: That's an interesting point. Also about once a year, I get a letter from a lawyer, every year a different lawyer, at a company--I don't want to embarrass the company by saying their name, so I'll just say their initials--IBM...

[laughter]

...saying that they want to use something I wrote. Because I put this on everything I write, now. They want to use something that I wrote in something that they wrote, and they were pretty sure they weren't going to use it for evil, but they couldn't say for sure about their customers. So could I give them a special license for that?

Of course. So I wrote back--this happened literally two weeks ago--"I give permission for IBM, its customers, partners, and minions, to use JSLint for evil."

[laughter and applause]

And the attorney wrote back and said: "Thanks very much, Douglas!"

You can see the full video of the talk at YUI Theater (the excerpt above is from 39:45).

Ramaze is beautiful

Avdi Grimm discusses the subject of beautiful code in his latest blog post, and he uses the Ramaze source code as an example. He’s right; Ramaze is an excellent example of clean, well-organized source code, which is one of the reasons it’s become my web framework of choice.

One side effect of having such a clean codebase is that it lowers the barrier of entry that might otherwise prevent people from contributing patches. As a result, despite the fact that Ramaze is young and still fairly unknown as open source projects go, it has many active contributors and is maturing rapidly.

GuiltBSD

So I guess the OpenBSD project and, by extension, OpenSSH, are having some hard times. Too many big evil corporations are using their free, open source software without paying for it (gasp!), so Theo de Raadt is on a campaign to make them feel guilty. My favorite Theo quote:

I will say it here -- if an OpenSSH hole is found that applies to SunSSH, Sun will not be informed. Or maybe that has happened already.

Boy, Theo, I sure feel secure using OpenSSH knowing that you're willing to use your knowledge of security vulnerabilities to extort donations.

Listen, dickhead: If you release software under a license that says anyone is welcome to use it, modify it, and sell it without paying you a cent, then you forfeit your right to get pissy when they do exactly that. We're all grateful for OpenSSH and PF, and you've got every right to ask for donations, but Jesus. Don't be such a fucking prick.

Software maintenance woes

One of the reasons I spend so much of my spare time writing software, even though that’s the same thing I do for a living, is that I’m incredibly picky about the software I use. I hesitate to say I’m a perfectionist, because that’s not quite true, but I’m almost never satisfied with the way other developers implement things. There’s always something missing or something that could have been done better or something that’s completely unnecessary. So, inevitably, I end up writing my own software to meet my needs.

Since I like sharing and enjoy feedback, I release a lot of my software publicly. Of course, this means writing documentation and managing some kind of stable release cycle and answering questions and all of that; things which I don’t particularly enjoy. And once I stop having a use for something I’ve written, I don’t usually bother continuing to maintain it, which I often feel bad about because this frequently means abandoning users.

The effect of all of this is that there are a million things I want to write in order to meet some need I have, but at the same time I have far too many projects to maintain already. So I shelve the things I want to write in order to keep my grasp on the things I’ve already written, but which I don’t really enjoy maintaining.

I need to find a solution for all of this. In the past, I’ve tried passing projects to other maintainers, but that’s always ended badly (I have yet to meet anyone who shares all of my quasi-perfectionist ideas about project management, much less coding). I’m also extremely wary of popularity; a few of my past open source projects have achieved a fair amount of popularity, resulting in way more work—and way less benefit—than I had ever expected. Successfully running even a small open source project with a lot of users is a huge task.

I feel bad for saying this, but I release my software as open source so that other people can benefit from my code, not because I want to encourage contributions. While code contributions can be (and have been) a huge help, they can also be a huge pain in the ass, and I’m enough of a perfectionist that I’d usually rather write everything myself.

So my conundrum is this: do I keep writing software for myself and just not release it? Or do I continue releasing software publicly and just try not to feel bad about being unable to maintain it?

Microsoft is from Mars, open source is from Venus

I’ve been spending tremendous amounts of time recently perusing the weblogs of various Microsoft developers, testers, project managers, and other folks. Aside from the fact that they work for Microsoft and some work on the same projects, they all have one thing in common: without exception, every single one of these people comes across as incredibly intelligent, insightful, and knowledgeable. Many of them frequently post long and very well written essays on various programming-related topics, from UI design to security to performance to the intricacies of the .NET common language runtime. They often post from a perspective of educating a user or developer who wants to know more about why things work the way they do and how to write elegant and well thought-out Windows applications.

“Elegant” is a word that floats through my head often. I try to hold myself to a standard of elegance and simplicity in the code I write and the software I design. Sometimes I think I’ve done a good job, other times I know I’ve created a muddled mess. But one thing that struck me about these Microsoft bloggers is that a lot of them design and develop some pretty complex software, and the sheer elegance that shows through in their explanations of how certain design decisions were reached is absolutely mind-bogglingly stunning to me. These folks are good at what they do.

Even more interesting to me is that every single one of these people seems to have a very selfless attitude. These are their personal weblogs, yet personal posts seem to be few and far between compared to coding examples and essays on design practices.

This is strange to me. Most of my software development experience has come from writing and collaborating on open source software. I’ve found that open source software is rarely well designed or elegant unless it has either a huge user base and a very small team of extremely experienced core developers or a small user base and a single developer, although those two things don’t, by themselves, guarantee a good design philosophy. I’ve also come to perceive many open source developers as hostile, which is unsettling. Considering the unselfishness inherent in giving your code away for free, you’d think that all open source developers would be kind, generous, considerate people, but this couldn’t be further from the truth. It’s not uncommon for a bug report, feature request, or support question from a user to result in flames or angrily-worded variants of “RTFM”, which hardly indicates a selfless disposition. And yet, I can certainly sympathize, as I myself have developed a habit of ignoring support requests from users who obviously haven’t read the documentation, or bug reports that aren’t reproducible, or feature requests for features that I would never personally use.

Even worse, the number of badly-written open source projects vastly outnumbers the well-written ones. Even some of the open source software I use every day seems have been designed from the ground up to be unnecessarily complex. It may still be marginally better than the closed-source alternatives, but merely being better than the worst doesn’t make you the best. And from what I’ve been reading, it looks like Microsoft’s closed-source software, at least, is getting a lot better all the time. Open source zealots love to point out how quickly open source alternatives are gaining market share, and I’d love to share their optimism, but if these Microsoft bloggers are any indication, the open source community is going to be facing some pretty daunting competition in the near future.

I’ll tell you a little secret: I’ve always had a deep, dark, guilty inner desire to work for Microsoft one day. That desire just got a little bit stronger.

Mozilla Mail redirect bounty

Mozilla Mail is a wonderful mail client, except for one very important thing: it does not support redirecting of mail. Despite the fact that mail redirection has become a standard feature of most major mail clients, the Mozilla Mail team has completely ignored it.

Not only have they ignored it, they've ignored the users requesting it and the other developers who would love to implement it but don't know where to start. A user opened a bug nearly four years ago requesting this feature and even offering to implement it himself if someone would point him in the right direction, and still it hasn't been implemented. I even considered giving it a shot myself, but after digging through the Mozilla source for several hours, I've decided I hate the world and there's no way I'm touching it.

This feature is very important to me. Therefore, I am hereby offering $100 to the first person who implements a working mail redirect feature as per section 3.6.6 of RFC 2822, submits it for review to the Mozilla MailNews team, and gets it committed into the current Mozilla development tree. This offer stands whether you're a current Mozilla developer or a complete newcomer. All I care about is that the feature is implemented and in Mozilla so I can use it. There's more information about this issue at this Bugzilla bug.

If you succeed in implementing this and would like to collect your reward, email me. Include a copy of the Mozilla CVS changelog showing your patch being checked in, the names of the modified files, and what payment method you'd prefer. Thank you.

Update: This reward also applies if you get a redirect feature committed to the Thunderbird tree.

Update #2 (Feb 6, 2005): This bounty has been open for almost two years now, and there's still no redirect feature in Mozilla Mail or Thunderbird. There's now a third-party redirect extension for Thunderbird, but the goal of offering this bounty was to get the feature implemented in the core mail client itself. A modern email client simply is not complete without redirect capability, and a third-party extension (no matter how well it integrates) just doesn't cut it.

I am hereby withdrawing this bounty. When it's more important to the developers of a popular mail client to implement a half-assed RSS reader than a fundamental and frequently-requested feature like mail redirection, there's obviously something wrong.