プログラミングは「ブロックを組み合わせる」感覚に似ている
若い開発者に僕が書いた設計書を説明後、プログラムをJSPから書き始めるのか、それともServletから書き始めるのか、聞いてきた。
僕は、まずJSPを動かしてからServletを書いたら、と言ったら、コンパイルエラーばかりで全く進まない。
僕の意図は、JSPやServletを確実に動かしながら、fakeした機能を一つずつ実装していけばいいだろ、ということだった。
結局、若い開発者にValueObjectからボトムアップで書かせたら、コンパイルエラーもなくなり、ようやく書けた。
プログラムを書く時、トップダウンから始めるか、それとも、ボトムアップから始めるか?
PGやSEなら一度は、はまった経験があると思う。
【1】プログラミングとは、機能を組み合わせていくこと
IT業界に入った時、先輩から、「プログラマは数学者とは違った能力を要求される。機能を組み立てる感覚が大事だ」と言われた事がある。
プログラミングとは、小さな部品(モジュール)を別の部品からコールして、メインプログラムを作っていくこと。
その時に、データ構造とかアルゴリズムなどの数学的知識はあった方が良いが、それよりも、機能を実現するために、数多くのモジュールを組み合わせて整合性を合わせるのが大事。
Perl関西で知り合ったプログラマが「Perlの面白さはCPANモジュールを組み合わせる所にあるんです」と言っていたのが印象的だった。
これはまさにボトムアップからのプログラミングの感覚。
【2】テスト駆動ツールがあれば、トップダウンのプログラミングは可能
ボトムアップのプログラミングで怖いのは、作った小さなモジュールが正しく動かないまま、メインプログラムを実装して動かないこと。
でも、JUnitなどのテスト駆動ツールを使えば、モジュールが小さいほどテストしやすく、品質も良くなる。
逆にテスト駆動ツールがあるならば、トップダウンでインターフェイスを定めながら、仕様が不明な機能はfakeしながら実装できる。
ボトムアップのプログラミングの弱点は、細部にこだわりすぎて、実現する機能をインターフェイスとして考えられなくなること。
テスト駆動ツールを使えば、その弱点を補うことが出来る。
【3】設計者はトップダウンで要求を仕様化していく
設計者の仕事は、あやふやな要求を仕様として落としていくことにある。
つまり、要求から大まかな機能を洗い出し、その整合性を取りながら、機能を矛盾なく実現できるレベルまで細分化していく。
設計者の頭の中では、機能をInputとOutputのペアで考え、ひたすらそのペアの連鎖で全ての機能が矛盾なく動くか、ロジックを組み立てる。
つまり、どう実現するかというHowよりも、何を実現するかというWhatを重視している。
そして設計手法は、自然にオブジェクト指向設計になる。
機能をオブジェクトに見立てて、メッセージを送ったら、自分が何をするか知っているから期待した結果を返す。
そのオブジェクトを整合性を保持したまま協調動作できるか?という考えをずっと突き進めるだけ。
これは、トップダウンで仕様を煮詰めていき、最終的にインターフェイスを決めるまで突き進めることと同じ。
オブジェクト指向設計の良い所は、メッセージ送信という発想によってInputとOutputの関係だけに注力できることと、実現できるかどうかというHowの部分をカプセル化して設計を先に進めることができること。
トップダウン設計では、要求から仕様へ落とし、最終的にはクラス図へ落とす。その時点で、ほぼ設計は出来上がる。
クラス図ができれば、実装は単なる機械的作業にすぎない。
【4】WhyとWhatとHowの関係
Howを考えるのは、実装であり、プログラマのお仕事。
Whatを考えるのは、仕様であり、SEのお仕事。
Whatを洗い出す時、要求の理由や背景を考えた方が良い時がある。
つまり、何故そんな機能が必要なのか、をぶつけていくと、そもそもそんな機能は必要ではなかったとか、実は別の本質的な機能が必要だった、ということもありうる。
要件定義とは、Whatで考えるために、Whyをどれだけお客から引き出せるか、という技術を要求しているのだろう。
【5】プログラミングの楽しさはモジュールの組み立てにある
プログラミングの楽しさは、少年時代に積み木やブロックで好きなように組み立てた経験に似ている。
そして、その組み立てた物は、実はすごく脆い。
ほんの少しバランスが崩れただけで、全部壊れてしまう時だってある。
その辺りのハラハラドキドキ感が楽しいのかもしれない。
デスマーチではハラハラドキドキしたくないけどね(^^)
| 固定リンク
「プログラミング」カテゴリの記事
- Javaのモジュールシステムの考え方をまとめてみた(2022.10.21)
- Javaのモジュールシステムは複雑性をより増している(2022.09.10)
- Javaはなぜ関数型言語になろうとしているのか(2022.09.02)
- Javaのラムダ式の考え方(2022.08.10)
- Javaはオブジェクト指向言語ではなく関数型言語だった~「[増補改訂]関数プログラミング実践入門」はお勧めの本だ(2022.08.06)
コメント
お久しぶりです、関西BMのふくもとです。
OO以前のソフトウェア開発で言うと手なりでコーディング出来る人と紙とかに設計をしっかり書いてイメージ作ってからで無いと書けない人にはっきり分かれました。
プロトタイプ的と言うか、ある程度以上の複雑さを持ったロジックを書く場合は一気にトップダウンでってのは経験が少ないと難しい気がしますね。
処理に対する命名が正しく・十分で、設計分割粒度が適切で初めて、あきPさんのおっしゃるトップダウンからの実装が出来るのかもなーとか思ったり。
しっかし、あきPさんは相変わらず精力的に活動なさってますねー本当に関心しちゃいます。
投稿: ふくもと | 2007/03/22 13:02
あきぴーさん、こんにちは。
今更のコメントで恐縮ですが、
なるほど、こういうことだったんですね。(^^;
最近、Ruby関西の人たちとよく話をするのですが、
皆さん「テストは」してますね。
ただし、それをirb上で実行してしまっているので、
「テストコードが保存されていない」という落とし穴に
はまってしまっています。
irbにて実行したセンテンス(複数行の文)を出力するような
仕組みが用意されると、Rubyでももう少しユニットテストが
普及するかもしれません。
簡単な例としては、こんな感じでしょうか。
もうすでにあるかも知れませんね。
irb(main):001:0> def hoge
irb(main):002:1> puts hoge
irb(main):003:1> end
=> nil
irb(main):004:0> print_def hoge
def hoge
puts hoge
end
irb(main):005:0> print_seq[1..3]
def hoge
puts hoge
end
投稿: raito | 2007/05/05 23:44