{:from => ‘Java’,:to => ‘Ruby’}“JavaからRubyへ”

角谷 信太郎s-kakutani@esm.co.jp(株)永和システムマネジメント
KAKUTANI Shintaro; Eiwa System Management, Inc.; a strong Ruby proponent
第7回 CodeGearデベロッパーキャンプ;
秋葉原コンベンションホール;2007-10-23(火)雲と雲の間を突き抜けて誰も見た ことの ない場所へ
夢の中で描いていた場所へありふれた スピードを超えてもうすぐ 変わるよ 世界がもうすぐ 僕らの 何かが 変わるよ
「コンピュータシティ」Perfume本日のお品書き✓ 自己紹介✓ 勤務先の取り組み✓ エンタープライズ✓ JavaとRuby✓ Rubyの価値観本日のお話の要点✓ Rubyはプログラミングを楽しくする言語です✓ Rubyがエンタープライズ開発の世界にもたらす価値は次の3つです:✓ 多様性は善✓ 信頼することが大事✓ 楽しさにはビジネス価値がある自己紹介

角谷 信太郎✓ (株)永和システムマネジメント✓ テスト駆動開発者✓ 日本Rubyの会理事✓ http://kakutani.com

『JavaからRubyへ』
マネージャのための実践移行ガイド

Bruce A. Tate 著
角谷信太郎 訳
オライリー・ジャパン 発行

第3刷(ﬁxed 78 bugs)
http://www.amazon.co.jp/o/ASIN/4873113202/kakutani-22

『WEB+DB PRESS』
Vol.41

連載 第3回載ってます:“アジャイル開発者の習慣〜 acts̲as̲agile”
角谷信太郎
http://www.amazon.co.jp/o/ASIN/477413256X/kakutani-22

Ruby

Agile

eXtreme
Programming私のミッション・ステートメント

And there's business value infun - after all motivation is amajor factor in programmer
productivity.
- Martin Fowler
そして、楽しさにはビジネス価値があります -結局、モチベーションこそがプログラマの生産性を左右するのです。
-- マーチン・ファウラー

楽しさ✓ 達成感✓ 充実感✓ 成長感

“楽しさ”のビジネス価値

