SlideShare une entreprise Scribd logo
1  sur  89
Télécharger pour lire hors ligne
広告システム刷新の舞台裏
PHPからJavaに変えてみました
ヤフー株式会社
森下大介
自己紹介
YJ入社前
Sierな世界の住人でした。
受託案件をこなす業務システム開発
のエンジニア。
YJ入社後
BtoBなWebサービス開発へ。
Web系と言いつつエンタープライズ
系っぽいシステムの開発に携わる。
• 名前:森下大介
• 年齢:41
• 職歴:2011年にYJに中途入社
• 言語:C/C++/Java/PHP/Node.js
3P今回のお話の前提その1
自分の所属部署における取り組み事例です。
• 対象は、広告主向けの入稿やレポーティング機能を
提供する「業務系」と呼ばれるシステム。
• データ登録と集計系の比重が高いところがエンター
プライズシステムっぽい。YJの中ではマイノリティ。
4P今回のお話の前提その2
刷新前のシステムをディスるつもりは無いです。
・・・ホントですよ?
ビジネスをしっかり支えてくれて、後から個別に
刷新もできる優れた構成でした。
5P本日の内容
• バックグラウンド
• 取り組んだこと
• やったことその0:体制づくり
• やったことその1:プログラミング言語を変える
• やったことその2:テストができるアーキテクチャに
• やったことその3:テスト向けDSL (Spock)
• やったことその4:CI/CD, 静的解析
• やったことその5:インタフェース定義言語
• 振り返っての所感
バックグラウンド
7P入社当時のシステムの特徴:利用言語、道具
• 言語:
– PHPメイン
– たまにバッチ系にPerl
– 一部のライブラリはC + PHP Extension
• 道具:
– ほとんどの人がvim, emacs等を使用
– IDEはほとんど使われていない
– テストはほぼブラックボックステストのみ
8P入社当時のシステムの特徴:システム構成
• システム構成
– FE/BEは明確に分離、BEはWebAPI化
– マイクロサービスほどでは無いが分散システム化
• このおかげで・・・
– 機能ごとにスケールができた
– 機能ごとにアップデートができた
9Pこんな感じの構成
A
Service
B
Service
C
Service
X
Service
Y
Service
Z
Service
バックエンドサーバー群1 バックエンドサーバー群2
FEサーバー群
バックエンド機能を
WebAPIで構成。
複数Serviceの集まりを
1アプリケーションにして
サーバーにデプロイ。
10P当時、思っていたこと
何をやっても
「なんか妙につらい・・・」
11P例1:小改修なのにつらい
typo修正したいだけなのに・・・
- ユニットテストがない
- コンパイラ、型がない
- IDE使ってない
12P例2:結合がつらい
なかなかつながらない・・・
特にAPIIFドキュメントが
- 手書きだし、書き方が統一されてない
- 書き手と読み手でお互いに認識がズレてる
- ドキュメント通りに実装されない
13P例3:なんとなく動くのがつらい
LLの柔軟さが裏目に・・・
- 存在しないメソッドコールしても動く。
- 間違った型で引数受け取っても動く。
14P何が起きていたのか?
考察1:「大規模」で「複雑」に。
サービスが育った結果・・・
- 道具の助け無しで
- 人手と記憶と努力と根性で
- がんばれる規模をこえている
15P何が起きていたのか?
考察2:道具とやり方が合ってない
ちゃんとデータを扱いたいのに
- 型宣言が無い
- コンパイラに頼れない
- 単体テストを仕掛けられない
16P何が起きていたのか?
考察3:積み重なる技術負債
やり方を変えないままで
- 既存コンポーネントは拡張され
- 新規コンポーネントが追加され
- そしてそこにテストは無い
17P何が起きていたのか?
考察4:チーム同士が良くも悪くも独立
分散システム化によって・・・
– 担当機能毎にチームの独立性が強い
– 技術/知識/事例の共有がされない
– 助け合う、融通しあう意識が弱い
18P当時のエンジニアの心中
このままだとヤバイのは薄々感じてる。
感じてるけど・・・
– 目の前の巨大システムは売上を現実にあげている
– ビジネス拡張のための案件はひっきりなし
– 変えるには根本的な手当が必要・・・
– どーすりゃいいのこれ?
19Pそんなときに
組織変更がありました。新部長が言いました。
「イチから全部変えてよし」
このおかげで動き出すことが出来ました。
これくらいの上位レイヤから言い出してくれると格段
に動きやすくなると実感してます。
20P目指したこと
システム刷新は「結果」
• 自分の変化がアウトプットを変える。
• でも結果を出すことも重要。
• 結果で証明する。
変わるべきは「自分達」
• 3倍早く
• やりやすく
• 確実に
開発できる強いエンジニアになること。
「3倍早い開発スピード」
取り組んだこと
やったことその0
体制をつくる
23P体制づくり
リード役の配置
– 自分が当時の役職を離れて、部長直下の「部
付」ぼっちとなり、刷新活動に集中。
– できるかぎりディスカッションしてコンセン
サス取ることを努力するが迷ったら最後は決
断の責任を全て負う。
24P体制づくり
仲間を集める
– 同じような問題意識を持つ人に声をかけて、
バーチャルなチームを構築。
25P体制づくり
部門長による宣言
– 刷新していくことを部の内外でステークホル
ダー/部内メンバーに宣言。
やったことその1
プログラミング言語を変える
27Pプログラミング言語を変える
これを決めた時点で、
学習コストが極大化する事が確定。
大抵はそうしないで済む方向を考えるもので
すが・・・
28Pプログラミング言語を変える
「大規模で、
データをきっちり扱うシステム」
をちゃんと開発していくために必要な
変化だと判断。
29Pプログラミング言語を変える
とにかく欲しかったのは
– コンパイル
– 型宣言
30Pプログラミング言語を変える
特に求めた効果は、しょうもないレベルの間違いを
動かすまでもなく潰せること。
これができないと、typo修正すらおそろしくなる。
– 動かして全確認が必要
– 漏れが無いか確証が持てない。
31Pプログラミング言語を変える
この条件でいくと、
現実的な選択肢はだいぶ絞られる。
考えたのは以下あたり。
– C++
– Java
– Scala
32Pプログラミング言語を変える
選んだのは
Java
33Pプログラミング言語を変える
これで得られたもの
• コンパイルできる
• 厳密な型定義ができる
• 優れたメモリ管理(GC)
• 実行時最適化(JIT)
• デバッガ、解析ツール
副次的なものとして
• 豊富なOSS
• 統合開発環境の活用
• 優れた静的解析ツール
やったことその2
テストできるアーキテクチャに
35Pテストできるアーキテクチャに
「テストできない」とはどういう状況?
• 動かす準備が大変
• CI/CDの中で実行できない
• ブラックボックステストになる
• etc…
36Pテストできるアーキテクチャに
根本的な原因として、アプリケーション内部が「モノ
リシック」なカタマリになっているためと仮定。
システム全体で見ると分散システム構成となっていた
が、個々のアプリケーション内部ではユニットテスト
したいクラス単位で単独で動かせない状態。
37Pモノリシックなコードの例
これらは一見するとA, B, Cというクラスに分
割されているように見えるが・・・
public class A {
public void x() {
B b = new B();
b.y();
}
}
public class B {
public void y() {
C c = new C();
c.z();
}
}
public class C {
public void z() {
DB操作とか
}
}
38Pこれにテストケースを仕掛けてみると・・・
public class A {
public void x() {
B b = new B();
b.y();
}
}
public class B {
public void y() {
C c = new C();
c.z();
}
}
public class C {
public void z() {
DB操作とか
}
}
TestCaseA
(A, B, Cの複合テスト)
Class AにテストケースつくるとB, Cも必ず
くっついて来て単独テストにならない。
TestCaseB
(BとCの複合テスト) TestCaseC
(これはまだ単独)
39Pテストできるアーキテクチャに
ポイントは、
「呼び出し先の実装クラスを自分でnewしていること」
これだとクラス同士が密結合する。
この状態で無理にテストケースを仕掛けたとしても、
• 実行条件が増える
• バリエーションが掛け算で増加
• メンテ、問題箇所の特定が困難
40Pテストできるアーキテクチャに
このようなことから、
「テストできるような構造じゃないからやらない」
という結論となり、放置される。
これを解決するために、アプリケーション内部の基本アー
キテクチャとして「Dependency Injection」を導入。
41PDI(JavaでSpringFramworkの場合)
public class Aimpl
implements A {
@Autowired
private B b;
public void x() {
b.y();
}
}
public class Bimpl
implments B {
@Autowired
private C c;
public void y() {
c.z();
}
}
public class Cimpl
implements C {
public void z() {
DB操作とか
}
}
実装クラスとインタフェースを分離、コール先のインタフェースのみ認識
し、実装インスタンス(Dependency)は外部から注入(Injection)。
42Pこれにテストケースを仕掛けてみると・・・
public class Aimpl
implements A {
@Autowired
private B b;
public void x() {
b.y();
}
}
今まではA単独のテストができなかったが、依存するBをモック化するこ
とでテストしたい処理だけに対して確認を行えるようになる。
class TestCaseA {
def testA() {
def a = new Aimpl()
//モック注入
a.b = Mock(B.class)
//テスト実行、assert
a.x()
}
}
43Pテストできるアーキテクチャに
これにより、依存する他モジュールをnewしなくなる。
そうなると、テスト時にモックを自由に差し込めるようになるので
単独テストが可能となる。
ただし、絶対にあらゆるクラスのnewが禁止というわけではなく、
「テストの都合で分離しててほしい単位」
でこれが適用されていればよい。
44Pテストできるアーキテクチャに
ということで、テストが出来るようになる事を
目的としてDIコンテナを使用。
利用してるDIコンテナは
「SpringFramework」
やったことその3
テスト向けDSLの採用
46Pテスト向けDSLの採用
当初使おうとしていたのは定番のJUnit, JMock。
でもJUnitはJava言語でテストを書くことになるが、
Java言語はテストを表現する文法を持たない。
またJMockはかなり変態コードになるためキツイ。
47Pテスト向けDSLの採用
final SampleDao dao = context.mock(SampleDao.class);
final List<Sample> expected = Arrays.asList(new Sample());
Expectations mockConfig = new Expectations() {
{
oneOf(dao).findBySelector(with(new TypeSafeMatcherSimple<SampleSelector>() {
@Override
protected boolean matchesSafely(SampleSelector item) {
assertEquals(ids[0], item.getIds().get(0));
assertEquals(ids[1], item.getIds().get(1));
assertEquals(userStatuses[0], item.getUserStatuses().get(0));
return true;
}
}));
will(returnValue(expected));
}
};
context.checking(mockConfig);
JMockを利用した
テストコードの一部。
つらくないですか?
48Pテスト向けDSLの採用
テストケースの作成に労力が掛かり過ぎるようだと、
「テスト書くのがキツすぎるのでやらない」
ということになる。
49Pテスト向けDSLの採用
選んだのは
Spock
50Pテスト向けDSLの採用
Junitの上に構築されたものだが、記述言語は、JVM言語の「Groovy」
その上にテストを記述するためのDSL(ドメイン固有言語)が構築されている。
主な機能としては
• テスト実行
• BDD的なテスト記述文法
• 柔軟なモック/スタブ生成
• テストパターンデータの記述
特に良いのが、Groovy自体がJava
よりも色々省略して書けること。
テストコードはJava言語では書き
たくない。
51PSpockによるテストコード例
class SampleSTest extends Specification {
def “データ更新テスト(#testname)”() {
given:
def service= new SampleServiceImpl()
def dao = Mock(SampleDao.class)
1 * dao.update(_) >> response
serivce.dao = dao
when:
def result = service.update(request)
then:
assert result == response
where:
testname | request | response
“パターンA” | “foo1” | “bar1”
“パターンB” | “foo2” | “bar2”
}
}
テストケースで以下のようなブロックに区
切ってコードを書ける。
• givenがテスト対象のセットアップ
• whenがテスト対象の実行
• thenがテスト結果の確認
• whereがテストデータ
Mockの生成とその挙動も全てテストコード
の中で記述できるのが良いところ。
テストデータを複数件かけばその件数分で
全体をループして実行してくれる。
Groovyの型推論や省略記法も楽で助かる。
やったことその4
CI/CD、静的解析
53PCI/CD, 静的解析
アーキテクチャとテストケースそれぞれの
アプローチからテストができない理由を取
り除いた。
これでやっとCI/CDの中であたりまえにテ
ストを行うようになった。
54PCI/CD, 静的解析
CI/CDの中では以下の様なテストや解析を実施
• SpockによるSテストケース実行
• Cloverによる詳細なカバレッジ計測
• Coverity QualityAdvisorによるコード解析
• Coverity TestAdvisorによるテスト解析
• Frisbyを使ったWebAPIのSmokeテスト
やったことその5
インタフェース定義言語
56Pインタフェース定義言語
分散システムの形でシステム全体を構成している
ので、バックエンドの各機能は
「Webサービス(API)」
としてFEや他BEに提供する形にしている。
57Pインタフェース定義言語
その実装とテストのためには以下を行うことになる。
• 外部仕様(APIIF)の定義と公開
• 外部仕様どおりの実装
• 結合試験
58Pインタフェース定義言語
APIを「提供」する側では、
• 人がAPIIFを考えて
• それを頑張ってドキュメントとして書く。
• それを元に実装する。
APIを「利用」する側では、
• 人がAPIIFドキュメントを読んで理解して、
• そのAPIを利用する処理を実装する。
59Pインタフェース定義言語
「仕様/ドキュメント/実装」を人の脳が頑張って変換し
ながら何種類も成果物つくってるが・・・。
この変換時に認識違いによるズレがあった場合、それは結
合試験まで発見できない。
60Pインタフェース定義言語
でも・・・
IFって静的なものなんだから、宣言的に記述できるはず。
宣言的な記述ならそこからコードも文書も生成できる。
61Pインタフェース定義言語
導入したのが
インタフェース定義言語
62Pインタフェース定義言語
当初はOSSの以下あたりを使えないかと検証したが、
• Googole ProtocolBuffer
• Apache Thrift
以下の理由から断念
• 入力値バリデーションが表現できない
• ドキュメントが生成できない
63Pインタフェース定義言語
一から以下を行いました。
• 定義言語自体の文法設計
• コンパイラ開発
• Javaコード・ドキュメントジェネレータ開発
• ドキュメント表示サーバー開発
• 入力値バリデーションエンジン開発
64Pインタフェース定義言語
IDLを使ってAPIIF設計をすると・・・
65Pインタフェース定義言語
1.APIIFをIDL文法で記述
記述した内容はIDLコンパイラを通すことで整合
性チェックを行うことが出来る。
66Pインタフェース定義言語
2.ドキュメント生成して公開
ドキュメントジェネレータを通してJSONデータ
を生成し、それをドキュメント表示サーバーに
アップロードして公開する。
67Pインタフェース定義言語
3.Javaコード生成して利用
Javaコードジェネレータを通してコード生成し
て、実装で利用する。生成コードは編集は一切
せず利用のみとして、常に上書き更新可能にし
ている。
68Pインタフェース定義言語
IDLから生成されるJavaコードは以下。
• Context (データ操作のコンテキスト情報)
• Entity (Pojoデータオブジェクト)
• Enum (Enum系項目の値定義)
• Error (エラーコード一覧)
• JAX-RSインタフェース(APIエンドポイント)
69Pインタフェース定義言語
//IDLファイルの例
namespace entity sample.entity;
entity Sample {
field Long id {
valid min 1;
valid max 100;
}
field String name {
valid max 100;
valid pattern ”^[a-zA-Z0-9¥¥-_]+$”;
}
}
//生成Javaコードの例
package sample.entity;
public class Sample implements Entity {
@CheckNumber(min=1, max=100)
private Long id;
public void setId(Long id) { …. }
public Long getId() { …. }
@CheckString(max=100,
pattern=“^[a-zA-Z0-9¥¥-_]+$”)
public String name;
public void setName(String name) { …. }
public String getName() { …. }
}
IDLコンパイラで
Javaコード生成
IDLで記述したデータ構造(entity)のJavaコード生成例。
この場合はバリデーション用アノテーション付きのPojoが生成される。
70Pインタフェース定義言語
//IDLファイルの例
namespace service sample.jaxrs;
service SampleService {
path /SampleService;
operation Response add(Sample sample);
operation Response set(Sample sample);
}
//生成Javaコードの例
package sample.jaxrs;
@Path(“/SampleService)
public interface SampleService {
@Path(“/add”)
@POST
public Response add(Sample sample);
@Path(“/set”)
@POST
public Response set(Sample sample);
}
IDLコンパイラで
Javaコード生成
IDLで記述したWebAPIエンドポイントのJavaコード生成例。
この場合はJAX-RSのアノテーション付きインタフェースが生成される。
71Pインタフェース定義言語
72Pインタフェース定義言語
73Pインタフェース定義言語
システム刷新を
振り返っての所感
問題検出はできるだけ前工程に。
76P問題検出はできるだけ前工程に
システム開発は先の工程(結合試験とか総合試験
とか)に進めば進むほどソースコードが開発者の
手元を離れる。
そこで見つかった問題を修正して環境に届けるに
は相応の時間がかかる。
77P問題検出はできるだけ前工程に
開発者の手元を離れる直前まで、やれる事をやる。
• IFを結合前に安定させられるIDL
• コンパイルと型宣言
• テストを書いて手元でもCI/CDでも実行
• Coverityの静的解析。
テストを阻む要因を潰す
79Pテストを阻む要因を潰す
テストに向かないアーキテクチャや道具を使う
と対応コストを理由にやらないことが正当化さ
れやすい。
80Pテストを阻む要因を潰す
テストできない理由が消えると、エンジニアは
わりとちゃんとテスト書くようになる。
書いたほうがいいのは皆わかってるし、
書いたものは皆動かしたい。
81Pテストを阻む要因を潰す
アプリケーションアーキテクチャまで踏み込
んでテストを考慮することができればベスト。
ただこれが出来るのはかなり幸運なこと。
未熟でも早めに適用、
フィードバックを受けて磨く
83P早めに適用・フィードバックを受ける
やり方を大幅に変えた時は最初からいろいろ頑
張りたくなる。
でもそこは一旦最低限に押さえて早く実戦投入
することが大事。
84P早めに適用・フィードバックを受ける
机上で考えるよりも
実践の場で揉まれるほうが一番早い。
85P早めに適用・フィードバックを受ける
ただし最初の適用プロダクトでは途中で色々と
方針変更が入りがち。
それを承知してもらうのと、できればしがらみ
の無い新規プロダクトがベスト。
部門長サポートと仲間が大事
87P部門長サポートと仲間が大事
現場で「こうしたい」という思いがあっても、
仕事で開発をしている以上はビジネス要件への
対応は一番力を割くべきところ。
88P部門長サポートと仲間が大事
部門長や組織が
• 攻めの開発(ビジネス要件対応)
• 守りの開発(保守/刷新)
の両方を理解してくれて初めて効果的に取り組める
89P部門長サポートと仲間が大事
個人の能力とアウトプットはかなり限られる。
仲間がいれば、個の範囲を越えた成果が必ず出る。

