JavaWorldDay2009

JavaWorld DAY 2009 に参加しました。去年に比べて会場は小ぶりです。
今年のテーマは、「Java開発、次はどうなる?」どう変化していくか、Next Java は?というテーマです。


途中までしか居られなかったのですが、以下のセッションを聴講し、このうちいくつかのセッションについてメモ。有償のイベントなので、感想を中心に書きます。

システム開発は、今後どう変わっていくのか

基調講演のためか、ジェネラルな内容。
若手エンジニアを恐らく対象としていて、今どんなことが起きているのか、今後どのようなスキルが必要になるのか、を語るもの。
会場は若手半分、白髪1割、中堅4割くらいだったので、マッチした人もしなかった人もいたと思う。


資料を手に取ってびっくり。とにかくスライドにぎっちり。文字も絵もぎっちり。プレゼン資料の常識を破る勢いがある。
お土産に持って帰って読んでね、という意図かな?

冒頭は

今何が起きているか。
まずはグラミンフォンとOLPCの話。
グラミンフォンは、グラミン銀行が(バングラディッシュの?)貧困層に配布している携帯電話。
グラミン銀行の事業は、融資の場合も含め、教育をセットとすることが特徴。
グラミンフォン上での電子マネーの導入計画もあるそうで、大きなマーケットとなる可能性がある。
こちらを見ると、慈善でなくビジネスとして成功するのも納得できる。
数日前にグラミンフォンの話を聞いてスライドを追加したそうで、勢いを感じたので、ストーリーにしっくり嵌っていなかったけど、つい言及。

それ以降は、

ソフトウェア(※)開発が複雑化してきており、求められるスキルが変わってきているという話。
※システムという言葉をどういう意味で使っているか分からなかったけど、ソフトウェアと解釈したので、ソフトウェアと書きます


具体的には、技術力だけでなく、要求を開発する力、コミュニケーションをとり、ファシリテートしていく力が必要という話。
ITSSのキャリアフレームワークなども出し、丁寧に説明していた。

複雑な問題を解決するための方法論

1枚とても気に入ったスライドがあったので、紹介する。
複雑な問題を解決するための方法論。#以下の番号は、引用しやすいように番号を振ったもの。

  1. Divide and Conquer(分割して解決せよ)
  2. Name and Conquer(名前を付けて解決せよ)
  3. Abstract and Conquer(抽象化して解決せよ)
  4. Exemplify and Conquer(実例で検証せよ)
  5. Visualize and Conquer(可視化して協働せよ)


引用は上の5行だけで、ここからは私の全くの独り言となる。
このうち、
1については複雑な問題に向かうとき、意識することが多い。(それほど複雑でなくともやることが多い)
3と4は、何かとモデリングする習慣があるので、モデリングし、検証するために意識することが多い。
2は新鮮だ。そもそも、適切なネーミングができるということは、本質を捉えているということだが、ここではもう一歩進めて、名づけることによりその本質を(?)共有し、普及させるという意味をもつ。私は名前というものにやや懐疑的だけど、こういう役割もあるのか、とちょっと驚いた。ちなみに、本質を表す名前であればとてもよいのだろうけど、みんなが使いたがるものであれば、なんでも十分に用をなす。もちろん、名前が一人歩きすることもあるので、注意が必要だけど。


あれ?セッションについてのメモからはだいぶ離れてしまった。まあ、いいか。


Java VMへの処方箋 〜先進のメモリ管理技術とは〜

JVM におけるメモリ管理の課題と解決策(featuring Cosminexus!)を紹介。

課題:

Webシステムが扱うデータサイズが肥大化するにつれて、メモリサイズも当然増大する。
コピー GC はともかく、フル GC が走ると処理が停止し、サービスレベルを守れないことがある。

解決策:
  1. old 領域を適切にサイジングし、フル GC の頻度をコントロールする。
  2. Cosminexus の機能により、old 領域をできるだけ使わない。


むう・・

具体的に言うと、

1つめは、
フル GC の間隔を確保するために、old 領域は、 GC されずに残る分(※)を加味してサイジングする。
※例えば、アクティブな Session のメモリは解放されない。


2つめは、
Session 情報は Old 領域でなく、コズミで利用可能な E ヒープ領域を使う。この2つ目のが今回のセッションの目玉。
E ヒープ領域はコードの変更なく、機能を ON にすることで利用可能。
コピー GC 時に Old でなく E ヒープを使うかを決めるオーバーヘッドはかかるが、僅か。
E ヒープ領域の削除時に参照されているかを確認し、堅牢性を確保するしくみもある。
便利ですね。


