Hatena::Groupbugrammer

蟲!虫!蟲!

Esehara Profile Site (by Heroku) / Github / bookable.jp (My Service)
過去の記事一覧はこちら

なにかあったら「えせはら あっと Gmail」まで送って頂ければ幸いです。
株式会社マリーチでは、Pythonやdjango、また自然言語処理を使ったお仕事を探しています

 | 

2011-12-06Python Advent Calender(全部俺):: 六日目

[][]始めてオープンソースに関わったことを話そう -- プログラミング言語番外編 18:52

 f:id:nisemono_san:20111206184437p:image

 プログラミングをやっている人間ならば、一度は「俺による俺のためのプログラミング言語」というのを考えたり、作ったりしたことがあるのではないでしょうか。プログラミング言語は200あると言われており、ローカルに作られたものを含めるなら、莫大の数となるでしょう。多くのプログラミング言語は、熱意が途中で覚めてしまったり、あるいは作者自身が忙しくなって開発に手をつけられなくなったり、あるいは開発にメリットが無くなって中止するすることがありますね。

 このブログでも紹介したRoyという言語に、最近はコミットしています(このブログでも紹介しました。参考:関数型っぽい文法を持つJavaScriptトランスレーター Roy - 蟲!虫!蟲! - #!/usr/bin/bugrammer )。また、NimrodというPythonライクな文法を使用している言語なんかも、最近ではあります(Nimrod Advent Calendar jp: 2011 : ATNDを参考にしてみてください)。また、Pythonオープンソースプログラミング言語ですね。このように、オープンソースで開発が進められているプロジェクトは多くあります。

 それほどオープンソースに関わっているわけではありませんが、なぜ、自分がオープンソースに対して「こういう機能を追加したから反映させろよ!」というようなコミットをするようになったのか、という話をしようかなというのが今日の話です。

 直接的なPython、Nimrodの話題ではありませんが、関わりのある話題だと思ったので、あえてAdvent Calenderの記事として提出します。

Nimrodというプログラミング言語を教えてもらう

 ハガケイタという方から、「Nimrod面白いですよ」ということで、教えてもらったのがきっかけ。それも教えて貰った理由というのが、「Nimrodの作者はいい人だから、ある程度バグフィックスを行えば、contributors.txtというドキュメントに名前が載る」というのが理由。つまり、皆でバグ出しをしてcontributorsとして名前を載せよう!!というわけで頑張ってみませんか、というのがきっかけです。自分も「何か修正できるところがあれば修正したいな」と思っていました。

 ただ、ある程度出来上がったコンパイラーなので、ソースを読むのが大変で正直どこを直していいのかわからなかったし、あんまり積極的にはなれなかったというのはありました。また、文法的にも面白いけれども、既存の手続型言語であるため、魅力を感じなかった。それが正直な感想だったりします。

 ですが、同時に羨ましいな、というのは事実としてありました。つまり、その実装の悪いところを直すことによって、そのオープンソースに貢献するというのは、自分の貢献をそのコードの中に残すという意味で、とても魅力的だなと感じていました。ですから、その時から「ああ、なんか自分が関われそうなオープンソースがあったら関わりたいな」と思うようになりました。

 オープンソースに貢献するということについて意識させてくれた、という意味でNimrodがなければ、次のRoyにコミットすることも無かったでしょう。

 force7.de

Royに出会う

 で、特にNimrodを弄らずに月日が過ぎ、Githubで面白そうなプロジェクトを漁ったり、あるいははてなブックマークをだらだらと見ていたところ、Royというプログラミング言語が上がってきたことに、目が止まりました。見てみるとHaskellっぽい文法を採用している。

 Haskellにハマっている知人と一緒にHaskellのことを少しずつ勉強し、段々と「Haskellいい奴じゃねえか」と思い始めたころに、Haskell-likeな文法を採用したJavaScriptトランスレーターが出てきたわけですから、関心を持たないわけにはいかなかった。Githubでソースを見てみると、読めない分量ではないし、Nodeを擬似的なコンパイラーとして使っているのも、アプローチとして面白く感じました。JavaScriptの勉強もしたかったので、Royをいじり始めました。

 しばらく弄っていて、ちょっと不満だったのは、REPL、つまりコンソール部分の機能が非常に貧弱だったことです。Pythonで、簡単に挙動を確認し、そのあとに全体のコードにまとめるという方法を取っていた自分としては、REPLの機能が貧弱だったのは苦痛でした。

 なので、うまくREPLにコマンドを追加できないかな、とコードを読んでいた結果、意外に簡単に実装できることがわかりました。だったらそのまま機能を追加してしまえばいいじゃないか、ということで色々と機能を追加して作者に送りつけたところ、三つの機能が反映されました(REPLを終了させる":q"、外部ファイルを読み込む":l"、ヘルプを表示する":?")。

 あまり面白いコミットではないかもしれませんが、自分のオープンソースへのコミットは、それが初めてだったので、緊張し、またそれが反映されたことはとても幸せでした。

コミットしていて思ったこと

 コミットして思ったのは、下の点です。全てのオープンソースに当てはまることではないと思いますが、自分の場合について書き記しておきたいと思います。

コードリーティングの練習になる

 良いプログラマーになるためには、多くのコードを読むべきだというのがあります。実際そうだと思います。JavaScriptだとjQueryがその代表になるだろうし、C言語だとApacheを読んで勉強したという人もいるでしょう。HaskellだとYesodというプロジェクトのコードが面白いのかなとか思ったりしています。

 なぜコードを読むべきなのか。それはコードというのは、その人のアイデアの塊だったりするからなんだろうな、と思います。自分一人だとなかなか思いつかないアプローチが、そのコードには書かれてある可能性がありますし、また自分だったらこういう風に書くのにな、と思うコードだってあるでしょう。そのように、自分の知識と照らし合わせることで、そのプログラミング言語に対する理解が深まるという意味では、かなり大きい気がします。

人のコードを弄るのは楽しい

 自分は、あんまり人のコードをいじる機会が無く、他人が書いたソースコードを本格的に弄るのはこれが初めてのことだったんですが、これが思いのほか楽しいんだな、というのがわかりました。上手くは説明できないのですが、他人が「こうであったらいいな」と思うコードを作り、それを反映させるというのは、単純に楽しいことです。それを利用して、また新しい機能が追加されたりするわけです。そのように、自分のコードを使ってもらうという機会があんまり無い自分としては、自分のコードがどんな形であれ、他の人々に使われると想像するのはとても楽しいことです。

何が望まれているのか、という勉強になる

 推測するに、人がそのオープンソースになぜ注目するのかといえば、それに期待をしていることがあるからだというのはあるでしょう。そこで繰り広げられる議論(Issure)というのは、そのオープンソースに何を望み、何を期待しているかということの集まりだったりします。それを読んでいくと、そのオープンソースが属しているカテゴリで、どのような問題があるのか、ということの勉強にもなります。

 例えば、最近の話ですと、RoyはUnicode Operatorを実装するべきなのか、ということで議論が分かれています。要するに「←」みたいな記号を使えるようにするべきなのか、という問題です。この議論を始めに提出した人は、「これはHaskellでも、Scalaでも実装されている。私たちが採用しない理由はない」ということのようです。Royの場合ですと言語実装の話になると思うのですが、Webフレームワークだったり、あるいは他のプログラムだったりすると、自動的に「それを実装するということはどういうことか?」というトピックが集まってきます。それを読むことによって、そのトピックについて詳しくなれるというのもポイントでしょう。

どんなオープンソースにコミットするべきか

 色々と考えられるでしょう。

友人がコミットしているオープンソース

 Nimrodの場合がそうですね。コミットしている友人がいるということは、自分がコミットする上において参考にもなるし、またお互いコミットしているということで動機付けになったりもします。そのオープンソースについて相談したりすることもできますしね。なので、尊敬する人であったり、友人がコミットしているオープンソースにコミットしてみる、というのは一つの基準としてアリなのかな、と思います。

まだ実用にならない/歴史の浅いオープンソース

 コンセプトとして面白いけど、まだ実用という部分ではまだまだ、というオープンソースもいいかなと思います。というのも、そういうオープンソースは、かなりの部分が実装できる可能性があるからです。可能性があるということは、そのオープンソースにおいてコミットできる機会も増えるということです。もし、そのオープンソースのコンセプトに対して可能性を見出したなら、些細な機能でもいいから、作ってみるのもいいかな、と思います。また、歴史の浅いオープンソースもいいのかな、と思います。個人的に、歴史の浅さはIssureの数を調べればだいたいわかるんじゃないかなという気もします。

自分が興味を持っている分野のオープンソース

 例えば、自分がRoyやNimrodに関して興味を持ったのは、実は自分なりのプログラミング言語を作ってみようと思っていたからでした。詳しいことは省きますが、自分が言語を一から考えるより、何かしらのオープンソースに関わった方が、きっと実装の問題に対して深く考えることができるようになるとは思います。それに、自分の興味を持っている分野であるならば、身の入りようが違うような気がします。また、自分が好んでいるプログラミング言語を選択するというのはアリかな、と思います。

作者が本気の、あるいは反映が早いオープンソース

 自分がRoyに関わろうとしたのは、Issureをざっくりみていて「ああ、この作者は本気で実装しようとしている」と思ったからでした。本気、というのを測る部分は難しいのですが、具体的にはコミット数の多さや、あるいはIssureのだしかたなどが参考になるでしょう。また反映の反応の早さなども、参考になるかと思います。作者の反応が早いと、それだけでもやる気がでてきますし、またモチベーションの継続にもなるんじゃないかなと思ったりします。

覚えておいたらいいこと

 さすがに覚えていない人はいるとは思うんですが、そのオープンソースが使っているバージョン管理システムくらいは覚えておいたほうがいいのかなと。Githubですと、Gitの使い方を覚えておくといいのかなと思います。とはいえ、最初のうちは手探りだとは思います。例えば、問題ごとにブランチを切って、解決するという方法を知らなかった(恥ずかしいことに、Forkネットワークで始めて知った)りとかしました。

 個人的には、下のサイトはとても参考になりました。

 GitHubへpull requestする際のベストプラクティス - hnwの日記

 基本的には、Forkして自分のレポジトリに入れる -> Masterから問題部分を解決するためのブランチを切る -> 解決したらPull Requestする、という方法がいいのかなという気はしました。あとは、そのオープンソースコーディング規約を採用しているならば、それを知っておくべきだし、またそのオープンソースが使われているプログラミング言語のコード規約も覚えておくといいのかなという気がします。

おわりに

 さて、今回は趣旨を変えて、始めてオープンソースに関わったことについて書いてみました。Githubには大量のオープンソースがあります。もし、プログラミングを勉強しているという方がいるのなら、オープンソースに関わることも、一つの手なんじゃないかなという気がします。自分も、まだ勉強することが多いと思いますし、また上記では見落としている部分も沢山あると思います。ただ「意外と、オープンソースに関わることは簡単なんだ」と思って、ソースに首を突っ込むきっかけになってくれれば幸いです。

おまけ

Nimrodについては、Takanoさんの32nd Blogger: Nimrod で FizzBuzz を書こう!を参照。また、Nimrod Advent Calenderには、pull requestの例も書かれています(Nimrod AdventCalendar 5日目 兼 俺 AdventCalendar 5日目 - futoase)。

 |