基盤ソフトウェア 6/12

CとJavaで速度を図る課題、みんな出してくれましたか?
意外とCの方が早かったりする
昔Cの方が早いと決めてかかっていた人がいて
適当にプログラムを書いて、Cの方が早い、おかしいな、
これではレポートが書けないではないか、
挙句の果てには実験結果を偽造しようとした人がいた

学生の偽造した実験結果を使って先生が論文を書いたりすると
先生の首が飛んだりする

最初は軽い気持ちで偽造しても
ES細胞とか国民的英雄になって引くにひけなくなったのではないか
新聞は大げさに書くし

知り合いが中央官庁に勤めていた
官庁関係の記事がスクラップとしてまとめてあるのが回ってくる
これは事実無根ですから問い合わせには応じないように、とか書いてある

嘘はよくないという話

  • -
Web Applicationのプラットフォーム 今の時代 RMIで直接プログラムを書くこともあるだろうけど 多いのはやはりWebアプリケーションではないか ニュースサイトとかも、いまどき手でやってるサイトなんてあるのか こちら側のリクエストに応じて新しくページを作り出して それをネットワークを通じて送り返してくれる そういうのを一般的にWebアプリケーションという サーヴァ側でページを作り出してくれるプログラム 新しく受注案件があると大概Webアプリケーション スプレッドシートとかワードプロセッサも これまではクライアント上で動くものだと思われていたけれど WebアプリとしてGoogleで使うことができる ただしそこまでナイーヴなものではなくて ブラウザ側でページを操作していたりする これだけ広がってくると そういうソフトウェアを作るためのプラットフォームも整備されてきた
  • -
この手のソフトウェアを作ったことがあればわかると思うが 一番下にはOS(LinuxWindows)があって、 その上にJVMApacheなど JVM - Tomcat - Struts Spring PHP Perl RoR とかいろいろある 特定のソフトウェアの話をしないで、大雑把にする 商用のちゃんとしたシステムを作る場合 いろいろなテクニックがある よく出てくるキーワードは所謂コンテナ Container -> Component Oriented Programming 簡単なソフトウェアを作るときには大掛かりな道具は必要ない ある程度の規模のソフトウェアを作ろうとすると 開発環境、デバッガは何かが良いかとか話が始まる そもそもコンポーネント指向プログラミングとは何か ソフトウェアの部品を組み合わせて作る GUI - JLabel JButton コンテナというと  船やトラックに積んであったりする鉄製の箱  タッパーウェア   タッパーという名称が広まっていなければ   あれをみんなコンテナと呼んでいたのではないか ソフトウェア部品の入れ物 アナロジーでコンテナという Webアプリケーションの世界でコンテナというと TomcatとかApacheとかそういったソフトウェアを指すことが多い 一般的な仕事は、OSでいうプロセスのような空間、領域を作るもの OSの世界でプロセスというと メモリ空間がアプリケーション専用の領域を渡してくれる あるアプリケーションソフトに閉じた領域、空間を与えてくれる 隔壁によって他のソフトウェアの影響を防ぎ このソフトウェアが暴れても他のソフトウェアに影響を与えない ある種の部屋 JavaGUIのコンテナだと、 オブジェクトの中でprivateとか細かくコントロールして 部品の中と外を分けている 勝手に中をいじれないようになっている 他の影響を受けない Webアプリケーションの場合にはもうちょっと粒度が大きい OSのプロセスのようなものなので説明が難しい まあプロセスみたいなものだと思って欲しい 部品間通信 OSのプロセスは完全に分離されていてもあんまり困らない ただしコンテナは分離された空間を作ると同時に 通信手段を提供するということも大きな仕事 どういう通信手段を用意するかというのは コンテナを提供するコンテナフレームワークによる sendとかでバイト列を送るような原始的なインターフェースを持っていることもある Javaの場合は普通のメソッド呼び出し ただし、部品と部品の外で通信をしたい場合には まず(Javaの)インターフェースを定義する インターフェースをもったオブジェクトから呼び出す lookup機能
  • -
