ブログトップ 記事一覧 ログイン 無料ブログ開設

babydaemonsの日記 このページをアンテナに追加 RSSフィード

2010-04-24

[][]コラム「システムエンジニア 生き残りの極意」でちょっとした祭りになっている件

"ちょっとした祭り"の実態は?

えーと、ソースはこちらです↓

とりあえず現時点でのこのコラムへのコメントのエッセンスを纏めます。

それよりも、ポリモーフィズムオブジェクト指向の肝だと思います。

ポリモーフィズムをうまく使うと条件分岐の記述を減してすっきりしたコードが書けます。

ぬ様のコメント

ぬ様

貴重なご意見ありがとうございました。ポリモーフィズムについては勉強したいと思っております。

みながわけんじ様のコメント

ポリモーフィズムについては、私は

関数へのポインタ(C言語)のデラックス版を使って、何かをやる」

と捉えています。C言語において、関数をそのまま呼ぶのではなく、ポインタを通じて呼ぶようにすると、

「たまたまその時、どんな関数がそのポインタに指し示されていたか」

によって、結果がまちまちになりますよね。

この特性を意図的に活用すると面白いことができるかも知れない。

引数戻り値の型は揃っているが処理内容がまちまちな関数をいくつか用意しておき、プログラム実行時、その時その時の事情に合わせて関数をチョイス(ポインタにセット)すれば、後はそのポインタを通じて呼び出された関数が、宜しく仕事をしてくれる訳です。

さらに、複数の関数をまとめてポインタで扱えればより便利かも知れない。さらにさらに、その関数群の内輪だけで共通の定数や変数を持たせられればより便利かもしれない。(デラックス版)

ぬ様のコメント

ポリモーフィズム多態性)を知らずにオブジェクト指向という単語を口にするなー!!!

と正直思いましたが、それゆえオブジェクト指向がしっくり来ないのでしょうね。

ぬ様の最後に引用した箇所は恐らくGoFデザインパターンのStateパターンを念頭に書かれているのではないかと想像します。

#全力で易しく説明しようとしているぬ様は神

何でポリモーフィズム多態性)が必要なの?

10行×10列程度の状態遷移マトリックスを昔ながらの方法(if文、switch文での分岐)で実装すると可読性はかなり落ちます。100行×100列程度になると、もやは保守しつづけるのは神の世界です。
#今のシェアは知らないけど2000年頃はシェアTOPだった銀行ATMメーカでの話。
#多分、自動車のECUも似たようなものだと思う。

こんな分岐だらけのコードをステップ実行による全パス網羅のホワイトボックステストをやろうとすれば想像を絶する苦行になります。
#それでも実機を使ったテストよりもはるかに容易いのだが。

今ではコスト要件や性能要件が厳しい組込開発でしか意識しなくてもいいのかもしれませんけど、実行時に分岐すれば性能(実行スピード)にモロに響きます。

x86ではCoreアーキテクチャが主流になった現状からすると適切な例では無いかもしれませんが、NetBurstアーキテクチャPentium 4はクロック周波数をひたすらあげるためにとんでもなく深いパイプラインになっていて、分岐でパイプラインが乱されたときのペナルティが大きいです。

(cf. NetBurstマイクロアーキテクチャ - Wikipedia)

以下の2つの

  1. 状態遷移マトリックスのセルの数だけ分岐ルートを作るのは、書くのもテストするのも保守するのも大変。
  2. 実行時に分岐を行うと性能が劣化する。

という問題を避けるため、状態に応じて事前に全ての必要な分岐を行っておくというアプローチが有効です。これをうまく実現する手段がポリモーフィズム多態性を活用したStateデザインパターンなのです。

多態性って何?

C言語で例が書いてあるので(つまりオブジェクト指向言語を知らなくてもいいので)、ここがわかりやすいんじゃないかなー?

Stateデザインパターンって何?

Javaを知らなくてもいいので、ここがわかりやすいんじゃないかなー?#C++が判り易いかというツッコミはあえてスルーw

Stateパターンを使うと、状態遷移マトリックスの実装が必須な組込とかのハードウェア制御系の開発効率が異次元に向上するの間違いなし!

#まぁ、大手は多分やってるよね。

ブログで書くのはしんどいので、気が向いたらスライド書いて、SlideShareに上げるかも。