よろしくお願いします勤務先の取り組み(株)永和システムマネジメント• 福井本社 (1980年〜:28期)• 金融,、医療、パッケージ、”オープン系”• 東京支社 (2002年〜)• OO、UML、アジャイル開発、Java、Ruby• 資本金: 6,168万円 (2006年7月)• 従業員: 230名 (2007年7月)• 年商: 22.5億円 (2006年7月)• 関連会社:• (株)チェンジビジョン / (株)アフレル• コミュニティ:• オブジェクト倶楽部( http://www.ObjectClub.jp/ )サービスプロバイディング事業部✓ 東京を中心に✓ 業務ドメインに特化しない✓ オブジェクト指向, UML✓ SI中心✓ 受注比率は全社比で4割+程度

第26期(2005年8月〜2006年7月)

プロジェクト数の比率100%
Java(2005/08〜2006/07の実績)

第27期(2006年8月〜2007年7月)

プロジェクト数の比率78% 22%
Java(2006/08〜2007/07の実績)

Ruby

Rubyプロジェクト✓ 14プロジェクトぜんぶRails✓ 顧客: 業務アプリ/BtoC/研究開発✓ 契約: 元請け/2次請/コンサル✓ チーム全体規模: 4〜10名程度✓ 関わった弊社メンバ: 14名

受注額の比率

89%

Java

11%

Ruby

(2006/08〜2007/07の実績)

半分しかない? 半分もある?

Half empty or half full?

Iʼm on my way, Iʼm on my time
But I donʼt know where

これが僕の道、僕の手にした時間
どこへ向かうのかわからないけれど今期(2007.08〜)✓ Ruby(Rails)継続プロジェクト✓ Ruby(Rails)の新プロジェクト✓ Javaの新プロジェクト

Enterprise
エンタープライズエンタープライズ✓ 大規模?
✓ ミッションクリティカル?
✓ 値段にゼロが二つ多い?
✓ 失敗したら“大規模”?
✓ 開発者たちの仲が悪い?

エンタープライズアプリケー
ションアーキテクチャパターン

Martin Fowler 著

Fowler曰く、✓ エンタープライズは規模の大小ではない✓ 小規模システムの累積効果にも目を向けるべき✓ 熟考なくしてエンタープラ
イズの成功はないエンタープライズである✓ 給与計算、診療記録、購買履歴、コスト分析、与信審査、保険契約、サプライチェーン、会計、顧客管理、外国為替取引 ……

エンタープライズでない✓ 自動車燃料噴射システム、ワードプロセッサ、エレベータ制御、化学プラント制
御、電話交換機、OS、コンパイラ、ゲーム ……

エンタープライズの特性✓ 大量の永続データ✓ たくさんのユーザインターフェイス✓ 同時データアクセス✓ バッチ処理✓ 他システムとの統合✓ ビジネスイロジック(illogic)✓ データとビジネス概念の不一致

例:B2CのWebサイト✓ 数多くのユーザ✓ 比較的シンプルなロジック✓ Webブラウザで動作する

例:リース契約処理✓ 限定された少数ユーザ✓ 複雑なロジック✓ リッチな画面✓ ビジネストランザクション✓ 論理トランザクション

例:小さな会社の経理✓ 限定された少数ユーザ✓ シンプルなロジック✓ Webブラウザで動作✓ 開発速度 / 機会コスト✓ システムの拡張エンタープライズの特性✓ 大量の永続データ✓ たくさんのユーザインターフェイス✓ 同時データアクセス✓ バッチ処理✓ 他システムとの統合✓ ビジネスイロジック(illogic)✓ データとビジネス概念の不一致

Javaである必然性は?
✓ 捺印ナビリティ?
✓ Javaでもよい✓ Rubyでなくてもよい✓ Javaでなくてもよい✓ RubyでもよいDiversitiy is good.
多様性は善JavaとRuby

Java

Javaの強み✓ 巨大なマーケット✓ 活発なOSSコミュニティ✓ 成熟と安定✓ スケーラビリティ✓ 豊富な選択肢

Javaの弱み✓ 非本質的(偶発的)複雑性•EJB,XML,Webサービス•一定レベルを越えると超ムズイ•中小規模開発のリスク✓ 多すぎる選択肢✓ オフショアリング

Ruby

Rubyの強み✓ 勢い✓ 言語のパワー✓ LAMPスタックの活用✓ ナイスなコミュニティ✓ “Matz is nice, so weʼre nice.”Rubyの弱み✓ 大人数✓ スケーラビリティ✓ TwitterはRails製 :-)✓ どこにも保証はない✓ 開発環境✓ 3rd Rail ?!

Diversitiy is good.
多様性は善Ruby導入のポイント✓ “問題” vs. 私たち✓ ビジネス的なメリット✓ マネージャに理解できる言葉で✓ 情熱✓ 自分たちの思い✓ 実際に動くものを✓ 信頼貯金Rubyに移行しても…
✓ コミュニケーション✓ 開発メンバー間✓ 開発者とマネージャ✓ 開発者とお客様✓ 信頼貯金
✓ 成果
✓ 成果
✓ 成果

続きは『JavaからRubyへ』
マネージャのための実践移行ガイド

Bruce A. Tate 著
角谷信太郎 訳
オライリー・ジャパン 発行

第3刷(ﬁxed 78 bugs)
http://www.amazon.co.jp/o/ASIN/4873113202/kakutani-22

Rubyの価値観

Ruby

Ruby
まつもとゆきひろ氏が開発している (1983〜)、オープンソースの動的オブジェクト指向スクリプト言語。Ruby on Railsのブレイクでにわかに注目を集めている。

Ruby公式サイト

http://www.ruby-lang.org/

A Programmerʼs Best Friend

プログラマの親友

RubyKaigi
2007

Dave Thomas says...

Photo by snoozer-05:
http://www.flickr.com/photos/snoozer/539389108/

You must love yoursoftware tools
自分のツールを愛さねばならない

I LOVE RUBY

私はRubyが大好きだRuby-do
Ruby道Ruby has values
Rubyの価値観Be nice to developers
開発者にやさしくBe clear and readable
わかりやすく、読みやすく

Be flexible and agile
柔軟 かつ アジャイル に