しかしWebアプリケーションの場合はあまり大掛かりな コンポーネント指向フレームワークが使われない mixiPerlだし YahooはPHPだし コンポーネント指向開発は割と大規模なプロジェクトにはよい システムが部品ごとに分割されるのでばらばらに開発できる 一つの部品がおかしくなっても他の部品を極力巻き添えにしないように 平均的な技術者を集めてくるとあんまりちゃんと動かない部分がでてくるけど その部品がクラッシュしても回りに影響を与えにくい コンテナを用意して隔壁を作ってやると規律が導入される Perlとか好きな言語で書くのはエキスパートを集めてくるとうまくいく 規律がない代わりに優秀な技術者であれば効率よく作ることができる そういうメリットデメリットがある 規律があることの欠点は何か 部品に分割するという作業が非常に難しい 全体が見えている人でないと分割できない 分割に失敗すると、必要な部分がないとか重複しているとか部品がつなげなれないとか コンポーネント開発というのは昔からあるアイディア 出ては消え出ては消え未だに死なない こういうのはいつも同じ名前で出てくるとは限らない 再登場するときは名前が変わっている SOA(Service Oriented Architecture) サーヴィスを分割してITシステムに置き換えられるところは置き換えて ビジネスを加速させる 今の時代ビジネスはどんどん変化している 御社のビジネスもどんどん変えていかなければならない 従来のITシステムだとシステムを取り替えるときには全部変えなければならない SOAなら部品ごとに変えられる 有名なところでいうと年金問題 あのシステムは電話系の大手のSIerがやっていたけど どうも設計が良くなかったみたいでだめだった 今は改修するシステムを作っている 5つくらいに分割発注 ここにSOAのアイディア 貴組織のサーヴィスをこのように分割して云々 現場を見に行かずに来た資料だけ読んで分割していって仕様書だけを書くと ある人が嘆いていた 細かく分割しすぎるのは良くない 遅くなるしよくわからなくなる そこら辺が非常に難しい どうやったらうまい設計ができるのかは今のところよくわかっていない 行き当たりばったり 設計する人の個人個人の才能に依存していることが現場では多そう mixiとかそもそもどうやって作ったらいいかわからない 五里霧中だからコンポーネントに分けて設計しても役に立たない それだったらエキスパートを集めてきてがりがり作る というわけで というわけでが口癖になっているけれど利害得失がある 設計部分がうまくいけばうまくいく 変更があったときも部品の交換でうまくいく
  • -
コンテナフレームワークを使うと 部品ごとに入れ物を用意してくれる 文字通りコンテナ コンテナ間の通信は自由にはできない 規律がある 自由にできるようにすると 平均的なエンジニア(技術の低い人たち)を連れてくると何が起こるかわからない だから規律がある この規律は制限なのだが 実際のシステムにはこの制限を逆手にとって便利になっていることもある  ->自動分散化 最初は一台のマシンで動かしていても 一部の部品を他のマシンで動かすようなことも 入れ物に規律を持たせて制限しているから簡単にできたりする ブラックボックスというのは裏を返すと中をどう変えても良い 外から見せないということは中をどう変えてもわからない このコンテナを別のマシンに持って行っても大丈夫 手で全部書いていると 分散化しなくちゃいけない時に全部作り直しという事にもなりかねない ロードバランシング 負荷分散 部品のコピーを10個くらいのマシンを置いておく そのときの負荷状況を見て空いているマシンにデータを送る 間の通信をブラックボックスでやっていることのメリット 手で書いていると部品の中を直さないといけない 自動分散化以外だと セキュリティにもメリットがある フレームワークを通してでないと別の部品と通信できないようにしておけば チェックが簡単になる トランザクション 同期なども 矛盾するような書き込みが同時にできないようにする やっていることは結局OSがやっていることと同じ OSがプロセスとして提供していることはコンテナフレームワーク こういうフレームワークを使わなければ手で書かなければいけない 自動分散化とか、平均的なエンジニアを連れてくるとうまくいかない可能性がある リーダがいちいちチェックしないといけない そんなことをするくらいならフレームワークを使った方がいい 後は技術の高い人が分散の仕様を外から設定してコントロールする こういう言い方をするととても差別的だと感じられるかもしれないけれど ソフトウェアプロジェクトを管理するという視点からいうと 技術の高い人も低い人もいる むしろ低い人が多い そういう中でできるだけうまくやるにはこういう発想になる 仕事を切り分けて平均的なエンジニアでもできる仕事、そうでない仕事を切り分ける 技術の高い人には技術の高い人でないとできない仕事をやらせる
  • -
AOP 狭い意味でのアスペクト指向 これをAOPと呼ぶのは如何なものかと研究者は思っているけれど どういうものかというと ブラックボックスを公開しようということ 旧世代のコンテナフレームワークではブラックボックスの中は公開しない 設定ファイルでオンにしたりオフにしたりする ブラックボックスの中を上級の開発者がいじれるようにするとうのが この意味でのアスペクト指向のねらい コンテナフレームワークを拡張できる あらかじめヴェンダーが用意していたフレームワークでは満足できない 最近でてきたコンテナフレームワークはみんなAOPの機能がある もちろん規律があるがある一定機能は変えられるようになっている 分散だとか、 特定の関心事だけを切り離せるようにしたいというのがアスペクト指向
  • -
まだ話すことはあるけれど時間も来たし 詳しい話は来年 今日のところはおわり