前回の後藤正徳さんからバトンを受けとりました。ハッカー養成塾ということでハッカーとして大事だと思う特徴をさぐっていきたいと思う。
基本的にハッカーとは自称するものではなく、他の人から「あの人はハッカーだ」と言われるものだ。ではどういった人を人はハッカーと呼ぶのだろうか。ハッカー(hacker)とは、ハック(hack)する人、ハックが得意な人のことだ。では、ハックとは何だろう。ジャーゴンを調べてみると次のように書かれている。
hack
1. n. Originally, a quick job that produces what is needed, but not well.
The Jargon File, version 4.4.7, http://www.catb.org/~esr/jargon/html/H/hack.html
ハックとは必要としていることを作りだす素早い仕事のことだ。満足できる結果が素早く得られればそれはハックだ。一方、文句を付けられない完璧な仕事だったとしてもそれが素早くおこなわれていなければ、すごいとは思われてもあまりハックとは思われないだろう。ここで重要なのは素早くやることであり、完璧にやることじゃないということだ*1。つまりハッカーと認められるには、素早く問題を片付けることができないといけないんだ。
それでは素早く問題を解決できるようになるためにするべきことはなんだろう。
一つは問題を解くために必要となる知識・情報をすばやく探しだせるようにすることだ。最も速いのは一次記憶、すなわち自分の記憶している知識だ。しかし人間の記憶力には限度があるから、二次記憶を有効に利用することも大事だ。この場合の二次記憶とは検索エンジンで検索することだったり、書籍だったり、友人だったりする。一次記憶・二次記憶を有効につかって雑多な知識やネタを蓄え、それを必要な時にすぐに思いだして応用できるようにすることが重要だ。これはもちろんすぐにできるようになるわけじゃない。どんな優れたハッカーだって地道に経験をつんできているはずだ。優秀なハッカーは問題に出会ってから解決方法を探すというよりも、むしろ普段からなにかしらシステムやツールの使い方を探求している。普段からいろいろな使い方を試して、利用法をマスターしたり、あまり使いこなしていないとひっかかりそうな罠なんかを学習していっている。そのようにツールに慣れていれば、処理すべき問題がでてきた時に一々使い方から調べたりする必要はないわけで、それだけで経験がない人と比べるとかなりリードできているわけだ。入門書に書いてあるような基本的な使い方だけじゃなく、システムの限界のきわどいところを見極めるまで使いこなしていれば、より有利となる。ハッカーというのは「深追い」を好むし、いろいろな「バッドノウハウ」を知っていたりするというのはそういうわけだ。
素早くしあげるには、巨大なコードを書くのは不利だから、短いコードですむのなら短く書くに越したことはない。Simple is Best。シンプルなのが一番だ。一般的に、コードを書くためにかかる時間、実行時間、デバッグする時間などトータルで考えると、小さいコードのほうが速い。さらにアルゴリズムやデータ構造の知識があれば、それを応用してより高速なエレガントなコードを書くことができる。したがってそういった知識を持っている方がハックには有利だ。
オープンソースソフトウェアやフリーソフトウェアが対象だと、スクラッチからコードを書くというよりも既存のコードをなんとかするという場合が多いだろう。その場合は、コードを書くスピードよりもコードを読むスピードのほうが効いてくることが多い。何か問題をかかえているソースコードを見て、その構造を把握して、ポイントとなる部分をすばやく見つけられることが重要だ。そのためのツールもいくつかある(*2)ので、それらを駆使しつつコードを読んでいく。もちろん元のソースコードによって読みやすいものや読みにくいものがある。読みやすいコードが美しいコードであり設計の優れたコードだ。そういうのは大抵ハックしやすい。逆に読みにくいコードは読むのにも時間がかかるし、正しく修正をするにも時間がかかりハックするのが難しい。
ところで、素早くするというのは、実は手が速いということを必要とはしない。ハッカーがとりくむのは試験問題とかのように、みんなが同時にヨーイドンで解くといったものじゃない。問題というのは常に生まれていてハッカーが手を出すのをまっている。普通の人はそもそも問題と認識していないものもあるだろう。ハッカーが華麗に解決を提示してはじめて問題があったということを認識するということもありうる。その場合はハッカーがとりくんでいた時間がいかに長かろうが、外からみていれば問題と同時に解決が提示されたように見える。つまりそれもハックなんだ。
最初、ハックとは素早くやることが重要だといったが実は少し違うのだろう。本当は一番先にしあげてそれを発表することだ。とりくむべき問題をすでに多くの人が認識している場合は、かけた時間が短いのがハックだ。世の中はそんな問題だけじゃなくて、他の人がまだ気付いてない問題もいっぱいある。そういった問題に先にとりくめば、多少時間がかかっても他の人より先にしあげちゃえば、それもハックなんだ。
当然のことながら、あなたがやったことを他の誰も知っていないと意味がない。後になって「実は既にやってたんだけどね」とかいってもあまり相手にされないだろう。「これはハックだ」と思ったことは、できるだけ早く発表するほうがいい。他の人はあなたがそれにどれくらい時間をかけたかどうかはあまりわかっていない。むしろ、発表された順番のほうが判断基準になる。ハックは熟成させずにさっさと発表するのがいい(*3)。
ハックの対象によっては、それにとりくんでいる人がたくさんいる場合がある。小さいハックならすぐにとりかかってしあげてしまうほうが一着になれる可能性が高いが、大きいハックの場合そうとばかりはいえない。むしろある程度できそうな見込みがたった時点で、他を牽制する目的でアナウンスだけしてしまう(*4)というのも効果がある。上手くやればライバルだったハッカーが手伝ってくれるかもしれない。
「やればできる」とか思っているようではだめだ。まずやってみる必要がある。やってもいないうちの「やればできる」はやってないのだからできるかどうかは不明ということだ。まずやってみてどこまで自分はできるのか、できないところはどこか、どのあたりなら次にできそうかなどといったことがわかるようになる。やってみないことには、そういったことは推測できるにすぎない。まずやってみるというのは大きな一歩だ。やってみて発表すると、それに誰かが反応してくれるかもしれない。そのなかには有意義なコメントも含まれていることもある。そういったフィードバックがうまくできればどんどん上達していけるだろう。
真の天才以外、ハッカーと認めてもらえるようになるには一朝一夕ではいかない。継続して知識と経験をつむしかない。その昔パソコンサンデーというTV番組があった。そこで教えられた教訓は「習うより慣れろ」だった。「慣れる」ためには継続してやる必要がある。そのために一番大事なことは「楽しむ」ことだ。嫌々やっていたり、やらされていると思っていては継続してとりくむのは難しい。楽しめることこそが才能の第一歩だ。バグやトラブルに遭遇したらへこたれるんじゃなく喜々としてそれにとりくむ。他の人があまり気にしないようなことにこだわって改良する。そういうことがハックにつながるんだ。そういったことをつみかさねてきた人を人はハッカーと呼ぶ。ハッカーはそういうったことを楽しめる人なんだ。
Happy Hacking!
次回の講師は、HyperEstraierの開発者、平林幹雄さんにバトンを渡したいと思います。