Contenu connexe

Tendances

こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールこんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールdcubeio
 
Spring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のことSpring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のこと心 谷本
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来についてshinjiigarashi
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjugYahoo!デベロッパーネットワーク
 
2015 03 26 社内勉強会_オープンソースソフトウェアライセンスについて
2015 03 26 社内勉強会_オープンソースソフトウェアライセンスについて2015 03 26 社内勉強会_オープンソースソフトウェアライセンスについて
2015 03 26 社内勉強会_オープンソースソフトウェアライセンスについてNatsuki Yamanaka
 
RLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for DjangoRLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for DjangoTakayuki Shimizukawa
 
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~Daisuke Morishita
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法についてYuji Otani
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと土岐 孝平
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugMasatoshi Tada
 
入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き土岐 孝平
 
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話Daichi Koike
 
20分でわかるgVisor入門
20分でわかるgVisor入門20分でわかるgVisor入門
20分でわかるgVisor入門Shuji Yamada
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ増田 亨
 
[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テスト[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テストTakahiro Moteki
 
コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線Motonori Shindo
 
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersApache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersSeiya Mizuno
 

Tendances (20)

こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールこんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツール
 
Spring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のことSpring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のこと
 
HTTP/2 入門
HTTP/2 入門HTTP/2 入門
HTTP/2 入門
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
 
2015 03 26 社内勉強会_オープンソースソフトウェアライセンスについて
2015 03 26 社内勉強会_オープンソースソフトウェアライセンスについて2015 03 26 社内勉強会_オープンソースソフトウェアライセンスについて
2015 03 26 社内勉強会_オープンソースソフトウェアライセンスについて
 
RLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for DjangoRLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for Django
 
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き
 
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
 
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajpAt least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
 
20分でわかるgVisor入門
20分でわかるgVisor入門20分でわかるgVisor入門
20分でわかるgVisor入門
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
 
[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テスト[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テスト
 
コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線
 
Apache Hadoopの新機能Ozoneの現状
Apache Hadoopの新機能Ozoneの現状Apache Hadoopの新機能Ozoneの現状
Apache Hadoopの新機能Ozoneの現状
 
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersApache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
 

Similaire à #jjug_ccc #ccc_f1 広告システム刷新の舞台裏 - PHPからJavaに変えてみました

Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Tokuhiro Matsuno
 
ビジネス的に高価値なアジャイルテスト
ビジネス的に高価値なアジャイルテストビジネス的に高価値なアジャイルテスト
ビジネス的に高価値なアジャイルテストTsutomu Chikuba
 
C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?Shinichi Hirauchi
 
クラウド開発に役立つ OSS あれこれ
クラウド開発に役立つ OSS あれこれクラウド開発に役立つ OSS あれこれ
クラウド開発に役立つ OSS あれこれMasataka MIZUNO
 
Intalio japan special cloud workshop
Intalio japan special cloud workshopIntalio japan special cloud workshop
Intalio japan special cloud workshopDaisuke Sugai
 
Test Plugins
Test PluginsTest Plugins
Test Pluginsykhr
 
テスト駆動開発の導入ーペアプログラミングの学習効果ー
テスト駆動開発の導入ーペアプログラミングの学習効果ーテスト駆動開発の導入ーペアプログラミングの学習効果ー
テスト駆動開発の導入ーペアプログラミングの学習効果ーShuji Watanabe
 
増加するコアを使い切れ!!
増加するコアを使い切れ!!増加するコアを使い切れ!!
増加するコアを使い切れ!!guestc06e54
 
#STAC2014 システムテスト自動化ハンズオン
#STAC2014 システムテスト自動化ハンズオン#STAC2014 システムテスト自動化ハンズオン
#STAC2014 システムテスト自動化ハンズオンkyon mm
 
PHPUnit でテスト駆動開発を始めよう
PHPUnit でテスト駆動開発を始めようPHPUnit でテスト駆動開発を始めよう
PHPUnit でテスト駆動開発を始めようYuya Takeyama
 
【de:code 2020】 アマダの Azure への取り組みと DevOPS・MLOPS 環境の構築と運用
【de:code 2020】 アマダの Azure への取り組みと DevOPS・MLOPS 環境の構築と運用【de:code 2020】 アマダの Azure への取り組みと DevOPS・MLOPS 環境の構築と運用
【de:code 2020】 アマダの Azure への取り組みと DevOPS・MLOPS 環境の構築と運用日本マイクロソフト株式会社
 
今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略信之 岩永
 
Eclipse を使った java 開発 111126 杉浦
Eclipse を使った java 開発 111126 杉浦Eclipse を使った java 開発 111126 杉浦
Eclipse を使った java 開発 111126 杉浦urasandesu
 
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~infinite_loop
 
テストしなイカ? Seleniumで自動ブラウザテスト
テストしなイカ? Seleniumで自動ブラウザテストテストしなイカ? Seleniumで自動ブラウザテスト
テストしなイカ? Seleniumで自動ブラウザテストOhishi Mikage
 
Trac Plugin Developement with Jenkins
Trac Plugin Developement with JenkinsTrac Plugin Developement with Jenkins
Trac Plugin Developement with JenkinsTakahisa Wada
 
OpenShift Ansbile 活用法 アプリケーションライフサイクルからみる導入効果
OpenShift Ansbile 活用法 アプリケーションライフサイクルからみる導入効果OpenShift Ansbile 活用法 アプリケーションライフサイクルからみる導入効果
OpenShift Ansbile 活用法 アプリケーションライフサイクルからみる導入効果Hideaki Tokida
 

Similaire à #jjug_ccc #ccc_f1 広告システム刷新の舞台裏 - PHPからJavaに変えてみました (20)

Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)
 
PHP agile test tips
PHP agile test tipsPHP agile test tips
PHP agile test tips
 
ビジネス的に高価値なアジャイルテスト
ビジネス的に高価値なアジャイルテストビジネス的に高価値なアジャイルテスト
ビジネス的に高価値なアジャイルテスト
 
Nds#24 単体テスト
Nds#24 単体テストNds#24 単体テスト
Nds#24 単体テスト
 
C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?
 
クラウド開発に役立つ OSS あれこれ
クラウド開発に役立つ OSS あれこれクラウド開発に役立つ OSS あれこれ
クラウド開発に役立つ OSS あれこれ
 
Clrh 110827 wfho
Clrh 110827 wfhoClrh 110827 wfho
Clrh 110827 wfho
 
Intalio japan special cloud workshop
Intalio japan special cloud workshopIntalio japan special cloud workshop
Intalio japan special cloud workshop
 
Test Plugins
Test PluginsTest Plugins
Test Plugins
 
テスト駆動開発の導入ーペアプログラミングの学習効果ー
テスト駆動開発の導入ーペアプログラミングの学習効果ーテスト駆動開発の導入ーペアプログラミングの学習効果ー
テスト駆動開発の導入ーペアプログラミングの学習効果ー
 
増加するコアを使い切れ!!
増加するコアを使い切れ!!増加するコアを使い切れ!!
増加するコアを使い切れ!!
 
#STAC2014 システムテスト自動化ハンズオン
#STAC2014 システムテスト自動化ハンズオン#STAC2014 システムテスト自動化ハンズオン
#STAC2014 システムテスト自動化ハンズオン
 
PHPUnit でテスト駆動開発を始めよう
PHPUnit でテスト駆動開発を始めようPHPUnit でテスト駆動開発を始めよう
PHPUnit でテスト駆動開発を始めよう
 
【de:code 2020】 アマダの Azure への取り組みと DevOPS・MLOPS 環境の構築と運用
【de:code 2020】 アマダの Azure への取り組みと DevOPS・MLOPS 環境の構築と運用【de:code 2020】 アマダの Azure への取り組みと DevOPS・MLOPS 環境の構築と運用
【de:code 2020】 アマダの Azure への取り組みと DevOPS・MLOPS 環境の構築と運用
 
今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略
 
Eclipse を使った java 開発 111126 杉浦
Eclipse を使った java 開発 111126 杉浦Eclipse を使った java 開発 111126 杉浦
Eclipse を使った java 開発 111126 杉浦
 
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
 
テストしなイカ? Seleniumで自動ブラウザテスト
テストしなイカ? Seleniumで自動ブラウザテストテストしなイカ? Seleniumで自動ブラウザテスト
テストしなイカ? Seleniumで自動ブラウザテスト
 
Trac Plugin Developement with Jenkins
Trac Plugin Developement with JenkinsTrac Plugin Developement with Jenkins
Trac Plugin Developement with Jenkins
 
OpenShift Ansbile 活用法 アプリケーションライフサイクルからみる導入効果
OpenShift Ansbile 活用法 アプリケーションライフサイクルからみる導入効果OpenShift Ansbile 活用法 アプリケーションライフサイクルからみる導入効果
OpenShift Ansbile 活用法 アプリケーションライフサイクルからみる導入効果
 

Plus de Yahoo!デベロッパーネットワーク

ヤフーでは開発迅速性と品質のバランスをどう取ってるか
ヤフーでは開発迅速性と品質のバランスをどう取ってるかヤフーでは開発迅速性と品質のバランスをどう取ってるか
ヤフーでは開発迅速性と品質のバランスをどう取ってるかYahoo!デベロッパーネットワーク
 
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2Yahoo!デベロッパーネットワーク
 
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtcヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtcYahoo!デベロッパーネットワーク
 
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtcYahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtcYahoo!デベロッパーネットワーク
 
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtcヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtcYahoo!デベロッパーネットワーク
 
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtcYahoo!デベロッパーネットワーク
 
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtcPC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtcYahoo!デベロッパーネットワーク
 
モブデザインによる多職種チームのコミュニケーション改善 #yjtc
モブデザインによる多職種チームのコミュニケーション改善 #yjtcモブデザインによる多職種チームのコミュニケーション改善 #yjtc
モブデザインによる多職種チームのコミュニケーション改善 #yjtcYahoo!デベロッパーネットワーク
 
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtcユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtcYahoo!デベロッパーネットワーク
 

Plus de Yahoo!デベロッパーネットワーク (20)

ゼロから始める転移学習
ゼロから始める転移学習ゼロから始める転移学習
ゼロから始める転移学習
 
継続的なモデルモニタリングを実現するKubernetes Operator
継続的なモデルモニタリングを実現するKubernetes Operator継続的なモデルモニタリングを実現するKubernetes Operator
継続的なモデルモニタリングを実現するKubernetes Operator
 
ヤフーでは開発迅速性と品質のバランスをどう取ってるか
ヤフーでは開発迅速性と品質のバランスをどう取ってるかヤフーでは開発迅速性と品質のバランスをどう取ってるか
ヤフーでは開発迅速性と品質のバランスをどう取ってるか
 
オンプレML基盤on Kubernetes パネルディスカッション
オンプレML基盤on Kubernetes パネルディスカッションオンプレML基盤on Kubernetes パネルディスカッション
オンプレML基盤on Kubernetes パネルディスカッション
 
LakeTahoe
LakeTahoeLakeTahoe
LakeTahoe
 
オンプレML基盤on Kubernetes 〜Yahoo! JAPAN AIPF〜
オンプレML基盤on Kubernetes 〜Yahoo! JAPAN AIPF〜オンプレML基盤on Kubernetes 〜Yahoo! JAPAN AIPF〜
オンプレML基盤on Kubernetes 〜Yahoo! JAPAN AIPF〜
 
Persistent-memory-native Database High-availability Feature
Persistent-memory-native Database High-availability FeaturePersistent-memory-native Database High-availability Feature
Persistent-memory-native Database High-availability Feature
 
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
 
eコマースと実店舗の相互利益を目指したデザイン #yjtc
eコマースと実店舗の相互利益を目指したデザイン #yjtceコマースと実店舗の相互利益を目指したデザイン #yjtc
eコマースと実店舗の相互利益を目指したデザイン #yjtc
 
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtcヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
 
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtcYahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
 
ビッグデータから人々のムードを捉える #yjtc
ビッグデータから人々のムードを捉える #yjtcビッグデータから人々のムードを捉える #yjtc
ビッグデータから人々のムードを捉える #yjtc
 
サイエンス領域におけるMLOpsの取り組み #yjtc
サイエンス領域におけるMLOpsの取り組み #yjtcサイエンス領域におけるMLOpsの取り組み #yjtc
サイエンス領域におけるMLOpsの取り組み #yjtc
 
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtcヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
 
Yahoo! JAPAN Tech Conference 2022 Day2 Keynote #yjtc
Yahoo! JAPAN Tech Conference 2022 Day2 Keynote #yjtcYahoo! JAPAN Tech Conference 2022 Day2 Keynote #yjtc
Yahoo! JAPAN Tech Conference 2022 Day2 Keynote #yjtc
 
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
 
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtcPC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
 
モブデザインによる多職種チームのコミュニケーション改善 #yjtc
モブデザインによる多職種チームのコミュニケーション改善 #yjtcモブデザインによる多職種チームのコミュニケーション改善 #yjtc
モブデザインによる多職種チームのコミュニケーション改善 #yjtc
 
「新しいおうち探し」のためのAIアシスト検索 #yjtc
「新しいおうち探し」のためのAIアシスト検索 #yjtc「新しいおうち探し」のためのAIアシスト検索 #yjtc
「新しいおうち探し」のためのAIアシスト検索 #yjtc
 
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtcユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc
 

#jjug_ccc #ccc_f1 広告システム刷新の舞台裏 - PHPからJavaに変えてみました