Convention Over Configuration
生産性
UPの秘訣
Masayuki Kimura Naoki Takezoe Shota Onishi appendix オープニングトーク&Spring 17:20~17:30 Ruby on Rails 17:30~17:45 Seasar2 17:45~18:00 最後にprofile
• 木村 真幸(Masayuki Kimura)
– 株式会社DTS シニア・プロジェクトマネージャ • 技術支援、開発プロセス定義、フレームワーク開発、 IDE開発、講師等 – 課外活動 • 注目のJavaフレームワーク詳細解説(ITPro) • “使える”Eclipseプラグイン徹底攻略(ITPro) • StrutsIDEコミッタ • 著書「まるごとEclipse! Vol.1」(発行:インプレスコミュニケーションズ)生産性に関する数字
0 2 4 6 8 10 12 14 16 18tcl rexx python perl Java C++ C
• プログラミングに要する時間(h) 参考:http://page.mi.fu-berlin.de/ prechelt/Biblio/jccpprt_computer2000.pdf 113 1,161 設定行数 1,164 3,293 コード行数 Ruby on Rails Java • コード量の違い JUnit 1week Struts 1week Spring + iBATIS Java EE 3day 独自フレームワーク 1week Java 期間 コース名 • 教育コスト • コミュニケーションコスト(n=人)
n(n-1)/2
結局、 生産性っ て・ ・ ・
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地獄が生まれたか
• DI(Dependency Injection)
オブジェクト オブジェクト オブジェクト オブジェクト間の関連をハードコーディング→密結合 DIコンテナなし DIコンテナがオブジェクトの関連を管理→粗結合 DIコンテナあり オブジェクト オブジェクト オブジェクト DIコンテナ• ex) Springでの実現例
<!-- 以下を1セットにして、延々と同じような記述が繰り返えされる -->Convention Over Configuration
• 設定より規約(Convention)という考え方
– 適切な規約を守れば、面倒な設定をしなくても、 フレームワークが自動的に適切な設定をしてくれ るという考え – 概念的なもので、それぞれのフレームワーク等に よって、形態は異なる• Ruby on Railsが広めた標語
– Ruby on Railsだけでなく、様々なフレームワーク に影響を及ぼしたCoCのメリット・デメリット
• メリット
– 規約を覚えれば、定型的な作業が免除される – 慣れれば慣れるほど生産性が上がる• デメリット
– 複雑・非直感的な規約は覚えきれない – 動作させてみるまで、分からない主流な3つのフレームワーク
• Spring
– 世界的にデファクトなDIコンテナ• Ruby on Rails
– 圧倒的な開発効率を誇るWebアプリケーション開 発のためのWebフレームワーク• Seasar2
– 開発者の使い勝手を最重要視した国産のDIコン テナSpring Framework
Bean定義ファイル書きたいですか?
Arid POJOs
• SpringでCoCを実現するフレームワーク
– POJOs IN ACTIONの著者Chris Richardson氏 – Seasar2のAutoRegisterに近いイメージ
<!– パッケージ名を指定するだけ -->
<arid:define-beans package="sample.arid" autowire="byType"/>
<!-- 以下を1セットにして、延々と同じような記述が繰り返えされる -->
<bean id="sampleController" class="sample.arid.SampleController" autowire="byType" /> <bean id=“sampleLogic" class="sample.arid.SampleLogicImpl" autowire="byType" />
Spring summary
• Arid POJOs
– SpringでCoCを利用する場合、 唯一の手段 – 過度のカスタマイズは逆に生産性を落とす – Spring IDEの補完は無い• Spring2.1(2007/08/22時点 M3)
– JRuby対応により、設定地獄から抜け出せる可 能性はある • 現状は、JRuby実装のBeansがDIできるとか・・・主流な3つのフレームワーク
• Spring
– 世界的にデファクトなDIコンテナ• Ruby on Rails
– 圧倒的な開発効率を誇るWebアプリケーション開 発のためのWebフレームワーク• Seasar2
– 開発者の使い勝手を最重要視した国産のDIコン テナ• 名前:大西正太
• (株)アスタリクス所属
• CMS on RailsなOSS「Rubricks」コミッタ
– http://rubricks.org/• BizcaというSaaSグループウェア開発
– http://bizca.jp/自己紹介
O/Rマッピングの記述を比較
【
CoC有】
Rails【
CoC無】
一昔前のJava ※局所的にこれを見てください
• テーブル名はモデル名の複数形にする • 主キー名は「id」にする • 外部キー名は「関連テーブル名単数形_id」にする • 交差テーブル名は「テーブルA_テーブルB」にする MEMBERSテ ーブル id ITEMS テ ーブル id member_id GROUPSテ ーブル id MEMBERS_GROUPS テーブル id member_id group_id Itemクラス Member クラス Members Groupクラス Groupクラス
RailsのO/Rマッピング規約
• 勝手にモデル名の複数系のテーブルとマッピングされる • カラム名と同名のメソッドが勝手にモデルに追加される • 関連テーブルを簡単に芋づる式に引っ張れる
いきなり
Appからテーブルにアクセスできる
ようになっている
class Item < ActiveRecord::Base end
その他の
Railsの規約
• Controller
– URLとコントローラ名/メソッド名を一致させる – http://xxxx.com/controller名/action名• View
– Viewテンプレートとアクション名を一致させる – displayアクション⇔display.rhtmlStrutsのような紐付けXMLがいらない
• 今のJavaはそんなにひどくない
• JavaもCoC対応してきている
– S2とか • 後でたけぞうさんが説明してくれます – Springとか • 木村さんが説明してくれました念のため
• 実際にO/Rマッピングしてみます
Step数で100倍の差が出る (?) (冒頭のサンプル) App全体での差ではない ・局所的なもの 生産性10倍(?) (Rails登場時のうたい文句) Step数はそれに近いが… ・ステップ数は1/9になった 簡単な書籍管理システムで測定 ・Javaにはコード生成がある XMLやアクセッサ ・要件定義やテストは同じ工数
CoC/Railsの触れ込みと実際
• 変更に強い
– モデル情報をDBスキーマで一元化 – DBが変わっても煩わしい作業が少ない • 紐付けXMLの変更やアクセッサの変更がない • ツールでの再ジェネレートは必要ないモチベーションも低下しづらい
ではどこにメリットがあるのか
• アジャイル開発 – 「設計書」よりも「現物主義」の開発スタイル – 「動く現物」をラウンドロビン的に改善していく – テーブルもどんどん作り変えていく • アジャイルとCoCは相性がいい – アジャイルのキーワード「変化ヲ抱擁セヨ」 – CoC/Railsは変更に強い – どんどん現物を改善していける
CoCとアジャイル
• 既存システムには適用しづらい • 規約に従わないテーブルには設定が必要に • 使えない機能が出てきたりする • 製品の都合でCoCできないことがある • Oracleのテーブル名は30byteまで • CUSTOMER_SUPPORT_PERSON_CUSTOMER_SUPPOR T_GROUPS(47byte) • 複数系⇔単数形が分かりづらい • PERSON People⇔ とか • シンプルでない規約が悪影響を及ぼす例 • 切り替えは可能
Rails/CoCの罠
• なぜCoCはRailsで有名になったのか?
• Rubyが優れたCoCの実現に向いているから
– Rubyのダイナミックさ – 動的なメソッド追加– 静的型付言語には真似しきれない
– 当分はCoCのリーダーはRubyだと思う
最後に
主流な3つのフレームワーク
• Spring
– 世界的にデファクトなDIコンテナ• Ruby on Rails
– 圧倒的な開発効率を誇るWebアプリケーション開 発のためのWebフレームワーク• Seasar2
– 開発者の使い勝手を最重要視した国産のDIコン テナ自己紹介
• 竹添 直樹(たけぞう)
• NTTデータ先端技術勤務
• Seasarプロジェクトでコミッタをしています
• 著書
– Eclipseプラグイン開発徹底攻略(共著) – 入門WikiSeasar2とは
• 国産のDIコンテナ
– http://www.seasar.org/
– オープンソース
Seasar2の特徴
• 設定やコードを減らすための様々な工夫
– 利用者の使い勝手を重視• スクリプト言語とJavaの良い部分を融合
– Javaの安全性 – スクリプト言語のサクサク感• 強力な開発支援ツール
– Eclipseプラグインを提供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/Seasar2のCoC的な機能
• AutoRegister
– コンポーネントを自動登録する仕組み• S2Dao
– AOPを活用したデータアクセスフレームワーク• Chura
– CoCを活用したフルスタックフレームワークAutoRegister
AutoRegister
• DIコンテナでは依存性を管理するコンポーネントを設定ファ イルに記述する必要がある • コンポーネントを設定ファイルに記述するのは面倒! • 命名規約に従ってコンポーネントを自動登録 <component class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister"> <initMethod name="addClassPattern"><arg>"examples.jsf.logic.impl"</arg> <arg>".*LogicImpl"</arg>
</initMethod> </component>
S2Dao
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(); }
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*/ 可変クエリの例
Chura
Chura
• CoCを活用したフルスタックフレームワーク
• 2種類の開発スタイル
– 開発生産性を重視「Super Agile」 • Teeda Extension • S2Dao – Java標準を重視「Easy Enterprise」 • JSF(Teeda) • JPA(Kuina-Dao)• 開発ツール「Dolteng」
– Churaを具現化するEclipseプラグインDolteng ~ ツールで規約を見える化
• CoCやDIの欠点
– 規約を覚える必要がある – 動かしてみないとわからない ツールによる サポート id属性の命名規約によって Javaクラスとマッピング アイコン表示で マッピングされてHOT Deploy ~動作確認を効率化
ソースコードを修正 APサーバを再起動 ひたすら待つ… 動作確認 OK!! ダメだったら 最初に戻るHOT Deployなし HOT Deployあり
ソースコードを修正 動作確認 OK!! ダメだったら 再度修正 素早い開発サイクルを実現
Seasar2のまとめ
• スクリプト言語とJavaのいいところ取り
– スクリプト言語の迅速な開発スタイル – Javaによる静的な型チェック• CoCの欠点をカバー
– ツールで規約の間違いを予防する(Dolteng) – 動作確認に要する時間の短縮(HOT Deploy)是非お試しください
• The Seasar Project(Webサイト)
– http://www.seasar.org/
• Seasar-user(利用者向けメーリングリスト)
– https://ml.seasar.org/mailman/listinfo/seasar-user
• Seasar Conference 2007 Automn
最後に:CoCまとめ • Spring – Arid POJOsの適用がポイント • Ruby on Rails – Rubyのダイナミックさで強力なCoCを実現 – 制約事項を把握し、アジャイル手法とセットで • Seasar2 – スクリプト言語とJavaのいいところ取り – ツール等によってCoCの欠点をカバー
最後に:Ruby on Railsの現状と展望
• 実案件での開発実績がたまっていない
• 良くも悪くもアジャイル手法と良くマッチする
– アジャイル手法は大規模開発には厳しい一面 – コミュニケーションや迅速性に重きを置くため、 客先常駐や、時間単金での仕事となりやすい• 10年前のJavaと同じ事を言われている
– 遅い、技術者が、お客が・・・つまり・・・?最後に:Javaの現状と展望