KENJI’S BLOG このページをアンテナに追加 RSSフィード

Freezed...

2008-10-28

書くのが得意? 読むのが得意?

たまに「Perlは読めるけれど書けないんですよ」とか「ASM読めるけれど書いたことはないです」という人がいます。最初、僕はこの意味がよく分からなくて、読むことができるなら書こうと思えば普通に書けるのでは? と思っていました。もちろん、いきなりガンガン書くことはできなくとも、少し慣れれば確実に書くことができるようになるだろう、と。しかし、この認識は間違いで、本当にこの状況は起こりえて、かつ、すぐに書くことができるようになる、ということでもないっぽいです。

まず「読む」と「書く」という2つの状況を考えます。例えばプログラムを「読む」状況とはどんなときだろう、と考えると、多分大抵は「その処理の内容を掴む」場合です。test_funcというサブルーチン(関数)があったとして、このサブルーチンを「読む」ということは、頭の中できっと、引数の数は? どのような引数が渡されるか? 戻り値は何か? といったことをまず最初に考えます。つまり、どのようなINPUTに対して、どのようなOUTPUTが得られるサブルーチンであるか? をコードから得ようとします。もちろん、コードを理解しなければそれは分からないため、当然サブルーチンの内容は理解するのですが、「読む」行為の目的は、大抵、何をするサブルーチンであるか? という一点であり、それ以外にありません。極端な話、コードの雰囲気からそのサブルーチンのだいたいの処理を当てることができれば、コードの詳細を理解する必要はありません。逆に「書く」状況は、大抵「動くものを作る」ときです。ソースコードの綺麗、汚いはありますが、プログラムはとりあえず動かなければ何の意味もありませんので当然です。さて、では突然「1から任意の数までのすべての数を加算するサブルーチンを作成してください」と言われた場合、きっと最初に頭の中で考えることは、引数の種類や、戻り値の数ではなく、処理そのものだと思います。まぁ大抵はfor(i=1; i < n; i++){ total += i; }とかを思い浮かべると思います。そして、処理を思い浮かべた後に、ああーでも32ビット以上の数になったらどうしよう…、とか、負の数いれられたらどうしようとか、小数点どうしようとか、そういうイレギュラーな状態を想像しつつ、32ビット以上の数にも対応するなら、結果は戻り値からじゃなく引数からにしようかな、とか、負の数に対応して1から-19までの値の加算とかだと、戻り値はsigned定義だな、などを考えつつ、INPUTとOUTPUTを決定します。そして何より、「書く」場合、プログラムが動かなければ話になりません。つまり、完全に熟知したコードでなければなりません(少なくとも自分が書く部分は)。

それで、以前、1から書かせるとものすごいスピードで仕事を仕上げてくるのですが、このアプリにこういう機能を追加して、というような機能拡張依頼だと、仕上げるのがものすごい遅いというエンジニアがいました。彼はおそらく「書く」のが得意なエンジニアだったと思います。そういう方はきっと「他人の書いたコードを読むのってキツイよなー、自分で1から書いた方が早かったりするよー」というタイプの人です。概要では満足せず、サブルーチンの処理をひとつひとつ読んでいく人です(または処理の推測が下手な人?)。逆に何十万行のソースコードを渡してもあっさり全体の動作概要を掴んで、機能追加できる人もいます。時間的に考えても絶対全部は読んでいないはずだけど、すでに全体の処理内容を掴んでいたりするので、多分「読む」のがものすごい早い(読み慣れしてる)人かなと思います(単純に技術力があったとかいうのはまた別の話として)。

というわけで、結論として、プログラマには「読む」のが得意なタイプと、「書く」のが得意なタイプに大別できるのではないかな? と思います。その極端な例として「読めるけど書けない」という人がいるのではないかと。逆に「書けるけど読めない」というのはちょっと意味として微妙なので、言い換えて「書けるけど読むのが遅い(書くのと同じスピード)」という感じではないでしょうか。

もちろん実際は、技術力も絡んでくるので、一概にどうということは言えませんが、僕自身を例にすると、僕は、C言語についてはおそらく他人のコードを読んだ時間より、自分でコードを書いた時間の方が長いです。そして、実際他人が書いたC言語のコードを読むのは結構苦痛です(笑)。逆にASMは、断然書いている時間より、読んでいる時間の方が長く、いざ書いてといわれると、「えっと…」と少し考えてしまったりします。つまり、一言にプログラミング言語ができるといっても、そういった微妙なところで、向き不向き、得意不得意があるのではないか? あと「読む」のが得意ならリバースエンジニア(解析屋)や、セキュリティホールハンター(脆弱性監査)に、「書く」のが得意ならDevelopper(開発屋)に向いているのでは? とか少し思いました。すでにある問題に対していかに素早く解決するかを考えるタイプと、何もないところからいかにすごいものを生み出すかを考えるタイプで、同じエンジニアでもいろいろだなぁと。まぁといっても実際はどちらも必要なスキルなので、あくまでも向き不向きという程度の話なのですが。

