Rubyを最大63%高速化した中学生は超多忙!:【写真】天才プログラマに聞く10の質問(5)(1/3 ページ)
本連載では、コンピュータの世界で卓越した才能を発揮しているプログラマたちに、スキルやキャリアに関する10の質問し、プログラマとしての考え方・生き方を探る。今回は、これまでの10の質問を基に竹内郁雄氏がインタビュアーを務めた対談形式の模様をお伝えする。
才能があるプログラマの考え方や生き方に迫る本連載。4人目は、筑波大学付属駒場中学校に通う3年生、金井仁弘(まさひろ)氏を紹介する。
金井仁弘(HN:CanI)氏 撮影:平沼久奈
ハンドルネームCanIの由来は、「“Can I”→キャナイ→カナイ」。C#、Visual Studio、Microsoft .NETとマイクロソフト製品が大好きな「.NETer」と自称する
筑波大学付属駒場中学校は、東京都内にある中高一貫の国立校だ。入学試験の偏差値と東京大学への進学率の高さから“東の筑駒、西の灘”と称される進学校である。強いのは受験だけではない。国際情報オリンピックや国際数学オリンピックでは、同校の生徒が毎年のように金・銀メダルを制するなど才能あふれる理数系人材が多数在籍している。
金井氏はこの夏の「セキュリティ&プログラミングキャンプ2009」(2009年8月12〜16日)に参加し頭角を現した中学生プログラマである。
今年に入って、Ruby 1.9のフィボナッチ数列による演算(多倍長加算)が、Ruby 1.8よりも遅いことに気付いた金井氏は、キャンプの自由課題でRubyの高速化を選択。参加者一同を前に、同様の問題が生じていた、RubyのString型、 Array型(構造体型オブジェクト自体にデータが埋め込まれている可能性のある構造体)の一部メソッドを高速化し、注目を集めた。講師陣も舌を巻いたといわれるほどの逸材だ。キャンプ後もRubyの高速化に取り組み続け、ループ内で定数化するマクロを除去することで一部メソッドを最大で約63%、全体で約8%の高速化に成功した。この修正パッチはRuby開発者コミュニティで採択され、Rubyのtrunkに取り込まれている(2009年10月5日)。Rubyの開発者や多くの職業エンジニアでさえ気が付かなかった問題に目を付け、問題の解決まで根気よく粘るというのは、プログラマとして1つの才能ではないだろうか。
本稿では、金井氏が普段どんなことを考え、何をしているのかを中心に、職業エンジニアにも生かせるスキルやキャリアへのヒントを届けたい。インタビュアーは、本連載ではもうお馴染み、東京大学 情報理工学系研究科 創造情報学専攻 教授 竹内郁雄氏である。今回も、才能あるプログラマの発掘・育成のためならばとボランタリーで引き受けてくださった。
ご挨拶は名刺で
インタビューは2009年9月某日、東京大学 情報理工学系研究科で行われた。竹内氏が名刺を差し出すと、金井氏からも……。
竹内氏 竹内です。よろしくお願いします。おや金井君、名刺なんか持っているの?
金井氏 はい、自分で作りました。周りで持っている人は多いです。セキュリティ&プログラミングキャンプでは名刺交換タイムがあるくらいですから。
竹内氏 へ〜! 名刺交換の仕方も覚えて感心だね。しかしながら外国人が日本に来るために名刺を作ってくるという話を聞きます。日本は名刺がないとあいさつもできない国だと思われているのかなぁ……。
セプキャンではRubyの高速化に成功 【課外活動編】
竹内氏 セキュリティ&プログラミングキャンプではどんなことをやったの?
金井氏 講師の笹田耕一さんから自由課題を与えられたので、僕はRubyの高速化を選びました。
Rubyでは、メモリ節約のため、ある一定以下の容量の情報は、構造体に直接埋め込まれて保持されます。
Ruby 1.9では、“構造体に埋め込まれているかどうか”の判定を、ループ内でマクロを呼び出したときにいちいち行っていたため、処理速度が遅くなっていました。そこで、ループ内で構造体に埋め込まれてるデータが不変のとき、マクロ(=その判定の条件分岐)をループの外に出し、高速化をしました。
具体的には、array型などが実装されているソースコード、array.c、string.c、struct.cそれぞれから、問題となり得るマクロ、
・RARRAY_PTR,RARRAY_LEN
・RSTRING_PTR,RSTRING_LEN
・RSTRUCT_PTR,RSTRUCT_LEN
を探し、文脈を確認しながら、高速化するという作業(マクロの値がループ内で不変でループの外に出せるものをループ外に出す)です。
竹内氏 中学生でこれに気付くのはすごい。コンピュータでいう低レベルな深いところまで掘っている。そういう根気や気迫があるの素晴らしいと思います。
金井氏 キャンプでは、吉岡弘隆さんからいろいろな指導を受けつつ自分たちでボトルネックを探して修正していくということをしていました。
竹内氏 5日間でしたよね。修正を終えるまでにどれくらいかかった?
金井氏 5日間で一応終わらせたのですが、キャンプ後に笹田さんからskypeでバグを指摘されまして、キャンプ後も必死に修正しました。
竹内氏 修正にバグがあったわけ?
金井氏 make testは通るのですが、rb_yield()の存在によって、arrayに破壊的変更が加わりSEGV(セグメント違反)してしまう可能性がありました。
竹内氏 なるほど。多少そういう課題は残っていても、わたしとしては中学生からこんなことを聞くのは初めてで感心してしまいます。
金井君を育てた“筑駒パ研”、縦のつながり 【部活編】
竹内氏 いつごろからコンピュータに触り始めたの?
金井氏 小学校1〜2年生からです。学校の授業がきっかけです。
竹内氏 金井君の年代なら小学生でコンピュータに触るのは珍しくないよね。初めてコンピュータに触った時期と、コンピュータに目覚めた瞬間は違うと思います。後者はいつごろだった?
金井氏 本格的にコンピュータを使い始めたのは、中学に入学し、部活動「筑波大学付属駒場 中高パーソナルコンピュータ研究部」、略して“筑駒パ研”(以下、パ研)に入ってからです。
竹内氏 お〜、パ研というのがあるんだ?!
金井氏 はい、パ研に入ったことで、コンピュータを使う側からコンピュータでものを作る側になりました。
竹内氏 パ研はスパルタなの?
金井氏 放任主義です。パ研に入部希望を出すと、当時高校1年生(2009年現在高校3年)の先輩に本を1冊渡されました。「これを読んできて。分からないところがあったら教えてあげるからね」といわれたんです。
竹内氏 パ研は中高一貫なんだね。その本は何?
金井氏 粂井康孝氏の『猫でもわかるC言語プログラミング』、略して『猫C』です。
竹内氏 猫!! それは読みやすかったの?
金井氏 僕には読みやすかったのですが、「猫にしか分からない」と「猫でも分かる」の2つの意見があります。
竹内氏 ほ〜。おおむね分かりやすく書かれているけど、少し脱線すると分からなくなるという、入門書にありがちなことだね。先輩も『猫C』で学んだの?
金井氏 はい。パ研にはいくつか入門書架があり、『猫C』はそのうちの1冊です。いまの中学1年生にも貸し出していて、代々受け継がれています。パ研では、コンピュータの経験がない新入生には、取りあえずC言語の解説書を渡すというルールがあるんです。
竹内氏 顧問の先生はあまり絡まないのかい?
金井氏 基本的にパ研は放任主義です。先輩が後輩に教えたり、部員同士で教え合う文化です。「(部室は)いつでも開いているからいつでも来い」というスタンスです。
竹内氏 部室がたまり場になっていて、仲間がいれば話すし、いなければ孤独にパチパチと作業をするんだね。
金井氏 そういう雰囲気ですね。
竹内氏 中高一貫は長い目で見て良いと思うなぁ。高校受験制度を見直すべきだと思うよ。
Copyright © ITmedia, Inc. All Rights Reserved.