Convention Over Configuration 生産性 UP の秘訣 appendix オープニングトーク &Spring 17:20~17:30 Ruby on Rails 17:30~17:45 Seasar2 17:45~18:00 最後に Masayuki Kimura Naoki Takezoe Shota Onishi 1
profile 木村真幸 (Masayuki Kimura) 株式会社 DTS シニア プロジェクトマネージャ 技術支援 開発プロセス定義 フレームワーク開発 IDE 開発 講師等 課外活動 注目の Java フレームワーク詳細解説 (ITPro) 使える Eclipse プラグイン徹底攻略 (ITPro) StrutsIDE コミッタ 著書 まるごと Eclipse! Vol.1 ( 発行 : インプレスコミュニケーションズ ) 2
生産性に関する数字 プログラミングに要する時間 (h) 教育コスト 18 16 14 12 10 8 6 4 2 0 tcl rexx python perl Java C++ C 参考 :http://page.mi.fu-berlin.de/ prechelt/biblio/jccpprt_computer2000.pdf コース名 Java Java EE JUnit Struts Spring + ibatis 独自フレームワーク 期間 1week 1week 1week 3day コード量の違い コミュニケーションコスト (n= 人 ) コード行数 設定行数 Java 3,293 1,161 Ruby on Rails 1,164 113 n(n-1)/2 出展 : 人月の神話 著 Frederick Phillips,Jr. Brooks 出展 : Java から Ruby へ 著 Bruce A.tate 訳角谷信太郎 3
結局 生産性って And there s busi ness val ue i n fun - after al l moti vati on i s a maj or factor i n programmer producti vi ty. -- Marti n Fowl er そして 楽しさにはビジネス価値があります - 結局 モチベーションこそがプログラマの生産性を左右するのです -- マーチン ファウラー
モチベーションを下げる作業 XML 地獄 5
なぜ XML 地獄が生まれたか DI(Dependency Injection) DI コンテナなし オブジェクト オブジェクト オブジェクト DI コンテナあり オブジェクト DI コンテナ オブジェクトオブジェクト オブジェクト間の関連をハードコーディング 密結合 ex) Spring での実現例 DI コンテナがオブジェクトの関連を管理 粗結合 <!-- 以下を 1 セットにして 延々と同じような記述が繰り返えされる --> <bean id="samplecontroller" class="sample.arid.samplecontroller" autowire="bytype" /> <bean id="player" class="sample.arid.samplelogicimpl" autowire="bytype" /> 6
Convention Over Configuration 設定より規約 (Convention) という考え方 適切な規約を守れば 面倒な設定をしなくても フレームワークが自動的に適切な設定をしてくれるという考え 概念的なもので それぞれのフレームワーク等によって 形態は異なる Ruby on Rails が広めた標語 Ruby on Rails だけでなく 様々なフレームワークに影響を及ぼした 7
CoC のメリット デメリット メリット 規約を覚えれば 定型的な作業が免除される 慣れれば慣れるほど生産性が上がる デメリット 複雑 非直感的な規約は覚えきれない 動作させてみるまで 分からない 8
主流な 3 つのフレームワーク Spring 世界的にデファクトな DI コンテナ Ruby on Rails 圧倒的な開発効率を誇る Web アプリケーション開発のための Web フレームワーク Seasar2 開発者の使い勝手を最重要視した国産の DI コンテナ 9
Spring Framework Spring を使っている技術者様に問いたい Bean 定義ファイル書きたいですか? 10
Arid POJOs Spring で CoC を実現するフレームワーク POJOs IN ACTION の著者 Chris Richardson 氏 Seasar2 の AutoRegister に近いイメージ <!-- 以下を 1 セットにして 延々と同じような記述が繰り返えされる --> <bean id="samplecontroller" class="sample.arid.samplecontroller" autowire="bytype" /> <bean id= samplelogic" class="sample.arid.samplelogicimpl" autowire="bytype" /> <! パッケージ名を指定するだけ --> <arid:define-beans package="sample.arid" autowire="bytype"/> 11
Spring summary Arid POJOs Spring で CoC を利用する場合 唯一の手段 過度のカスタマイズは逆に生産性を落とす Spring IDE の補完は無い Spring2.1(2007/08/22 時点 M3) JRuby 対応により 設定地獄から抜け出せる可能性はある 現状は JRuby 実装の Beans が DI できるとか 12
主流な 3 つのフレームワーク Spring 世界的にデファクトな DI コンテナ Ruby on Rails 圧倒的な開発効率を誇る Web アプリケーション開発のための Web フレームワーク Seasar2 開発者の使い勝手を最重要視した国産の DI コンテナ 13
自己紹介 名前 : 大西正太 ( 株 ) アスタリクス所属 CMS on RailsなOSS Rubricks コミッタ http://rubricks.org/ Bizca という SaaS グループウェア開発 http://bizca.jp/ 14
これを見てください O/R マッピングの記述を比較 CoC 有 Rails CoC 無 一昔前の Java 局所的に 15
Rails の O/R マッピング規約 テーブル名はモデル名の複数形にする 主キー名は id にする 外部キー名は 関連テーブル名単数形 _id にする 交差テーブル名は テーブル A_ テーブル B にする ITEMS テーブル id member_id MEMBERS テーブル id MEMBERS_GROUPS テーブル id member_id group_id GROUPS テーブル id Item クラス Member クラス Members Group クラス Group クラス 16
規約を守ると 勝手にモデル名の複数系のテーブルとマッピングされる カラム名と同名のメソッドが勝手にモデルに追加される 関連テーブルを簡単に芋づる式に引っ張れる class Item < ActiveRecord::Base end いきなり App からテーブルにアクセスできるようになっている 17
その他の Rails の規約 Controller URL とコントローラ名 / メソッド名を一致させる http://xxxx.com/controller 名 /action 名 View View テンプレートとアクション名を一致させる display アクション display.rhtml Struts のような紐付け XML がいらない 18
念のため 今の Java はそんなにひどくない Java も CoC 対応してきている S2 とか 後でたけぞうさんが説明してくれます Spring とか 木村さんが説明してくれました 19
Demo 実際に O/R マッピングしてみます 20
CoC/Rails の触れ込みと実際 Step 数で 100 倍の差が出る (?) ( 冒頭のサンプル ) 生産性 10 倍 (?) (Rails 登場時のうたい文句 ) App 全体での差ではない 局所的なもの Step 数はそれに近いが ステップ数は 1/9 になった簡単な書籍管理システムで測定 Java にはコード生成がある XML やアクセッサ 要件定義やテストは同じ工数 21
ではどこにメリットがあるのか 変更に強い モデル情報を DB スキーマで一元化 DB が変わっても煩わしい作業が少ない 紐付け XML の変更やアクセッサの変更がない ツールでの再ジェネレートは必要ない モチベーションも低下しづらい 22
CoC とアジャイル アジャイル開発 設計書 よりも 現物主義 の開発スタイル 動く現物 をラウンドロビン的に改善していく テーブルもどんどん作り変えていく アジャイルと CoC は相性がいい アジャイルのキーワード 変化ヲ抱擁セヨ CoC/Rails は変更に強い どんどん現物を改善していける 23
Rails/CoC の罠 既存システムには適用しづらい 規約に従わないテーブルには設定が必要に 使えない機能が出てきたりする 製品の都合でCoCできないことがある Oracleのテーブル名は30byteまで CUSTOMER_SUPPORT_PERSON_CUSTOMER_SUPPOR T_GROUPS(47byte) 複数系 単数形が分かりづらい PERSON Peopleとか シンプルでない規約が悪影響を及ぼす例 切り替えは可能 24
最後に なぜCoCはRailsで有名になったのか? Rubyが優れたCoCの実現に向いているから Ruby のダイナミックさ 動的なメソッド追加 静的型付言語には真似しきれない 当分はCoCのリーダーはRubyだと思う 25
主流な 3 つのフレームワーク Spring 世界的にデファクトな DI コンテナ Ruby on Rails 圧倒的な開発効率を誇る Web アプリケーション開発のための Web フレームワーク Seasar2 開発者の使い勝手を最重要視した国産の DI コンテナ 26
自己紹介 竹添直樹 ( たけぞう ) NTT データ先端技術勤務 Seasar プロジェクトでコミッタをしています 著書 Eclipse プラグイン開発徹底攻略 ( 共著 ) 入門 Wiki 27
Seasar2 とは 国産の DI コンテナ http://www.seasar.org/ オープンソース 日本語コミュニティの存在 28
Seasar2 の特徴 設定やコードを減らすための様々な工夫 利用者の使い勝手を重視 スクリプト言語と Java の良い部分を融合 Javaの安全性 スクリプト言語のサクサク感 強力な開発支援ツール Eclipse プラグインを提供 29
Seasar2 の生産性 5.5 ヶ月で 1000 画面! Seasar2 ファミリーを徹底活用 Seasar 2.3 / S2JSF / S2Dao 1 画面 =1 クラスのアーキテクチャ コードジェネレータとの相性が良い 設計と実装のずれが少ない 出展 :ITPro HTML 画面をそのまま仕様書に, 5 カ月で 1000 画面を構築した就職サイト Puff の高速開発手法 http://itpro.nikkeibp.co.jp/article/column/20070214/261859/ 30
Seasar2 の CoC 的な機能 AutoRegister コンポーネントを自動登録する仕組み S2Dao AOP を活用したデータアクセスフレームワーク Chura CoC を活用したフルスタックフレームワーク 31
AutoRegister ~ コンポーネントの自動登録 ~ 32
AutoRegister DI コンテナでは依存性を管理するコンポーネントを設定ファイルに記述する必要がある コンポーネントを設定ファイルに記述するのは面倒! 命名規約に従ってコンポーネントを自動登録 <component class="org.seasar.framework.container.autoregister.filesystemcomponentautoregister"> <initmethod name="addclasspattern"> <arg>"examples.jsf.logic.impl"</arg> <arg>".*logicimpl"</arg> </initmethod> </component> examples.jsf.logic.impl パッケージの *LogicImpl クラスを自動的に登録 33
S2Dao ~CoC ベースのデータアクセスフレームワーク ~ 34
S2Dao の実装例 (1) インターフェースを作成するだけで OK 命名規約や引数 戻り値に従って SQL が実行時に自動生成される public interface EmployeeDao { // 挿入 public void insert(employee employee); // 更新 public void update(employee employee); // 削除 public void delete(employee delete); // 主キーを指定して 1 件取得 public Employee select(int employeeid); // 全件取得 public Employee[] selectall(); } 35
S2Dao の実装例 (2) 明示的に SQL を記述することももちろん可能 DAO クラス名 _DAO メソッド名.sql SQL のコメントを使用して可変クエリを実現 パラメータ埋め込みの例 SELECT emp.*, dept.dname dname_0, dept.loc loc_0 FROM emp, dept WHERE empno = /*empno*/7788 AND emp.deptno = dept.deptno 可変クエリの例 SELECT * FROM emp WHERE job = /*job*/'clerk' /*IF deptno!= null*/and deptno = /*deptno*/20/*end*/ 36
Chura ~CoC を活用したフルスタックフレームワーク ~ 37
Chura CoC を活用したフルスタックフレームワーク 2 種類の開発スタイル 開発生産性を重視 Super Agile Teeda Extension S2Dao Java 標準を重視 Easy Enterprise JSF(Teeda) JPA(Kuina-Dao) 開発ツール Dolteng Chura を具現化する Eclipse プラグイン 38
Dolteng ~ ツールで規約を見える化 CoC や DI の欠点 規約を覚える必要がある 動かしてみないとわからない ツールによるサポート id 属性の命名規約によって Java クラスとマッピング アイコン表示でマッピングされていることを可視化 39
HOT Deploy ~ 動作確認を効率化 HOT Deploy なし HOT Deploy あり ソースコードを修正 ソースコードを修正 ダメだったら最初に戻る AP サーバを再起動 ひたすら待つ ダメだったら再度修正 動作確認 動作確認 OK!! OK!! 素早い開発サイクルを実現 40
Seasar2 のまとめ 41
Seasar2 のまとめ スクリプト言語と Java のいいところ取り スクリプト言語の迅速な開発スタイル Javaによる静的な型チェック CoC の欠点をカバー ツールで規約の間違いを予防する (Dolteng) 動作確認に要する時間の短縮 (HOT Deploy) 42
是非お試しください The Seasar Project(Web サイト ) http://www.seasar.org/ Seasar-user( 利用者向けメーリングリスト ) https://ml.seasar.org/mailman/listinfo/seasar-user Seasar Conference 2007 Automn http://event.seasarfoundation.org/sc2007autumn/ 43
最後に :CoC まとめ Spring Arid POJOs の適用がポイント Ruby on Rails Ruby のダイナミックさで強力な CoC を実現 制約事項を把握し アジャイル手法とセットで Seasar2 スクリプト言語と Java のいいところ取り ツール等によって CoC の欠点をカバー 44
最後に :Ruby on Rails の現状と展望 実案件での開発実績がたまっていない 良くも悪くもアジャイル手法と良くマッチする アジャイル手法は大規模開発には厳しい一面 コミュニケーションや迅速性に重きを置くため 客先常駐や 時間単金での仕事となりやすい 10 年前の Java と同じ事を言われている 遅い 技術者が お客が つまり? 45
最後に :Java の現状と展望 最も無難な選択肢 超大規模 ~ 小規模 Web 系 組み込み Java 屋の人口の多さ 技術者確保の容易さ ( 国内外問わず ) 性能速度 生産性 10 倍でも性能 xx 倍はちょっと 顧客に対する認知度は抜群 46
ご清聴 ありがとう ございました