Be openオープン にBe nice to developers(開発者にやさしく)✓ 人間の開発効率を重視✓ 利用者にとってシンプルに✓ さまざまな書き方を許容✓ 習熟曲線/問題に応じた使いこなし✓ 簡単なことは簡単に✓ 難しいことはそれなりに

ドメイン特化言語
難易度

メタプログラミング

OOP/(関数型)
手続型
コーディング時間

Be clear and readable(わかりやすく、読みやすく)✓ 処理の本質だけを書く✓上手に書けば読みやすい✓ 読みやすさ >>>> 書きやすさ✓ Rubyらしさ✓ 言語 + ライブラリ / フレームワーク

DEMO

とても簡単なデモ✓ チームのリストから、✓ 勝ち越しているチームを集めて、✓ 標準出力に表示する

team.rbclass Team
attr_accessor :name, :wins, :losses
def initialize(name, wins, losses)@name, @wins, @losses = name, wins, losses
endendteams = [Team.new("Tigers", 12, 4), # winning
Team.new("Giants", 4, 12),Team.new("Dragons", 10, 6), # winning
Team.new("Carp", 7, 9)]winning̲teams.rb
load "team.rb"
winning_teams = teams.select do |team|
team.losses < team.wins
endwinning_teams.each do |team|puts team.nameend全体(Ruby)class Team
attr_accessor :name, :wins, :losses
def initialize(name, wins, losses)@name, @wins, @losses = name, wins, losses
end
end
teams = [Team.new("Tigers", 12, 4), # winning
Team.new("Giants", 4, 12),Team.new("Dragons", 10, 6), # winning
Team.new("Carp", 7, 9)]winning_teams = teams.select do |team|team.losses < team.wins
endwinning_teams.each do |team|puts team.nameend全体(Java)
package com.kakutani.java2ruby.sample;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class WinningTeamsFinder<T> {public static class Team {private String name;private int wins, losses;
public Team(String name, int wins, int losses) {this.name = name;this.wins = wins;this.losses = losses;}
public int getLosses() {return losses;}public void setLosses(int losses) { this.losses = losses;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getWins() {return wins;}
public void setWins(int wins) {this.wins = wins;}}
public interface BooleanMatcher<T> {public boolean isMatch(T obj);}...

全体(Java)...Contʼd...
public List<T> findAll(List<T> list, BooleanMatcher<T> matcher) {List<T> result = new ArrayList<T>();
for(Iterator<T> all = list.iterator(); all.hasNext();){
T each = all.next();
if (matcher.isMatch(each)) result.add(each);}
return result;}public static void main(String[] args) {List<Team> teams = new ArrayList<Team>();teams.add(new Team("Tigers", 12, 4)); /* winning */teams.add(new Team("Giants", 4, 12));teams.add(new Team("Dragons", 10, 6)); /* winning */teams.add(new Team("Carp", 7, 9));
List<Team> winningTeams = new WinningTeamsFinder<Team>().findAll(teams,new BooleanMatcher<Team>() {public boolean isMatch(Team team) {return team.getLosses() < team.getWins();}});
for(Iterator<Team> all = winningTeams.iterator(); all.hasNext();){
Team each = all.next();
System.out.println(each.getName());}}}

Be flexible and agile(柔軟かつアジャイルに)✓ 動的型付け✓ Duck Typing✓ インタプリタ✓ メタプログラミング✓ オープンクラス

Be open(オープンに)✓ コード✓ オープンソース✓ プロセス✓ コミュニティによる開発✓人✓ Weʼre nice :-)Be nice to developers
開発者にやさしくBe clear and readable
わかりやすく、読みやすく

Be flexible and agile
柔軟 かつ アジャイル に

Be openオープン に

Rubyの価値観✓ プログラミングは楽しい✓ プログラマを信頼すること✓ 多様性は善エンタープライズ開発で、忘れられがちではありませんか?

本日のお話の要点✓ Rubyはプログラミングを楽しくする言語です✓ Rubyがエンタープライズ開発の世界にもたらす価値は次の3つです:✓ 多様性は善✓ 信頼することが大事✓ 楽しさにはビジネス価値がある仕事に誇りを、未来に希望をCode Ruby,
Be Happy!
Rubyを書いてハッピーになろう!

ご清聴ありがとうございました何かご質問は?
Do you have any questions?