(201の鉄則:原理73<設計の原理=カップリングとコヒージョンを使え>)
凝集度とか結合度というのは、構造化手法では入り口のところにあって、本来はここを通って構造化設計や分析に入るようになっていました。もっとも、構造化プログラミングとは、3つの部品で書くことであるとか、構造図を書くことが構造化設計であると考えた人たちは、このステップを飛ばしたかもしれません。そのため、「C言語」で書かれたプログラムでも、関数の呼び出しの際にはパラメータは空っぽであったり、皆で仲良くグローバル・データを更新しあったり、構造図も概念的な階層を表すだけで、そこからは必要な情報は何も得ることができません。
その結果、幾つかの関数は緊密な関係に陥り、こちらを修正すれば、あちらも修正しなければならないような状況が、派生モデルのための修正を重ねる毎にひどくなっていきます。
ヨードンは、その著書の中で「構造図を書くことだけが構造化設計ではない」と嘆いています。構造図は結合度や凝集度の判断を助ける「ツール」であって、構造化設計の主題は、モジュールをこれらの尺度に従って判定し、保守性や適応性を高めることにあるのです。
設計という明確な行為なしでは、結合度や凝集度の尺度を織り込むことは出来ません。多くの人は、まともな設計書も書かずに、昨日のプログラミングの続きをするために、CRTの前に座ってエディターを起動し、作り掛けのソースを開きます。そうして昨日の作業を思いだし、新しいコンポーネントを頭に浮かべて、やおらキーを叩き始めるのです。もちろん、その途中で何度も昨日までに打ち込んだソースを見るために、画面を忙しくスクロールさせます。
こうしてインプリメントされたソースに、結合度や凝集度という尺度の入る余地はありません。コンポーネントを分割するときの動機は、単に長すぎて自分でも分かりにくくなったときや、考えるのが複雑になってしまうので、取りあえずそこに新しいコンポーネントの呼び出しの手続きをいれるときぐらいです。“乗っているときは”コンポーネントの大きさや、相互の関係など“関係ない”のです。
関数の呼び出しの形も統一されているわけではなく、同じデータでも、あるときは要素で渡したり、あるときは構造体で渡したり、グローバル・データを直接参勝しにいったりします。
プログラムは、保守という行為がなければ、極端に言えば、少々いい加減なモジュール構造でも構わない。もちろん、テストやデバッグの作業で混乱するかも知れませんが、それでも、設計してからそれほど時間が経っていないためなんとかなるものです。問題は、6ヶ月後に始まる派生モデルの開発です。
そこでは、操作性や性能の向上が求められ、新しい機能が追加されます。当然、新規開発の時とちがって開発期間が短いために、時間をかけて思い出したり、影響範囲を入念にチェックしたり、試行錯誤を繰り返すことが出来ません。それだからこそ、修正するたびに新しいバグを織り込んでしまうのです。
結合度や凝集度という尺度は、保守のために考えだされたものです。もちろん、この他にも「複雑度」という尺度も保守性を高めるのに有効な尺度です。最初からこのような尺度に沿ってコンポーネントが設計されていることで、保守開発をやり易くしたり、新規バグの侵入を防ぐのです。また、これらの尺度の詳細な定義を知っていることで、目の前の修正されようとしているコンポーネントに対して、どのような注意が必要かもわかります。
こうしたコンスタンチンとヨードンの素晴らしい研究成果があるにも関わらず、そのことを知ることなくプログラムの生産活動に就いていることは、驚きとしか言いようがありません。
そして、この問題はオブジェクト指向の時代に入って、さらに悪くなるように思えます。オブジェクト指向の文献には、この結合度とか凝集度という用語は、全くといってよいほど出てきません。オブジェクト指向にはクラス間の結合やクラス自体の凝集という考え方も必要です。もちろん、結合度とか凝集度という言葉は使いませんが、クラス間の接続を複雑にしてしまうと、「is-a」や「has-a」の関係が説明できなくなってしまい、再利用に支障を来します。
当然、メソッドに於ては、凝集度や結合度という尺度はそのまま持ち込むことが出来ます。オブジェクト指向の言語であろうと、構造化手法の言語であろうと、複雑な凝集度をもつコンポーネントは、間違いなく保守の敵です。オブジェクト指向だからといって、派生モデルの開発がなくなるわけではないですから。
機能的に膨らむ傾向のあるクラスや、ひとつのメソッドでの処理が大きくなってしまうような場合、クラスを上手く分割することでメソッドを分割することもできます。その際、結合度や凝集度の尺度が判断の参考になります。
しかしながら、そのような行為は、結合度や凝集度の考えを明確に持っているから判断されることであって、そのような考えを持ちあわせていなければ、分割のための工夫や知恵が働く余地はないのです。
◆ ◇ ◆
わが国では、ソフトウェアの開発作業に就いているエンジニアでも、分析・設計手法について基礎的な勉強を履修している人は少ないので、今後、オブジェクト指向が広がるにつれて、この結合度や凝集度という考え方は希薄になっていく危険が高く、ソフトウェアの保守能力は確実に低下することが予想されます。
▲高齢運転者による事故の比率が高くなっているのを受けて、さきごろ「高齢運転者マーク」なるものが公表された。運転者が高齢者であることをマークによって他のドライバーに知らせ、注意を呼び掛けると同時に、高齢者の運転する自動車に対して幅寄せなどの危険な行為を禁止しようというのである。今年の10月ごろにも実施されるという。
▲発想は「初心者マーク」と全く同じであるが、初心者マークの方は、しばらくすれば外れるにの対して、高齢者マークは一度使用すれば最後まで外されることはない。それだけに心理的に「自分は高齢者なんだ」という意識を与える危険があるのと、逆に、このマークを貼ることで「守られるべきなんだ」という居直りの意識に陥る危険がある。特に時間が経って、このマークを使用する高齢者の人数が増えてくると居直りそうな気がする。
▲高齢者にとって、自動車は欠くことの出来ない移動手段である。病院への通院や買い物など、日常生活を営むうえで若い人よりもむしろ必要性が高い。老夫婦がカーナビのハイテク装置を使って、見知らぬ土地に旅をするなんて想像しただけでわくわくする。このような移動手段がなければ、足が弱っただけで家の中に閉じこもってしまうことになるし、移動には常に誰かが付いていなければならなくなり、経済的にも大きな負担になってしまう。
▲だから高齢者も「高齢者マーク」に頼るのではなく、日頃から運転技術を落さないように、動体視力や反射神経、反応速度などに注意し整えておくぐらいの努力をして欲しいし、その上で、運転を続けるかどうかの判断を自分で責任をもってやって欲しい。そうでなければ「高齢者マーク」は逆に嫌がらせや攻撃の標的になってしまう。
二一世紀はアジアの時代だとか、日本もアジアの国々に追い上げられる、という文字を時々目にします。実際に、ソフトウェアの世界では、インドの発展は目覚ましいし、周辺のアジアの国々も、インドに倣ってソフトウェア産業に重心を移しているようです。
◆
ところで、日本の企業の関係者たちは、一体「アジアの台頭」をどのように見ているのでしょう。アジアの国々も21世紀に入って経済力をつけてくるだろう、という程度にしか考えていないのではないでしょうか。そこでは、日本という国は「今のまま」存在していて、その前提でアジアの国々の台頭をイメージしているのではないでしょうか。
◆
1950年、60年代に、日本から民生用電子機器や工作機械、あるいは自動車などが大量にアメリカの市場に輸出されました。その結果、アメリカでは自動車産業は残ったが、他の産業は大きなダメージを受けました。当時のアメリカの生産性は、世界的に見ても決して悪くはなかったのですが、それ以上に日本の生産コスト、特に労働コストが安かったのです。
◆
アメリカは、その状態から規制の撤廃に踏みきり、競争原理を全面的に取り入れたのです。確かに、レーガン政権の段階では、その痛みだけが目立ったため失業率が上昇し社会的に混乱したことがありましたが、今日になって、当時のレーガン大統領の政策は評価されているようです。アメリカの再生は、そこから始まっているのです。
◆
さて、視線を日本とアジアに向けてみると、そこには40年前の姿が見えます。経済大国という呼称に酔って、自らを改革することを忘れている国と、月収が4,000円の労働力を大量に(20億人以上)抱え、環境が整いだすのを今か今かと待っている国々が見えます。彼らが、今度は民生用電子機器を生産し、工場に使うための工作機械を生産し、豊かになっていく人々の衣食を満たすために繊維製品を生産して輸出を開始するのです。GEのウェルチ会長が、ほんの一部を残して、100年も続いた「白物家電」から撤退した理由は、まさにここにあるのです。
◆
今、製造業であれソフト産業であれ、5年前と変わり映えのしないやり方で仕事をしている人たちは、間もなく開くこの幕の向こう側が見えていないのではないでしょうか。21世紀の日本は、過去の延長線上には存在しないということが見えていないのではないでしょうか。シェルの最近の長期予測では「改革しないと生き残れない改革競争の時代」に入ったと警告しています。
◆
1989年に発表され、その後のアメリカ再生のシナリオを提供した「Made in America」には、日本に敗れた原因として真っ先に批判しているのは「時代遅れの経営戦略」です。「経営者と労働者が、昔ながらの事業経営の慣習をあまりにも忠実に守っているために、新しい経済環境を理解できなくなっている」と指摘しています。そして、あのアメリカであっても、経営者の視野が国内に向いていて、世界を見ていなかったことを指摘しています。その結果、アメリカは日本やヨーロッパ勢に負けたというのです。まるで、今の日本の状況そのままであり、このあと起きることを予感させます。
◆
それでも、アメリカは研究機関が勝れていたし、世界の「頭脳」が集まっていました。国内の規制や関税の障壁を取り除いた途端に競争が始まりました。一時的に大量の失業者が溢れましたが、彼らは中小企業に吸収されると同時に、新しい産業を作り出した。アメリカには、社会の風土も含めて、そのような方向転換の下地があったとも言えます。
◆
そしてアメリカの産業界は、史上最高の収益を上げながらも、なおも生産性の手綱を弛めようとしません。私には、来たるべきアジアの台頭の意味を認識しているように思えてなりません。中国を含めたアジアの国々が台頭してくることは時間の問題です。世界戦争でも起きないかぎり、この流れを変えることは出来ないでしょう。そこまで明白な以上、今のうちに走ってしまおうというのでしょう。GEの会長であるジャック・ウェルチの言葉に「80年代にはぶらぶら散歩していたようなものだと思えるほど、90年代は競争環境が厳しくなる」というのがあります。この言葉は80年代のものですが、これを21世紀になって日本の経営者は経験することでしょう。
◆
最近の日本の企業は、何となく惰性で動いているように見えます。そこでは以前ほどには「生産性」という言葉は耳にしません。耳に入ってきたとしても、ほとんどは念仏のように口にしているだけで、生産性につながるような具体的なイメージも為されていないのでしょう。果して、このような状況で21世紀に直面するアジアの台頭にどのように対応するというのでしょうか。アジアの台頭の意味が、本当に分かっているのでしょうか。それとも、それ以上に「今日のこと」の方が大きな問題なのでしょうか。■
「読書と同じように単なる経験もあまり思索の補いにはなりえない。単なる経験と思索の関係は、食べることと消化し同化することの関係に等しい」 シーペンハウエル
さて、二回連続してショーペンハウエルを引用します。
経験も、そこから思索を引き出さない限り、ただの経験で終わってしまう。なぜこうなったのか、他に方策はなかったのか、今度起きたときはどのように対処しようか、などと考え抜かなければならない。
人は、何らかの活動をしている限り、いろんな経験をする。そしてその時々に思索を取り入れる余地があるのに、多くの人はそのまま放置してしまう。それは、折角口に入ったものを、消化も吸収もしないでそのまま排出するようなものである。
私は、プログラムのバグや、スケジュールを狂わせる事態に遭遇したら感謝することを勧めている。多くの人は首をかしげるか苦笑いしているだけで、「言葉の遊び」とでも思っているようである。思索ができなくなっている人には、それが限界かも知れない。
人は、肉体の腹が減れば食事を催促し食物を取り込む。それが直に満たされないとイライラする。だが多くの人は思索の腹が空っぽになっていても気付かないし、イライラすることもない。プログラムのバグはまさに思索の腹に入る栄養豊富な食物である。これをきちんと消化し、フィードバックしていくことで「能力」が強化される。にもかかわらず、多くの人は、栄養豊富なバグを消化し同化しようとしない。