ちなみに「オーバーヘッドが大きいからC++は使えないよー」みたいなお仕事でも、さっきのCodeZineの技を使えばC言語でStateデザインパターンが使えます。

「じゃあ、お前書いてみろっ」と言う方、仕様と時間を与えて下さい。あとは書くもののライセンス等に応じて、あなたの熱いハートかそこそこのお金*1が必要ですw

で、この仕組みで実装してあると、状態マトリックスの状態縦1列が1クラス、イベント横1行が1メソッドになるので見通しが非常に良くなる上に、ホワイトボックステスト(命令網羅&分岐網羅)がdJUnitなどで容易にできます。

Stateパターンで書かれたコードをxUnitでテストしたときのカバレッジレポートで命令網羅率や分岐網羅率が100%にするのと、それを分岐だらけのコードでデバッガでステップ実行して実現するのを比較すると、もうi8086Core i7くらい開発効率に差が出るんじゃないかなー。

ちなみに、ググって資料さがしましたが、

圧倒的にJavaの資料が多い!
C#の資料はあまりないんだけど。orz
大規模開発やミッションクリティカル開発では、
Javaの方が.NET Frameworkより多いって事?

#まぁ、でもNASDAQの取引システムSQLServerSQL CLRで実装みたいだけど。

ところで、「みながわけんじ様」はどんなお方?

大学の専攻が情報工学ではなく電子工学なのでハードのほうが電子工学の知識が応用できると思ったからだ。以後、その会社をやめるまでハード設計の仕事につくことになった。といっても、やはり職場にはUNIXワークステーションがあり、C言語を使ってハードの動作を検証するシミュレーションに大きな時間を費やしていた。

システムエンジニア 生き残りの極意 ぼくのシステム回顧録(1)

正しい道を歩まれた方のようです。

わたしがこのC/Sシステムの走りの時代に特に興味をもったものは、マイクロソフトVisual Basic とリレーショナル・データベースであった。Visual Basic についてはGUIベースのアプリケーションを手軽に開発できるという意味で画期的だった。

 また、コンポーネントの属性にプロパティというオブジェクト指向っぽい手法が取り入れられていた。オブジェクト指向BASICコボルC言語の熟練プログラマーでさえ抵抗感があり、C++の入門書を読んでもピンとこない概念であるから、それを開発手法にとり入れることは非常に先駆的である。

システムエンジニア 生き残りの極意 ぼくのシステム回顧録(2)

このあたりで、M$VBという麻薬を打たれてしまったようです。お気の毒に。。。

ところが、マイクロソフトASPというものを知りノートパッドでコードを書き、IISの設定を行うことで動的なサイトが簡単に作れる! この手軽さから、わたしはVB開発はやめてASPによる開発を全面に押し出していった。

システムエンジニア 生き残りの極意 ぼくのシステム回顧録(2)

CGIに比べれてASPは確かに先進的でしたが、独自ActiveXが必要なお仕事には不向きですね。かと言ってActiveXで部品化すべきロジック(=ビジネスロジック)を全部VBScript/JScriptで書いちゃうと*.aspのファイルサイズに応じてIISがメモリ喰っちゃうので、少なくとも大規模システムには向かない様ですね。インデントやコメントも含めて*.aspが丸のままメモリにロードされるみたいです。100MBくらいコメントだけの*.aspを読ませたら、IISのプロセスサイズが悲惨な事になりましたww

#パフォーマンスモニタでメモリ使用量はかりました。

まぁ、ビジネスロジックSQLServerのストアードプロシージャで書かない、かつて携わったそのプロジェクトのアーキテクチャが終わってた訳ですが。

現在マイクロソフト製品による動的なサイトの開発の主流はASPではなくASP.NETになっている。個人的にはASPは非常に気に入ってが、現在ASP.NETでシステム開発を行っている。マイクロソフトASP.NETに将来を託しているに違いないので、その路線に乗らざるを得ないってとこですかね。

システムエンジニア 生き残りの極意 ぼくのシステム回顧録(2)

と言うわけで、

みながわけんじ様」はM$に毒されてしまったお気の毒な方

のようです。ご愁傷様です。m(_ _)m

SEE ALSO

*1愛知県最低時給に比べて十分に高い単価w

JittaJitta 2010/04/25 12:53 Microsoft MVP 受賞者が通り過ぎます。
64年生まれて言うことですから、就職するころはまだまだUNIX全盛期ですね。
かく言う私も、最初はUNIXerですから。
「DOS?640KBしか使えないの?だめじゃん。」
「Windows?他のマシンに画面送れないの?だめじゃん。」

