トップ «前の日記(2009-04-23) 最新 次の日記(2009-04-25)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2009-04-24

_ 実用的な脳みそ

昨日は、リファクタリング・ウェットウェアのちょっと気持ち悪い点にフォーカスしてみたが、実はそれほどぶっとんだことをアンディハントは書いていない。

せいぜい、プラグマティックな効用もあるようだから現代のシャーマニズムも取り入れてみました、程度だ。多分。書いている本人も気にはしていて、

さあ、ここは我慢して私の話を聞いてください。というのも、「妖精が使う魔法」のようにうさんくさい話と思われそうだからです。

なんていう言葉がちょくちょく出てくるからだ。

それどころか、

数年前、右脳に基づくありとあらゆる長所を約束した自己啓発本が続々と出版されました。右脳の料理本まであったと思います。

もちろん、そんなのは意味がありません。「アホだ!」と言ってもいいくらいです。

と、自分の脚に銃を撃つ始末だ。というのも、うさんくさいことを言い出す奴は、他人のうさんくささに不寛容だし(だめだ、フォローできない、この点に関しては)。

ただ、少なくとも、Rモードで話を終わらせないということは重要だ。つまり、実用主義者としては、Rモードで終わっては、まったく意味がない。そこから得られた成果物を、ロジックとして組み立てて、現実の役に立つものに仕上げなければ意味がないからだ。というわけで、Rモードの成果物をどうLモードへ繋げるか、が、本書でもっとも注意深くかかれているところなのだ。

実は、昨日の時点で、僕は大事な数ページをすっ飛ばしていた。そのため、それに気づかなくて、読んだ覚えがないロッククライミングのエピソードに後の章で言及されて初めて思い出したのであった。

というのは、電車の中で読んでいたために、ペンと紙を使った実習のページを後でやろうと適当に数ページ分、すっとばしていたからだ。

で、さっき、紙とペンを使って演習をしてから、その飛ばした数ページを読んで、アンディが本当に書きたかったことを確認し、あ、昨日のエントリーはちょっとダークサイドにフォーカスし過ぎていたことを思い知らされた。

演習は、こういうものだ。比較的複雑な線画を天地逆転して掲載し、それを意味を持つ絵として認識せずに、線だけを頼りに紙へ写す。

ふむ、と書き上がった絵を天地逆にして、満足のいく出来栄えにうっとりする。次に、天地をまともにして写してみる。あ、おれはそこそこ絵が書ける。でも、最初の絵のほうがうまく写せているようだ。

ロジックを抜くことで、本来Rモード向きの作業をRモードで実行でき、それによってその能力を示すということであるな。

で、重要なのはその続きにある。しかし、とアンディは続ける。

伝統的に無視されてきたRモード処理を活用することができるからといって、Rモードは特効薬でも万能薬でもありません。単独では、すべての問題を解決するどころか、言葉すらまともに処理できないのです。

我々が必要としているのは、Lモードによる処理とRモードによる処理をうまく同期させる方法なのです。

で、ロッククライミングのエピソードが始まる。

ある、ロッククライミングスクールに通った話だ。

最初、インストラクターは、さあ、登りなさい、と言って、そのまま消えてしまった。教室中がざわざわざわになる。何も教えないのに高い金を取ったのか、ぶーぶーぶー(まさにアメリカだな)。

でも、しょうがないので、みんな登ってみる。うまくいくはずもない。

で、疲れたところにインストラクターが戻ってきて、やおら、ロッククライミングの方法論についてレクチャーが始まる。

すげぇ、とアンディは感動する。

もし、まったく登った経験がなければ、レクチャーはレクチャーで、何のフィードバックもないはずだ。ところが、おれはさっき壁とへたくそな方法で格闘したばかりで、身体が感覚を覚えている。そうか、そうやって体重を移動させればいいのか、それは、納得だ。

最初にLモード用のレクチャーを持ってこられても得られない納得感を、このインストラクターはうまく処理しているではないか。

そこから、たとえばペアプログラミングがなぜうまくいくのかの考察に入る。おそらくコードを書いている人間は当然Lモード全開だが、相手は逆にそいつのやっていることを眺めていることが主になる。退屈もするだろう。LモードとRモードの間を揺れ動くことができる。それが適切なヒントを出せたり、つまるところ、Lモード専従者にとって外部Rモードとしての役割を果たせるのではなかろうか。おれには正しい考察かどうかはわからないが。でも、傍目八目というのは、そういうことだというのは知っている。当事者よりも結局は余裕があるからな。

後、おそらく本書の中で最も現実の役に立ちそうなのは、読書会のハウツーの部分だろう。なぜ、大人の学習の場として、読書会が向いているのかの相当説得力がある導入部から、どう準備して、どう進めるか、まで。レクリエーションとしての読書会ではなく、学習の場としての読書会の方法論としてこれは相当正しそうにおれには思えた。

ついでに、人によってはなぜプレゼンテーションすることが本人にとって役立つのか、でも役立たない人もいるとか、そういうところの考察は納得がいく。

そして重要なのは、脳みそのデバッグという考え方。

