同じ人間が参加するといっても、同時参加者の数という点では今までの社会にないメディアなので、いろいろ外の社会とは異なった習慣が出来る。 また、参加者が同じであっても、その場でのしきたりというものがある。 ネットという社会はまだ未成熟であるが、それなりの風習というものはあるようだ。
悪文の典型に「思います文」というのがある。 「〜と思います」という表現を多用するのは一般的によくないとされているのだ。 ところが、ネットでは比較的この表現がよく使われている。 私も「思います文」が悪文であるということを承知の上で、しばしば使っている。 また、電子会議に慣れていない人に対しては、あえて「思います」と書くとよいとアドバイスしている。 ネットという社会では、読者と発言者の立場が限り無く対等に近いものである。 読者は永遠に読者でいてもいいのだが、発言したければ、いつでも発言者になることができる。 他のメディアだとこう簡単ではない。本や新聞に書かれた内容に対して「いや違う」と思っても、すぐに反論するわけにはいかないし、反論の文章を送れば必ず掲載してくれるとも限らない。 実際、書籍というのはそのような一方的な側面を持っている。 これが読者と著者との距離を保つ働きをする。 距離が離れていると、著者は言いたいことを、とにかく書ける。 何々は何々だ、と書いてあったとしても、それはあくまで著者が勝手に考えたことに過ぎないという前提が、暗黙の了解になっているからだ。
ところが、ネットの発言は、そう解釈されないことがよくある。 「何は何だ」と書いたら、それは一般論として主張された、と読む人が多いようなのだ。 例えば「CはPASCALより開発に向いている」と書いたとする。 私に言わせれば、およそあらゆる主張は個人の主観である。 客観的な意見でさえ、その人が勝手に客観的だと主観的判断したものに過ぎない。 だから、こんなことが書いてあっても、その人はそう考えているのか、ふむふむ、で終わりである。 ところが、これを一般論として解釈して、さらにトラブルに発展させる人がいるのである。 「Cの方が開発に向いているというのは、あなたの思い込みだ。他人に考えを押し付けるな」というのだ。 誰も考えを押し付けてはいないが、勝手に押し付けられたと思い込んでいるのだ。
なぜこうなるのかというと、ネットにおける発言者の対等性がかなり影響しているのではないかと思うのだ。 断言するというのは、かなり強烈な表現である。 他者への歩み寄りを拒否する姿勢を感じさせるのである。 これは距離を置いたメディアでは何でもないが、人と人との距離が近いネットという場では、コミュニケーションの妨げとなるのではないか。
「無限ループにしたい時はforでなくwhileを使うのがよい」と書くと、それは一般論として他の人に主張を押し付けていると解釈されることがあるのだ。 いや、そんなことはない、主張はあくまで主張だろう、本人がそう考えているだけだろ う、と解釈する人も確かにいる。 しかし、そうでない人もいるのである。 「思います文」はこのトラブルを便利にかわす。 「whileを使うのがよいと思います」と書くと、「ふむ、そう思うのか」とまず解釈せざるを得ない。 これでも押し付けだという人がいるかもしれない。 さらに、「あくまで個人的な意見ですが」と前もって宣言するなどの方法はいくらでもある。 しかし、これ以上の手間をかけるよりは、そのような人を無視した方がよいだろう。 ネットには大勢いるのである。
どんなに多くの人がいても、全く考え方の一致する人は一人もいないと考えておくのがよい。 何か自分が書いたことは、必ず誤解されると考えておくものである。 多くの人に理解して欲しい人は、できるだけ誤解の度合が少なくなるように努力すればよいのだ。 誤解されても構わない、という人もいる。
*
話が飛ぶが、fj.lang.c(※1)というニュースグループで、確かdo-while等の話題が出ていたときだったと思うが、List 1のように書いたら無限ループになってしまった、と書いた人がいた。
/* List 1 */
while (i < 10) {
...
} while (i < 10);
もちろん、最初のwhileループから出てこないのじゃないか、とか、breakしたのでは、というフォローがすぐに入ったのだが、「whileのループが終了した」という状況からは、まず条件式が0になったと判断するのが発想としては自然である。 whileループから脱出するのはループの継続条件が破れた時であるという先入観に引き ずられたのだとしたら、結構面白い事例ではないかと思う。
*
for文のループを実行する条件式の部分で比較が行われることがよくある。
例えば、for文でループを10回実行したい場合に、どう書くか。
まさかfor(i = 334; i < 344; i++)と書く人はいないが、わざと何種類か考えれてみれば、少なくとも数通りは書けると思う。
以前、10から始めて0との比較を終了条件とする技
(※2)
に関しては書いたような記憶があるので今回は触れない。
そこで、あくまでごく自然に考えるとどうなるかを想像するに絞って書いてみると、List 2のような2通りの書き方がポピュラーだと思う。
/* List 2 */
/* (1) */
for (i = 0; i < 10; i++)
文
/* (2) */
for (i = 1; i <=10; i++)
文
極端な意見としては、今回のリストのような例だと、iを0から始めた方が初期化のコードが節約できるという人がいるかもしれない。 確かに、大抵のCPUにはメモリまたはレジスタに0を入れるための特別な命令を持っていて、0以外の定数を入れるよりは短時間に短いコードで実行できると思う。 しかしいまやプログラマーがそこまで考える必要はないし、もっと全体的なデザインを重視した方がいい。 この程度の配慮はコンパイラの最適化オプションによって全く無駄な仕事になってしまうかもしれないのである。 コンパイラは、もしかしたらforのループが最適化されるようなカウンタを別に割り当てるかもしれない。
常識という言葉は好きではないので滅多に使わないのだが、あえて常識的という表現を使えば、10回何かを実行させる時に1から10までカウントするというのは常識的だろう。その意味では(2)が自然な発想だ。 ただし、配列要素が常に0から始まるというC言語の世界において、この常識は似合わない。 要素がN個の配列の値を全て何かにセットしたい時に、List 3のように書かざるを得ない。
/* List 3 */
int array[N];
for (i = 0; i < N; i++) { /* (1) */
array[i] = foo(i);
}
for (i = 1; i <= N; i++) { /* (2) */
array[i - 1] = foo(i - 1);
}
どうしても比較を<=でやろうという人がList 4のように書いたら、これはもう変というレベルだろう。
/* List 4 */
for (i = 0; i <= 9; i++)
文
そういえば、「個人的な意見としては〜と思う」というのは、まさにネット風の表現である。コラムではこんなくどい表現は使われないものだ。
1. fj.lang.c
1998年現在、fj.comp.lang.cという名称に変更されている。
2.
単に10回繰り返せばよいのなら、
for (i = 10; i > 0; i--)とした方が、「0との比較」を行うことができるので、処理が速くなるかもしれない。 0でない定数の比較よりは0との比較の方が処理速度が速いCPUが存在する。