- - PR -
ソフト開発を成功させる1つの方法の感想
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2001-10-22 22:26
「マーフィーの法則の同類」と言われてしまうと、納得してしまうではないですか。 「短い」ではなくて「シンプル」だったら、より真実に近いのでは、と思うものの、こんどは、「シンプルなプログラム」の判定方法が問題になります。 XP が出てきたところで、Kent Beck の「シンプルな設計」の条件、
というのはどうでしょう? もっとも、OOP が前提になっているので、そういう環境で仕事をしていない人からは、そっぽをむかれるでしょうね。 -------------------------------- biac#Cでgotoを使う男 [ メッセージ編集済み 編集者: biac 編集日時 2001-10-22 22:28 ] | ||||||||||||||||
|
投稿日時: 2001-10-22 22:49
その通りです。ですが、長くても短くても同じではありません。 もし、for文の終了判定を100回に1回間違って書くプログラマが居た場合、for文が10回含まれるプログラムでは、10プログラムに1回程度の割合でバグを作り込むことになります。しかし、for文が100回含まれるプログラムでは、1プログラムに1回程度の割合でバグを作り込むことになります。仮に同じ機能を実現するプログラムだとすれば、余計な機能を取り去って、より少ないfor文で実現する方がバグに巻き込まれる確率が少ないことになります。 それはさておき。
これは容易に防止できるバグです。 ループの終了値が1個ずれるのは、定番のバグです。これは終了値とループする回数の関係を正確に把握していない、あるいは、正確にソースコード上に表現されていないことから入り込むバグだと思います。 よく使われるパターンの for( i=A; i<B; i++ ) は、B-A回まわります。 それに対して、 for( i=A; i<=B; i++ ) はB-A+1回まわります。 まわる回数が1回違うにも関わらず、両者は非常に紛らわしい見かけになります。 ですので、紛らわしい使い方は使わないように習慣づける、というのがバグから逃れる方法の1つです。 つまり、 for( i=A; i<=B; i++ ) を書きたいときは、 for( i=A; i<B+1; i++ ) と書くように習慣づけると言うことです。これにより、B-A+1回の+1がソースコード上にも明示的に見えるようになるので、何回まわりたいのかがソースを見る者に分かりやすく伝わります 。 _________________ | ||||||||||||||||
|
投稿日時: 2001-10-22 22:59
うぉっと! なんか妙な気分になって来ました。 以下の2つを見てください。 まず私が今日書いた「短いプログラム」のより明示的な定義。
そして、XPのシンプルの定義。
なんだか、同じことを言ってるような気がして来ませんか? _________________ | ||||||||||||||||
|
投稿日時: 2001-10-23 03:37
いやぁ、DOS いいっすよ。DOS6 以降。タスクスイッチあるし。
世の中の PC で行なわれてる仕事の 80% は、メニューから数字でやりたいことを選んでカーソルでポチポチ移動でできますよ? 汎用アプリも Just Window とやらぐらいでできますよ? ちうか、むしろ、改行で fold したり、「4倍角はどうするんだ?」っていう人はたくさんいますよ? # 川俣さん壊れてきた?(笑) | ||||||||||||||||
|
投稿日時: 2001-10-23 04:11
どちらにせよ、「機能」「要素」「ロジック」をどの程度の大きさにとるか明確じゃないですね。先の汎用化にしても、結局この部分をどの程度にとるかによっていろんなことが変わってきます。 XP もマーフィーだってことで:P デザインパターンも XP も、職人の暗黙知を形式知にしてみた、ってだけな気がしてなりません。職人は「そうそうそうなんだよ、俺がいいたかったのはこれなんだよ。よくいってくれた」とうなずき、普通の人は「ふーん、そうなんだー、うまくいくんだー」と思い、管理者は「よくわからんけど常識らしい。キミら勉強しとき」と言える。すばらしい:P -- あ〜、シンプルさと言えば認知科学とか使うと面白そうですねぇ。人が認識しうる「シンプルさ」とか「抽象性」とか「構成物の数」とか:-) マジックナンバーで「クラスの継承関係は、7個でひとつの機能的グループができるようにしましょう」とか | ||||||||||||||||
|
投稿日時: 2001-10-23 08:06
途中からおじゃまします。
大学1年生達の書いたプログラムをテストするというのを何度かやったのでその時の経験談です。 まず、AutoMarkというプログラムで皆さんのプログラムを自動テストします。いろいろな条件でテストして、パスすれば点がもらえるという方式です。そのあと、私みたいな3年生や4年生達が一つ一つソースコードをみて、スタイルを見ていきます。 気づいたこと
読みやすいというのは、コメントが多すぎずそれでいて説明が十分なことです。
逆にCで
で大体思うのは、読みやすいソースは短いんです。一度、横534桁の行が(かなり長い時間スクロールしないと読めない)あってのけぞりました。案の定、自動テストの点はほとど0に近い点数でした。 あと、突如現れるマジックナンバー。2ってなんだぁ!なんて叫びたくなります。forやwhileなどを多用しすぎるもプログラムもバグが多いですね。大体こういうのはコードも長いわけです。 ほとんどの場合、正しいプログラムは読みやすく読みやすいプログラムは短いです。だからと言って逆も成り立つかというとそれはどうでしょうね。私個人の意見では、「短いプログラムは正しいプログラムになりうる可能性が高い。よって短くするべきである」ですね。 p.s. もうひとつ経験ですが、Windowsのデスクトップ上ですか?(もしくはUnix/Linuxのホームディレクトリ上)あの場所にぽこぽこ無駄にファイルを置く人のプログラムはやっぱり長くてバグが多いです。関係あるんでしょうかねぇ?
| ||||||||||||||||
|
投稿日時: 2001-10-23 13:30
んでは、Kent Beck の相棒 Martin Fowler の「リファクタリングを行う理由」から。 (「リファクタリング」ピアソン・エデュケーション; ISBN:4894712288)
※ 2001-10-22 22:26 に書いた、『Kent Beck の「シンプルな設計」の条件』が出てくる本は、「XPエクストリーム・プログラミング入門」(ピアソン・エデュケーション; ISBN:489471275X) です。 | ||||||||||||||||
|
投稿日時: 2001-10-23 14:52
そういえば、昔読んだ本の中で、戦艦大和を建造した技術者の言葉として、「こんなに大きな戦艦を作ったことが凄いのではない。これだけの機能を、このサイズに納めたことが凄いんだ」というのがありました。普通に作れば、もっと大きくなってしまうものを、このサイズに納めたってことですね。 大きい、小さいなんていうのは、対象を見る基準や視線によって容易に変わりうるものだと言うことでしょうね。
XPが経験則の集大成なら、マーフィーっぽくても当然かも知れませんね。
人間に理解できる複雑度の範囲、のようなものが明確に分かってくれば、いろいろな問題に取り組みやすくなりますね。 ただ、人間の理解力というのはそれほど高くないような気がします。 もしかしたら、理解が得意な人間というのは、実は理解しやすいように整理するのが得意なだけかもしれません。 もし、うまく整理できれば、整理できていない人よりも、書くプログラムも短くなりますね。
これも難しいところで、誰でも容易に分かるような関係なら多少増えても平気だが、理解しにくい抽象的な関係は少なくても難解、ということがあるかも知れません。ただ、目安としてマジックナンバーを導入するのは良いかも知れませんね。 1メソッドは100行以内、といったルールを持っている人もいますから、目安としてのマジックナンバーはあっても良いと思います。 _________________ |