babydaemonsbabydaemons 2010/04/26 21:43 私もBSD育ちでLinuxデビューしたのは意外と最近です。#Linuxでカスタムカーネルを作ったことが無いw
RDPでOS標準で他のマシンに画面を送れるようになりましたが、
1枚のデスクトップにネットワーク透過であちこちのマシンのウィンドウが出せるX11の方が
あちこちのマシンを股に掛けて作業するときは有利ですね。

このエントリではMSをDisってますけど、C#とかSQL Serverは好きですよー
MSのなかの人も「ライセンス的にアレだけど、Reflector for .NETは便利」みたいなこと言ってるのをどこかで見た記憶があるのですが、
Microsoft.*な名前空間のDLLを逆コンパイルして読んでみると、及第点としてどのように書けばいいか勉強になります。

MATSUZAKIMATSUZAKI 2010/04/27 20:46 ポリモーフィズムやStateが有用なのはわかりますが条件分岐によるパイプラインストールについては疑問です。
仮想関数呼び出しでは関数テーブル等を通した間接ジャンプが必要なので結局条件分岐と同様のことがおきてしまうのではないかと。

babydaemonsbabydaemons 2010/04/28 01:03 MATSUZAKIさま

ご指摘ありがとうございます。

パイプラインストールについては、状態値だけみて分岐するなら投機的実行が有効に働きそうな気がしてて、
ぢつはこのエントリで書いてるほど状態値による分岐でもパイプラインが乱れないのかなーと思っていたりします。

ただ、関数テーブルはconstな領域なので、一度関数テーブルからロードされたアドレスは使いまわされているのではないかと期待してます。
#妄想かも。

何はともあれ、g++ -Sで両方のコードを*.sに落として読んでみないと始まりませんね。
#i386のころとは違い、投機的実行される環境の機械語を読んで理解できるかは判りませんが。
#あとは、ベンチマーク測定か。

GWの宿題がどんどん貯まっていってる気がする。。。orz

lalupin4lalupin4 2010/04/28 21:16 実は彼はオブジェクト指向を結構勉強していて、static メンバーを多用しているバカのロジックと行動を利用して皮肉っているだけの可能性ってないでしょうか。

babydaemonsbabydaemons 2010/04/28 21:30 lalupin4 さま

うーん、だとすると壮大な釣りですね。フジテレビの素直になれなくて状態だなw

lalupin4lalupin4 2010/04/28 22:31 > babydaemons さま
お返事ありがとうございます。

結構な量のコメントが釣れているので可能性を否定するのをためらっています。

腰の引けた意見しか申し上げられなくてすみません。
私も素直でないひねくれた人間なので遠回しな表現しかできません。
お許しください。

inazuma1inazuma1 2010/05/07 02:03 興味深く読ませて頂きました。

MSに毒されていても、オブジェクト指向出来ている人も沢山いますヨ。

私は、オブジェクト指向の一番の利点はコードの再利用だと思っています。

かの方も.Net Frameworkのクラスを再利用されているからこそ、あのような戯れ言が
言えるのではないでしょうか?

まあ、かの方の各コードは誰も使わないので再利用など設計当初から念頭にないのでしょうね。

まあ、自分だけの閉じた世界で生きていける幸せな方みたいですので、そっとしてあげましょう。

babydaemonsbabydaemons 2010/05/09 14:54 inazuma1さま

>MSに毒されていても、オブジェクト指向出来ている人も沢山いますヨ。
それはもちろん知ってます。

>かの方も.Net Frameworkのクラスを再利用されているからこそ、あのような戯れ言が
言えるのではないでしょうか?
>まあ、かの方の各コードは誰も使わないので再利用など設計当初から念頭にないのでしょうね。
>まあ、自分だけの閉じた世界で生きていける幸せな方みたいですので、そっとしてあげましょう。

で、あのコラムは「生き残った」システムエンジニアが書いたものではなく、オブジェクト指向で「生き残された」システムエンジニアが書いたものだと皮肉なコメントを目にした気がしますw

flatlineflatline 2011/01/07 19:50 この人をネタにした小説が連載されてます。

http://el.jibun.atmarkit.co.jp/pressenter/2010/11/1-828a.html

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証