もし、今、二人の人間が力を合わせなければ、だめな状態に置かれていると仮定する。二人が大木の下敷きになって、せいのーで力を合わせれば大木を転がせて二人とも助かるとしよう。その時、一人は韓国人で、もう一人はそこらの嫌韓厨だとする。そこで、厨がちゅうちゅう竹島がどうしたと言い出したら、間違いなくそいつの脳みそにはバグが湧いている。コンテキストを理解していないからだ。いや、それは違う。領土問題は重要なのだ、とLモード全開で力説したとしても、バグはバグだ。仲良く困難を乗り切るしかないだろ。

いや、もう少しまともな例が書かれているけど。

人には向き不向き、その人の得意な流儀があり、それは千差万別で、A君のベストプラクティスは必ずしもB君のベストプラクティスにはならない。しかし、特定のコンテキストではB君にもA君のベストプラクティスが向くこともある。そのようなコンテキストの判断と個性の尊重(おれにはその方法は向かない)と適切な排除(でも、今回はその方法をやろう)のことを、アンディハントはデバッグと呼んでいる。

アジャイルってそういうことだな?

と、まあ、怪しげなことをまき散らしながら、結構納得もいく知見を織り交ぜて、副題「達人プログラマーの思考法と学習法」にふさわしい内容になっている。何より読んでいておもしろいのが素晴らしい。翻訳者がうまいというのもあるだろうな。語り口が流れるインターフェイスになっているんだよ、多分。

というわけで、実はこの本は、アジャイル開発をうまく進めるための基盤となる心構え(これまた妙な言葉だが、本書を適切に評するとこうなると思う)について巧妙に説明したものだ。

うまいなぁと思うのは、読んでいる人にまったく劣等感や罪悪感を与えないように書かれているという点だ。ただ、少し行き過ぎな気もしないでもないが(アンディ自身が、何度も注意はしているのだが、それでも読んでいると二次無能力が推し進められそうな気がするのだ)。

リファクタリング・ウェットウェア ―達人プログラマーの思考法と学習法(Andy Hunt/武舎 広幸/武舎 るみ)

思うに、アジャイル本の多くはチームをどうするか、チームでどうするか、チームをどう導くか、について語ったものが多いのだが(少なくともおれにはそう感じる)、この本は、そうではなく、ではチームの構成員あるいは構成者たる、個人はどう思考すべきか(結果的には行動すべきか)に焦点を当てたと言っていいだろう。

したがって、一人アジャイルをやっている人や、考え方を変えろ本のうさんくささに耐えられないけれど、多少は我慢ができる人には、読んでおもしろいだけではなく役に立つと思う。しかし、真に役に立つのは、昨日も書いたように、この本を読まない人にだろうなぁ。

_ 武道館

Perfume 『BUDOUKaaaaaaaaaaN!!!!!』

これ、おもしろい?

_ おれが書く

元記事というか元の元の用語が独特なんでなんだかわからないというのが正直なところだが、たぶん、次のような使いまわしの意味じゃないだろうなぁ。
void foo() {
    string[] a = { "a", "b" };
    ……
    a = { "b", "c" }; // 変数a の使いまわし
}
さすがに、そういう意味とは思えないよ。とすると、
void foo() {
    X x = new X();  // しかもXはイミュータブルだったりして
    ...
    bar(new X(), new X());
    ...
    baz(new X(), new X(), new X());
    ...
}
...
class X {
    String contents;
    public X() {
        File f = new File("X");
        FileReader br = new FileReader(f);
        contents = br.readAll(); // これはJavaではないらしい。ちなみにファイルXのサイズは500MBあって、かつ、r--r--r-- で内容は不変
        br.close();
    }
    public getContents() {
        return contents;
    }
}

いや、それ最初のxを使いまわせばOKだから、とか。

追記:元の元が書き換わっているので、どこまでが初出かわからないけど、「変数の使いまわしを避けよ」という呪文が強力に効きすぎて「オブジェクトの使いまわし」にまで適用されてるよ、おいおい、と書いているね。

本日のツッコミ(全4件) [ツッコミを入れる]
_ (2009-04-24 02:12)

チームが!とか人が!とか話すイベントが多いけど、俺はどうすんの?自分はなにすんのってことなんだよ!!!って今日(昨日か)ブラウンバッグミーティングで話したところでした。

_ kanegon (2009-04-25 01:12)

ActiveScriptRuby1.9.1(RScript)で不具合らしきものがありましたのでご報告します。<br><br>Mutex#synchronizeが動作しないようです。<br>1.9.1ではMutex#synchronizeはCレベル(win32/prelude.c)で処理されているようですが、これが現状ではruby_optionsの内部でのみ呼びだされています。<br>ActiveScriptRubyのInitializeEnvironment()ではruby_optionsを呼んでいないため、結果的にprelude.cで行ういくつかの定義が使えなくなっているように見えます。<br><br>ご確認をお願いします。

_ arton (2009-04-25 08:27)

kanegonさん、どうもありがとうございます。<br>それが、20090420#c01の原因っぽいですね。早速修正します。

_ arton (2009-04-25 11:54)

違った。20090420#c01のは、ActiveScriptRubyではなくRuby本体の話だ。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|

ジェズイットを見習え