要求定義について考える
|
作成日: 2005-11-03
最終更新日:
|
要求定義の本
最近本屋で、要求定義についての本を多く見かけるようになった。
個人的に興味を持っていたこともあり、以前1冊を買っていたが、
最近また2冊を買った。
書いてあることは、みなもっともである。あとは実践できるかだ。
ということで、私が作ったプログラムを題材に考えてみた。
題材
題材は、ホームページ(Webページ)の保守をするためのプログラムである。
具体的には、リンク集の保守に役立つプログラムである。
プログラムの仕掛けを記していこう。以降は悪い書き方であるが、
どこが悪いかを考えて頂きたい。
要求定義
- Webページのリンク集の保守ができる
- リンク集のリンク一覧は、tableタグにより表形式になっている
- tableは1行のtrあたり、リンク1ページから構成される
- tableは1行あたり2列からなる。左側にはリンク先のURLが、
右側にはリンク先URLの最終更新時刻が表示される
- 左側のURLには、ハイパーリンクがつけられる。
ハイパーリンクは、表示先のURLと通常は同一であるが、
フレーム構成の場合などを考慮して、異なってもよい。
- 右側には、
最終更新時刻が"yyyy-mm-dd hh:mm:ss"の形式で日本時間(JST)で表示される。
- 最終更新時刻が得られない場合は、その理由を記した文字列が表示される
- 最終更新時刻が得られない場合とは、次の場合である
- 最終更新時刻とサーバーの現在時刻が等しいとき
- レスポンスが3秒を超えるとき
- レスポンスコード(ステータスコード)が200以外のとき
- tableのtrの表示順は、下記のグループの順(最初のものほどページ上部にある)とする。
- 最終更新時刻が得られたページ
- 最終更新時刻とサーバーの現在時刻が等しいページ
- レスポンスが3秒を超えるページ
- レスポンスコードが200以外のページ
- グループが同じである場合、グループ内の順番は次の通りとする。
- 最終更新時刻が得られたページは、最終更新時刻が新しいものほど上位にもってくる。
- 最終更新時刻が得られない、
あるいは最終更新時刻と現在時刻が同じページでは、
表示リンク(ハイパーリンクではない)のアルファベットの辞書順に並べる。
- リンクをアクセスする時には、サーバーの負荷をかけないよう、headを用いる。
- プログラムは Ruby 1.8 以上で対応する
- アクセス時のユーザーエージェントは、Ruby オリジナルを用い、変更しない。
- 相手先ドメインの robots.txt に指定されるアクセス制限に従う。
- 相手先ファイルの meta="robots" に指定されるアクセス制限に従う。
- htmlで記されたホームページは、ローカルコンピュータで更新する。
- プラットフォームはLinuxとWindows XPである。
- Webページ記述は、日本語は Shift-JIS である。
- Webページ記述の改行は、\r(0x0d)である
- Webページがプログラムでメンテナンスされる部分は、tableタグでsummary="anteno"とあるところに限られ、他の箇所は一切変更しない。
- 保守を容易にするため、プログラムはCVSによってメンテナンスされることを想定してキーワードを埋め込む。
- プログラムの変数およびコメントは、民際語であるエスペラントを用いる。
- エスペラントの特殊文字に付いては、cxux表現を用いる。
- リンクの追加、変更、削除は、メンテナンス者が手動で行う。
- プログラムは、ローカルコンピュータで、
メンテナンス者がログインしたときに自動的に実行される。
- ローカルでの変更があると、自動的にホームページへアップロードされる
想像力と思考力の欠如
上記で書いたのは、散慢で、乱雑で、重複や不足があるひどいものである。
しかし、私だって、必死に書いたのだ。
ここで、書き直すことによって、これよりはましになるだろう。
どのような点について書き直せばよいだろうか。
最近読んだある本に従ってポイントを述べよう。
- 要求と仕様を区別する
- グループ別にする。階層化する。
- 個々の要求と仕様に一連の番号を付ける
もちろん、これら以外にも多くのコツがある。
私自身が気を付けなければいけないと思う、大事なことがある。
このソフトを実際に作り、使うにあたって、
どのようなことが必要になるかを事前に想像力を働かせることである。
あるいは、どのような結果が予想されるか、思考力を鍛えることである。
なお、このプログラムは現在作成中であり、公開は当分先になる。
なぜなら、上記の要求や仕様を半分も満たしていないからである。
遅すぎた公開
仕様を出したきり、余りにも放置しておいたので、
自分でも仕様を忘れてしまったのだ。さて、その元ネタは、
中小企業診断士のリンク集である。
さて、当初の仕様から、どのようにずれていったか、
調べてみよう。
- Webページのリンク集の保守ができる→
これはいいだろう。保守ができるというのは曖昧だが、
以下の要件があれば保守できる。
- リンク集のリンク一覧は、tableタグにより表形式になっている
→これは、そのとおり。
- tableは1行のtrあたり、リンク1ページから構成される
→これも、そのとおり。
- tableは1行あたり2列からなる。左側にはリンク先のURLが、
右側にはリンク先URLの最終更新時刻が表示される
→これはその後、ステータスコードも表示するようにした。
- 左側のURLには、ハイパーリンクがつけられる。
ハイパーリンクは、表示先のURLと通常は同一であるが、
フレーム構成の場合などを考慮して、異なってもよい。
→簡易化を第一に考え、ハイパーリンクとURLは同一とした。
- 右側には、
最終更新時刻が"yyyy-mm-dd hh:mm:ss"の形式で日本時間(JST)で表示
される。
→似ているが、ISO 636 の方式で表示することにした。
こちらは、日付と時刻の間に文字Tが入る。
こちらを採用した理由は、
Ruby でサポートされているタイプが ISO 636 方式だからだ。
- 最終更新時刻が得られない場合は、
その理由を記した文字列が表示される
→理由までは付記しないことにした。
- 最終更新時刻が得られない場合とは、次の場合である
- 最終更新時刻とサーバーの現在時刻が等しいとき
- レスポンスが3秒を超えるとき
- レスポンスコード(ステータスコード)が200以外のとき
→将来はこうしたいが、現在の実装は 1. と 3. のみ。
- tableのtrの表示順は、
下記のグループの順(最初のものほどページ上部にある)とする。
- 最終更新時刻が得られたページ
- 最終更新時刻とサーバーの現在時刻が等しいページ
- レスポンスが3秒を超えるページ
- レスポンスコードが200以外のページ
→将来はこうしたいが、現在は 1.2.4 のみの実装である。
- グループが同じなかの順番は、次のようにする。
- 最終更新時刻が得られたページは、最終更新時刻が新しいものほど上位にもってくる。
- 最終更新時刻が得られないページ、
あるいは最終更新時刻と現在の時刻が同じページでは、
表示リンク(ハイパーリンクではない)のアルファベットの辞
書順に並べる。
→将来はこうしたいが、現在は最終更新時刻が新しいものほど上位、
ということのみである。
なお、同じという判断にも幅をもたせないといけない。
これは、head リクエストを出すサーバーと、
時刻を返すサーバーとの間に時差があるからだ。
だいたいプラスマイナス5秒前後を想定すればいいだろう。
- リンクをアクセスする時には、サーバーの負荷をかけないよう、
(getでなく)headを用いる。
→現状もこの通り。
- プログラムは Ruby 1.8 以上で対応する
→現状もこの通り。
- アクセス時のユーザーエージェントは、Ruby オリジナルを用い、
変更しない。
→現状もこの通り。
- 相手先ドメインの robots.txt に指定されるアクセス制限に従う。
→Ruby のエージェントを使っているので、
自動的に従っていると思う。
- 相手先ファイルの meta="robots" に指定されるアクセス制限に
従う。
→Ruby のエージェントを使っているので、
自動的に従っていると思う。
- htmlで記されたホームページは、ローカルコンピュータで更新す
る。
→ローカルコンピュータでの更新は不定期にならざるを得ないので、
リモートサーバ marinkyo.que.jp に置き、cron
で定期的に自動更新している。
- プラットフォームはLinuxとWindows XPである。
→現在は Linux と FreeBSD で検証した。
- Webページ記述は、日本語は Shift-JIS である。
→現在はutf-8。これは、他のページと同じ。
- Webページ記述の改行は、\r(0x0d)である
→同じ。
- Webページがプログラムでメンテナンスされる部分は、tableタグ
でsummary="anteno"とあるところに限られ、他の箇所は一切変更しな
い。
→もう少しパースしやすい文字列にする。
- 保守を容易にするため、プログラムはCVSによってメンテナンス
されることを想定してキーワードを埋め込む。
→こうしたいが、まだ具体的には想定していない。
- プログラムの変数およびコメントは、
民際語であるエスペラントを用いる。
→こうしたいが、まだ英語である。
- エスペラントの特殊文字に付いては、cxux表現を用いる。
→ utf-8 なので、変数名でなければ、(コメントなどで)
字上符は使えるはず。
- リンクの追加、変更、削除は、メンテナンス者が手動で行う。
→同じ。
- プログラムは、ローカルコンピュータで、
メンテナンス者がログインしたときに自動的に実行される。
→リモートで、定期的に実行されるようにしている。
- ローカルでの変更があると、自動的にホームページへアップロー
ドされる
→リモートで、定期的に実行されるようにしている。
現在、特に手をかけずに動いている。
ときどき、リンク切れのサイトを手で取り除くぐらいだ。
まりんきょ学問所≫
品質の部屋≫
要求定義について考える
MARUYAMA Satosi