と、たまにはこういう真面目な話もしまつ(^^;(たまにしかしないからピントがずれていることも多々あるけど…orz)。

peachpeach 2008/10/29 12:27 今の任天堂の社長である岩田さんは昔、HAL研究所でプログラマーをやっていて、MOTHER2というゲームの開発に途中参加することになりました。 
ソースを一通り読んで、これを直していくと2年かかるけど、最初から作り直せば1年でできます、といって、MOTHER2はプログラムを作り直すことになりました。
研究者が経営者になって失敗するという話はよくありますが、このあたりに、実質的操業者である山内前社長から社長を任される資質があったんだと思います。
すいません、全然違う話になりました。(笑)

kenjiaikokenjiaiko 2008/10/31 14:42 ちょw、本当に全然違う話になってるww
ただこれは本当にすごい話ですよね。普通作り直せば1年でできます、とか断言できないし、エンジニアなのに経営的な能力も持っているという、本当にすごい人です。

ultraistultraist 2008/11/01 10:30 ある言語を読めるけれど書けないことと、プログラムを書く能力と読む能力は相関はあるにしろ別の話題じゃないですか。ある言語を読めるけど書けないというのは、コードが正しいという前提で見るとプログラムとしての意味は読み取ることができるけれど、自分で書いたコードが文法的に正しいか正しくないかを判断できるほどその言語に慣れていないのだと思います。極端な話「僕がたった今脳内で開発したオレ言語で『C<-A+B;』は何を意味しますか?」という質問なら、「AにBに足したものをCにいれる?」と予想できますけど、「僕がたった今脳内で開発したオレ言語でAにBに足したものをCにいれるにはどう書きますか?」と言われると、知るわけもないし答えられない! つまりいくつかの予備知識といくつかの予測によって自分の知っている言語と対応付けられさえすればプログラムとしての意味は読み取れる可能性があります(もちろんそのうえで「読む」能力がないと読めない)。書ける言語のうえで読むのが苦手という人は、同じプログラムでもいくつかの書き方があるけれど、自分のいつもやってる書き方以外で書いてあると、それが自分の知ってるなにと同じなのかを対応付けることが難しく、行単位で流れを追わないと理解できないのだと思うので、他人のコードを読み慣れていないのだと思います。すみません、ものすごい反論を書いてたつもりが大体同じだと思います。

kenjiaikokenjiaiko 2008/11/02 00:02 ちょw長文キタコレww
とりあえず「読めるけど書けない」という状態は、多分、「書いた経験が少ない」だけだと僕は推測してて、なので、

>自分で書いたコードが文法的に正しいか正しくないかを判断できるほどその言語に慣れていない

というのはつまり「書いた経験が少ない」という意味で、同じ意見だと思います。

それで、ultraistさんのレスを見て思ったのは、
読んだ経験も書いた経験もない言語(仮にオレ言語)に対して、読めるか? 書けるか? と問われた場合、読み書きのどちらの経験も同じくないはずなのに、書くことはできないが、読む(内容を理解することができる)ことはできるので、kenjiの言っていることは少し違うんじゃないか、と。

確かにその通りなので、多分ultraistさんの意見があってると思います。
それで、そう考えると、多分、「読む」という能力は、ある程度、他の言語間でも共通で伸ばせる能力なのかなと思いました。例えばC言語をバリバリ読んでたら、Perlもそこそこ読めると。しかし、C言語をバリバリ書いてても、Perlはそれほど書けない。「読む」のは言語間である程度、相互互換性があって、「書く」のはそれほど互換性ないから(といってもそれなりにはある)結果的に、「読む」能力はプログラミング言語全般に対してある程度価値ある能力で、「書く」能力はその言語に少々特化せざるをえない能力なのかなと思いました。

まぁあくまで推測というか、憶測というか、そういう感じの話なので、まぁそうかもなぁというレベルで読んでいただけると有難いっす(^^;。

ultraistultraist 2008/11/02 00:27 激しく同意

ultraistultraist 2008/11/02 00:52 ただ、読むことを重点的に書かれていますけど、読む能力はひとつでも神レベルで書ける言語がないと育たないと思ってます。また、アルゴリズムにもHashTableやBinaryTreeのような汎用的なものからAdaBoostやEMアルゴリズムのような一部の専門分野でしか使わないようなものがあるので、ある分野では読み書き神レベルでも、別の分野だと行単位では読めるけど全体として意味がわからないという状況があるので、単純にプログラミング言語と一般的なアルゴリズムの知識だけで収まる話でもないので、何もかも読める人はいないんじゃないかと思っています。そのへんが「コメントを書け」って話に繋がってるのかなと。コードだけ見て分からなくても、コメントにある参考文献をググって背景にあるアルゴリズムの意味が分かれば読めるようになるので。

kenjiaikokenjiaiko 2008/11/02 23:54 >何もかも読める人はいないんじゃないかと思っています。
ですね。まぁこれは技術力の話なので、得手不得手とはまた違って、何もかも読めて何もかも書ける人がいない、ということだと思います。
個人的にはプログラミング言語は何かを作るための道具でしかないので、自分が作りたいものを作れれば他のことは別に知らなくてもいいかなと思います。世界中のすべての料理の作り方をしらずとも、おいしい料理は作れまつw

トラックバック - http://d.hatena.ne.jp/kenjiaiko/20081028/1225218623