聞きながらいろいろ疑問。フォローの電話かかってくると困るので、アンケートに書かなかったけど。

  • E ヒープのサイズ指定もできるの? ⇒ できないわけはないと思う
  • E ヒープにも GC とかあると思うんだけど、遅くなるんじゃないの?


あと、コズミに関係ないけど、そもそも New領域 と Old 領域 の小さな(中くらいの?)セットをいくつか利用できるようになったら、フル GC で処理が止まることも防げるんじゃないの?とか素人くさい感想をもった。JVM がめちゃめちゃ 不安定になりそうだけど。


あ、アンケートだしたら、種もらったよ。
水耕栽培でいただきますね♪


ネクスJava”の大本命!? マルチパラダイム言語「Scala

会場の反応を見ていても、今日一番の人気セッション。面白かった!
Scala はどんなものか、何がいいのか、どんなふうに使うといいのかを浅海さんの独断で(?※)語る。
※特徴を述べる際に、独断です・・・と言ってたけど、それ以降も独断かどうかは不明。ただ、意見を聞かせてもらうほうが、教科書的な内容よりずっといいですね。

Scala とは、

Scalable Language の略。スクリプト(小規模)から大規模まで使える。スケーラブルなんです!
使いやすい Java で、関数型までついているという認識でだいたい OK。
H/W の性能向上により、無駄を省くことよりも開発生産性が重視されるようになったため、関数型が許容されるようになった。
#スンマセン、関数型言語・・分かったような、分からないような・・・「全ての計算が関数の評価によって行われる」・・確かに遅そう。関数もオブジェクトみたいだし。

なぜ開発効率がいいのか?

⇒再利用できる個所が多いため。
手続き型はサブルーチンのみ再利用、オブジェクト指向型は加えてフレームワークを再利用、関数型は加えてプログラム内のアルゴリズムを再利用。
なので、開発効率がよい(ちょっと疑問の残る単純化だけど・・)。
アルゴリズムの再利用が可能なのは、LL言語が備え、すでに効果実証済の「高階関数」「遅延評価」の機構があるため(棒読み・・・)。

Scala の特徴的な機能
  • trait
    • 抽象クラス-α。(インターフェースよりクラスに近い)
    • 多重継承の問題を回避しつつ、多重継承的な機能を実現 (★すごく気になる!)
    • mix-in に使用(アスペクト指向的な機能をクラスに加える)
  • for 文
    • 普通の for 文に見えるけど、裏ですごい関数が動いている!for 文は極めるべき!
    • モナドの文法糖衣(★何のことか分からなかったので、あとで調べる)
  • チェック付き例外なし
    • Java と違い、例外がチェックされない
      • たとえば FileOpen 時に IOError をキャッチしなくてよい。プログラミングがとても楽になる。
      • (といいつつ、try..catch は IDE に生成してもらってますが、コードが短くなることは間違いなし。)
    • チェック付き例外がなくても、特に問題を感じなかったそうな。
      • そうかもしれない。例外を呼び元に伝えたいがインターフェースを変更したくない場合に、わざわざ定義済の例外でくるんだり、Runtime に変換したり、あまり意味のないことやってるし・・・
  • match 文
    • パターンマッチングが簡単にできる!
  • case クラス
    • match 文と連携して使うととにかく便利
文法ハイライト

キーワードだけ列挙。

  • for 文
  • for yield 文
    • リストの列から別のリストを生成するなど
  • Extractor & 正規表現
    • 正規表現で抜き出し、まとめてセットできる
  • match 文
  • Extractor と match 文
  • ケースクラスと match 文
  • クロージャ
  • XML
    • XMLリテラルとして書ける。
    • テンプレートエンジンでやっていることが簡単にできる!
    • XML の解析や生成が簡単にできる。
ほか、気になったことなど
  • DSL を定義して、ドメインに即した無駄のない言語を定義したり、拡張したりできる。
    • ※ちゃんと理解していないので、しどろもどろながらメモ。
  • マルチコア対応である(このように応用できる、という文脈かな?)
    • マルチコアであっても、データ破壊が発生しないしくみがある(可変データを共有するのでなく、不変データをコピーして利用)
    • 各スレッドに対してメッセージを送ってスレッドが持つメモリで処理させる
  • テキスト指向、XML指向のWebプラットフォームに向いている