ハッカー養成塾:ハッカーへの遠回り

オープンソースマガジン2007年1月号に向けて書いた記事の元の原稿です。


前回のアルファギーク舘野君から、バトンを渡されたひげぽんです。
Mona OSというオープンソースOSを開発しています。
僕はハッカーと呼ばれるには実力不足ですが、知り合いのスゴ腕ハッカーに少しでも追いつこうと日々実践していることをいくつか紹介します。

ハッカーに学ぶ

オンラインでもオフラインでも構いません、自分よりも優れているハッカーを探してお手本とすることから始めましょう。
彼(または彼女)が何を勉強し、発言し、考えているかを観察することで多くのことを学べるはずです。
周りにハッカーがいなければ、勉強会・カンファレンスに参加したり、ブログを利用してコミュニケーションをとるのもひとつの方法です。
ハッカーに交わればハッカーになる」とまではうまくいきませんが、周りは自分より優秀な人ばかりであるという環境を作り上げることで力をつけるのは正攻法だと思います。

差を知る

優れたハッカーに出会うと、「この人には敵わない」「このようなコードは書けない」と感じることがあります。
その皮膚感覚自体は正しいと思いますが、それは「現時点では」という条件付きであることを認識することが大切です。
現時点でどれくらい実力に差(開き)があり、どうすればをそれを埋められるかをきちんと分析することを心がけましょう。
経験上自分の実力が低いうちは、とかく周りがすごく見えてしまいますが、それは間違いであることが多いです。
天と地ほどの差があり一生追いつけないと思っていても、後になればせいぜい数十メートルの差だったなんてことは良くあります。
僕の場合、「インタプリタ書ける人は別世界の人だ、自分には絶対書けない」とずっと思っていましたが「計算機プログラムの構造と解釈*1」という本を読んでインタプリタを実装できてしまいました。
いかに過去の自分の見積もりが甘かったかを痛感しました。
差を見誤った結果、「到底追いつけない」「自分には無理だ」と思って可能性を閉じてしまうのは勿体ないので「差を知る」ことを心がけると良いでしょう。

道具にこだわる

ハッカーは自分が使う道具に強いこだわりを持ちます。
それはなぜでしょうか。
そもそもハッカー

  • 考える
  • コードを書く
  • 動作確認をする

といったことを本質的な作業として繰り返します。
それらの本質的な作業にかけられる時間を最大化するために、道具にこだわる必要があるのです。
見づらいフォント、使いづらいエディタ、毎回同じコマンドを打ち込んでいるターミナルなどは、あなたから大切な時間をどんどん奪っていきます。
日々繰り返し使用する道具であればあるほど、一度きちんと見直しすることをおすすめします。
ちなみに僕はコーディング周りでは、M+FONTS*2/Emacs*3/zsh*4/Screen*5を利用しています。
またソフトウェアに限らず、椅子、キーボードなどの道具にこだわることも大切です。

古典・名著を読む

皆が飛びつく新しい技術や本も読むことはもちろん大切ですが、たまには名著と呼ばれる、いわゆる枯れた本を読みましょう。
今売れている新しい本に、書いてあることのうち何%が、5-10年後にまだ価値を持っているでしょうか。
過去の例から類推するにそこまで多くはないのではないでしょうか。
それに比べて、今でも読み継がれている名著には、過去5-10年の間にほとんど陳腐化しなかった、本当のエッセンスがつまっているわけですから読む価値がありますし、ハズレを引くことも少ないはずです。
特に自分には基礎力が足りないと思ったときは名著を読むことを検討してみてください。

困難にぶつかったとき

コードを書き始めたとき、勉強を始めたときに困難にぶつかることが良くがあります。
技術的なことであれば

  • コードを読み直す
  • ドキュメントを読み直す
  • 本を読む
  • 人に聞く
  • Googleで検索する

などたくさんの手段があり、解決は意外と簡単な場合が多いです。


一方、

  • 「難しすぎてどこから手をつけてよいか分からない」
  • 「良い設計が浮かばない」
  • 「どうしてもバグがつぶせない」

などのシチュエーションはどうでしょうか。
うやむやにしたりあきらめてしまったりしていませんか。


このような場合は、「分析」と「困難の分割」が有効です。
まず

  • どこまでは分かって、どこから分からないのか?
  • 何が分からないのか?
  • 障害となっているものは何か?

を分析します。


次に分析で明らかになった「困難さ」の核の部分を細かく分割します。
ポイントは困難さを「どうにかこなせそうな小さな困難」に分割することです。
インタプリタの実装が分からない」といった場合であれば

  1. Webなどで調べて、まずは字句解析が必要であることを知る
  2. 字句解析の意味を知る
  3. 字句解析の定石を知る
  4. 文字列処理を知る

といったように細かい単位に分割していき、自分がぎりぎり理解できるところまでそれを進めます。
そうすれば「インタプリタの実装をする」という大きな困難は「文字列処理を勉強する」という、より具体的で扱いやすいものになります。
これを繰り返すことで最終的には「インタプリタの実装」にたどり着くわけです。
更に分析や分割の際に、適当に図や絵を描いてみるのが結構有効なのでお試しください。

公開する

コードを書いたら公開しましょう。
たとえ小さなコードの断片でも、自分が苦労して書いたコードであればあるほど公開すべきです。
手元にコードを置いているだけでは、人に自分のコードを見てもらう機会はゼロですが、公開すればいつか誰かの目に触れて、そこから何かが始まる可能性があります。
例えば、僕は以前オーストリー*6人の学生からバグの指摘と改善案を受け取るなど海外からのフィードバックをいくつか受けたことがあります。ありがたいことです。
公開に際していろいろと面倒な場合は、自分のブログにコードをそのまま貼るなどで十分でしょう。

継続する

これは僕だけかもしれませんが、あれこれ手を出してすぐ飽きて投げ出してしまうと全然身にならないことが多いです。
新しいものが好きで、いろいろと手を出すのは構いませんが、必ずある程度形にしてから次に進むように心がけると力がつきます。
世の中には、あなたと同じようなアイデアを持っていたり、同じようなことに興味を持ってコードを書いている人がたくさんいます。
でも実はアイデアを形にしたり、きっちりとコードを書き上げたりしてから世に公開する人は多くありません。
だからこそ、そういったことをやり遂げる人がハッカーと呼ばれるのであり、尊敬を集めるのだと僕は考えます。

最後に

好きなことを見つけて、形になるまで楽しくコードを書きつづければ、あなたがハッカーと呼ばれる日もそう遠くはないはずです。
僕もまだハッカーと呼ばれるには半人前なので、次にどこかで会うときはお互いハッカーになっているようにがんばりましょう。

*1:通称SICPと呼ばれる名著。内容が平易ではないので各地で勉強会が開かれている

*2: http://mplus-fonts.sourceforge.jp/

*3: http://www.gnu.org/software/emacs/

*4: http://www.zsh.org/

*5: http://www.gnu.org/software/screen/

*6:最近はオーストリアではなくオーストリーと表記するようだ