2008年10月27日 18:30 [Edit]

そろそろ3つのポイントについて「弾言」しとくか

三つのポイントに行く前に

まずはこの台詞から。

うーんと,30点.「もう少しがんばりましょう」レベル.

まず、この台詞はプロ2グラマーとしては0点。

なぜなら、プログラムが正しいかどうかを決めるのは、使う人々だから。

この中には、自分自身も含まれる。一行野郎からテストスクリプトまで、おそらくプログラムのほとんどは、自分自身のために書かれる。こういうプログラムまで「スコープがどうの」だの「言語がこうの」などというのはまさに none of your business。

逆にたとえ客が何万人何億人いようと、彼らが「充分正しい」と思っていれば、それは正しい。たとえそれがプログラマーの目から見て間違っていたとしても。私がUnicodeにむかつきつつもEncodeを今は亡き Nick Ing-Simmons から引き継いだのはそれが理由。

とはいえ、「正しい」には何種類もあるし、「間違って」いなければ工夫の余地がいくらでもある。これが私が未だにプログラミングに飽きていない理由。

そして時とともに、「正しい」は変わる。コードは変わらないのに人は変わるからだ。だからメンテも終わらないってか。

総論はここまでにして、各論に入ろう。

スコープ

これに関しては、ポステル則で片がつく。

Jon Postel - Wikiquote - 404 Blog Not Found:送り手は控えめに、受け手はおおらかにより孫引き
In general, an implementation must be conservative in its sending behavior, and liberal in its receiving behavior.
[一般的に、送り手としては控えめに振る舞い、受け手としてはおおらかに振る舞うよう実装する必要がある]

すなわち、人の書いたプログラムのグローバル変数は尊重しつつ、自分で書く時はなるべく使わないようにしよう、ということ。

「俺はグローバル変数を使ったことがない」?ご冗談を。環境変数は立派なグローバル変数でっせ。STD(IN|OUT|ERR)も、プログラムの視点から見たら「グローバルファイルオブジェクト」。プログラムが本当に自己完結しない限り、真の意味でのグローバル変数ってないんだよね。いざとなりゃメモリーを読んじゃうって手だってあるのだし。

DRY = 同じロジックのコードを2度書くな

実のところ、手練はみんな無視してたりして。

404 Blog Not Found:LiveCodingに学ぶプログラミングの三原則
参加者の一人として、100%フルスクラッチで書いていた人はいませんでした。たいていは関数単位でコピーし、それを適宜書き換えるというやり方をしていました。

むしろ手練ほど、似たようなロジックはコピペした上で違う部分を上書きする傾向があるように感じる(IDEによる自動補完含む)。過去の自分を Copy on Write しているという言い方も出来る。

忌むべきは、完成した時点で同じロジックが何遍も繰り返されていること。見た目もかっこわるいし「バグのスクツ」になるから。

あと、慣用句はそのままでいい。いくら同じロジックを繰り返したくないからって、

for (var i = 0, l = ary.length; i < l; i++){ /* ... */ }

でちゃんと動いているものを、わざわざイテレーターを自作して悦に入るというのは、自分しかユーザーがいない場合やそれがネタになっている場合を除けば無駄もいいところ。

でもJQueryを使っているのにeach()を使わないのもこれまた「括弧」悪い。私は空気は読まなくてもコードは読むよ:)

プログラミング言語のキワミ、アー!

これは結局山と同じで、高くしようとしたら裾野をある程度広げないと駄目だし、裾野を広げたら自然とその上により高いものを載せられる。単一言語しかしらないのに同業他社の尊敬を集めているプログラマーというのを私は見たことがない。

だいたい、必要とあらばプログラマーたるもの言語の一つや二つはながらで学ぶもの。

404 Blog Not Found:私の言語遅延学習法 - 三つのルール+1
私の場合、一番の特徴は、「必要を感じるまで学ばない」「本当の問題に出会った時に、それを全力で解く」「学ぶ時には『原典』に当たる」ということでしょうか。私はこれを「遅延学習」と呼んでおります。

しかし、プログラミング言語というのは裾野を固める鉱物の一種類でしかないのもまた事実。言語そのものが作品である場合を除けば、ユーザーから見て何が問われるかと言われれば、「書かれたそれで何が出来るか」。Larry Wall は Basic でコンパイラーを書いて、コンパイラーの授業で唯一課題をやりとげた。その Larry が書いた Perl でこの Livedoor Blog も Amazon も動いている。

けど、ユーザーにとって、それは本来どうでもいいこと。はてブが時々文字化けするのを見て「Encodeの使い方がなっちょらんようだな」と思うのは私ぐらいでいいはず。もちろん「なっちょらん」が1割、中の人たちに使い方がきちんと伝わらんでスマソというのが9割。

} # end

しつこいほどくりかえす。ユーザー視点において、 What to Code に比べたら、 How to Code などブロックをendで閉じるか}で閉じるかほどの意味しかないことを。

しかし、その差が気にならない人が良いプログラマーになるということもまずないのだけれども。

Dan the Coder


この記事へのトラックバックURL

この記事へのトラックバック
正当な理由があればどんなルールにも例外を認める方が効率的である、たとえば、C言語で多重ループしていて、一気にループを抜けるのにgoto文なんかを使うのはスマートだと思われる。前提条件によるが多重ループの必要性があって、一気にループから抜けないとダメなら、そう...
遅ればせながら3つのポイントについて「たわごと」言っておくか【某氏のたわごと】at 2008年11月07日 02:17
いや、本当は盲信じゃなくてちゃんと理解すべき。でも理解不十分のまま、ふろむだ氏も言ってるなんて理由でそれに反する事を実行するよりは、盲信してる方が現実的にはよっぽど有益。というのは、彼が言っている事は、 例外的な条件でのコードのあるべき姿の話 そのコードを
[ソフト開発] 逃げる位なら「正しいプログラミングテクニック」を盲信しとけ!【よくわかりません】at 2008年10月28日 22:51
いや、本当は盲信じゃなくてちゃんと理解すべき。でも理解不十分のまま、ふろむだ氏も言ってるなんて理由でそれに反する事を実行するよりは、盲信してる方が現実的にはよっぽど有益。というのは、彼が言っている事は、 例外的な条件でのコードのあるべき姿の話 そのコードを
[ソフト開発] 逃げる位なら「正しいプログラミングテクニック」を盲信しとけ!【よくわかりません】at 2008年10月28日 20:39
この記事へのコメント
より望ましい一般的な
プログラミング言語のキワミ、アッー!
ではないでしょうか?
私自身の感覚では
プログラミング言語のキワミ アッー!と 、ではなく
半角スペースを入れることでワビサビを表現できると思います。
Posted by ワイルドカードの名無し at 2009年06月19日 03:05
>> うーんと,30点.「もう少しがんばりましょう」レベル.
> まず、この台詞はプロ2グラマーとしては0点。
> なぜなら、プログラムが正しいかどうかを決めるのは、使う人々だから。

これは元文の話と少しずれているのでは・・・
元文での話はプログラマが考えている通りに動くプログラムをどう作るか
の話であって、プログラマが考えている事が使う人々の考えている事と
合っているかどうかは出ていないと思うのですが。
Posted by yama at 2008年11月16日 01:03
>真の意味でのグローバル変数ってないんだよね。

ローカル変数?
Posted by ぶぬ at 2008年10月28日 07:43