(株)DTS 大西正太
Me
大西正太
(株)DTS SIer
社員2700名
創業40年強
ITサービス事業本部
ITインテグレーション事業部
IT Platform担当 クラウド活用を推進
Ruby(Rails)Programmer / Architect / PM
2005~
DTSとRuby
Ruby System Integrator Gold取得
Ruby Association評議員輩出企業
2005年よりRuby on Railsを活用
Bizca (Groupware)
スポーツリアルタイム配信サイト
(on Heroku)
Heroku add-on Bounscale
(SaaS:オートスケール)
この発表のあらすじ
近年サービスの垂直立ち上げのご要望が増えています
ご要望に応えるために講じている3つの方策を「EC決済サービス基盤」の事例を交えご紹介します
最後にそれらを今後どのように改善しようと考えているかをご紹介します
サービスの垂直立ち上げ
多くのお客様が3ヶ月前後でのリリース要望
でも開発期間の標準的な指標値からすると普通にやってたら間に合わない
工数(人月) 計算式 開発期間(月) 1 2.15 * (1^(1 / 3)) 2.15 5 2.15 * (5^(1 / 3)) 3.68
10 2.15 * (10^(1 / 3)) 4.63 30 2.15 * (30^(1 / 3)) 6.68 60 2.15 * (60^(1 / 3)) 8.42
100 2.15 * (100^(1 / 3)) 9.98
どうすればいい?
①作る範囲を 減らす
①
②作る開発者を柔軟に増やす
②
③作る速さを 上げる
③
具体的には・・・
①作る範囲を減らす
②作る開発者を柔軟に増やす
③作る速さを上げる
クラウド コンピューティング
ニアショア
プロジェクト概要
お客様のグループ共通のECサイトでの決済サービス基盤
決済という意味ではエンタープライズ
開発規模:
数十人月(全体)
開発期間:
ファーストリリース 3ヵ月
作る範囲を減らす
多数のシステム連携によりサービス実現
顧客管理データベース
オブジェクトストレージ
決済代行システム
基幹システム …etc
全てを一から構築・実装していた場合と比べて大幅な工数削減
クラウドの積極活用
作る開発者を柔軟に増やす
質を落とさず最適な人数・スキルの
開発人員を全国からオンタイムに調達
顧客 (東京)
DTS (東京)
外注先 (地方)
チケット チケット
Git
Git Git Git
Git
対面 会議
ビデオ会議
ニアショアを活用した分散開発
作る速さを上げる
具体的に何を開発するのか?
クラウドのオーケストレーション
開発対象固有の業務ロジック
クラウド オーケストレーション
サービス固有の 業務ロジック
クラウド
Ruby利用で高速開発 !
Rubyでクラウドオーケストレーションはなぜ高速?
Rubyの柔軟性でクラウド接続がシンプル記述
クラウド連携はマッピングなど定型的な処理が大半
Rubyのリフレクション機構でシンプルに記述できる xxxxSession = XxxxSession.openSession( USER_ID, PASSWORD, END_POINT); List<Brand__c> objectList = new ArrayList<Brand__c>(); StringBuffer selectQuery = new StringBuffer(); selectQuery.append("SELECT "); selectQuery.append("Id, "); selectQuery.append("Name "); selectQuery.append("FROM "); selectQuery.append("Brand__c "); selectQuery.append("where IsDeleted = false "); QueryResult rs = xxxxSession.binding.query(selectQuery.toString()); boolean done = false; if (rs.getSize() > 0){ while (!done) { for (SObject so : rs.getRecords()) { objectList.add((Brand__c)so); } if (rs.isDone()) { done = true; } else { rs = xxxxSession.binding.queryMore(rs.getQueryLocator()); } } }
client = Xxxx::Client.new client.authenticate :token => "xxx", :instance_url => "xxx" client.xxxx("Brand") result = Brand.find_by_is_deleted(false)
1/6
Rubyで業務ロジック開発はなぜ高速?(1)
Rubyの柔軟性でDB接続がシンプル記述
業務ロジックの大半、DBアクセスをシンプル記述
Rubyのリフレクションをフルに生かしたRailsの力 class Meigara < ActiveRecord::Base
end
package jp.kawakubo;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "MEIGARA")
public class Meigara implements Serializable {
private int id = 0;
private String name = "";
private String nameKana = "";
private int dosu = 0;
private String koji = "";
private String sweetPotatoName = "";
private String manufacturer = "";
private float volume = 0f;
private int price = 0;
public Meigara() {
}
public Meigara(
int id,
String name,
String nameKana,
int dosu,
String koji,
String sweetPotatoName,
String manufacturer,
float volume,
int price) {
this.id = id;
this.name = name;
this.nameKana = nameKana;
this.dosu = dosu;
this.koji = koji;
this.sweetPotatoName = sweetPotatoName;
this.manufacturer = manufacturer;
this.volume = volume;
this.price = price;
}
@Id
@Column(name = "ID")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name = "NAME")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Column(name = "NAMEKANA")
public String getNameKana() {
return nameKana;
}
public void setNameKana(String nameKana) {
this.nameKana = nameKana;
}
@Column(name = "DOSU")
public int getDosu() {
return dosu;
}
public void setDosu(int dosu) {
this.dosu = dosu;
}
@Column(name = "KOJI")
public String getKoji() {
return koji;
}
public void setKoji(String koji) {
this.koji = koji;
}
@Column(name = "SWEETPOTATONAME")
public String getSweetPotatoName() {
return sweetPotatoName;
}
public void setSweetPotatoName(String
sweetPotatoName) {
this.sweetPotatoName = sweetPotatoName;
}
@Column(name = "MANUFACTURER")
public String getManufacturer() {
return manufacturer;
}
public void setManufacturer(String manufacturer) {
this.manufacturer = manufacturer;
}
@Column(name = "VOLUME")
public float getVolume() {
return volume;
}
public void setVolume(float volume) {
this.volume = volume;
}
@Column(name = "PRICE")
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
} ※JPAの例
1/75
Rubyで業務ロジック開発はなぜ高速?(2)
基礎的なデータ組立処理がシンプル記述
業務ロジックは配列・文字・数値などの組立が多い
Rubyのブロック機構でシンプルに記述できる
List<String> names = new ArrayList<String>(); if(group != null){ List<User> users = group.getUsers(); for (User user : users) { names.add(user.getName()); } }
names = group.try(:users).map(&:name)
1/7
例)あるグループに所属しているユーザの名前の入った配列を取得
更にRubyの開発が早い理由
ソフトウェア開発は大半がうまく動かない問題の調査をしている
ホビーでRubyをやる人が世界中にたくさん!
まつもとさんの文化
ソーシャルコーディングサービスなどに有用な情報が多数ある
Result
Rubyを含めたこれらの対応のおかげで
無事スケジュール通り
予算通り
期待の品質で
サービスインできました
クラウド活用の改善
Keep クラウドの利用は今後も継続したい ・大幅に工数削減できている
Problem 性能の改善が必要 ・一般にSaaS連携箇所は性能が出づらい ・毎回個別にキャッシングなどの対応 →より汎用的な対応が必要
Try 他レイヤのクラウド活用 ・今回はSaaSの利用 ・DTSではIaaS/PaaSの実績もあり ・より積極的に提案していきたい
ニアショア活用の改善
Keep ニアショアは今後も継続したい ・現実的な費用でサービスの垂直立ち上げ可能
Problem ニアショア先がなかなか見つからない ・お声掛けください
Try クラウドソーシングの活用 ・更なる分散開発を追求していきたい ・SIerとしてはセキュリティなど課題がある ・携帯端末のテストなど適用内容を見極めたい
Ruby活用の改善
Keep Rubyの利用 ・他言語に比べて今でもNo.1の開発スピード ・Web開発のトレンドはRailsが牽引
Problem 性能が劣る ・Javaやnode.jsに大きく劣る
Try 他言語のハイブリッド活用 ・Ruby : 作るのが速いので基本はRuby ・node.js: I/Oが多い、WebSocketなど ※コードは読みづらくなりがち ・Java : 計算速度が必要な場合など ※作るのに時間がかかる