SlideShare ist ein Scribd-Unternehmen logo
1 von 61
互換性とコード進化の両立
川口耕介 CloudBees, Inc.
kk@kohsuke.org / @kohsukekawa

©2013 CloudBees, Inc. All Rights Reserved

1
分散・独立・並行開発

©2013 CloudBees, Inc. All Rights Reserved

2
http://commons.wikimedia.org/wiki/File:Close_up_of_Hand_Cut_Jigsaw_Puzzle.JPG
©2013 CloudBees, Inc. All Rights Reserved

3
実行時結合
©2013 CloudBees, Inc. All Rights Reserved

4
共通ライブラリ

ウェブアプリX

モジュールA

モジュールB

ライブラリ v1.0

ライブラリ v2.0

©2013 CloudBees, Inc. All Rights Reserved

5
©2013 CloudBees, Inc. All Rights Reserved

6
©2013 CloudBees, Inc. All Rights Reserved
© いまいまさのぶ

7
プラグイン機構
プラグイン

プラグイン

コア

プラグイン

プラグイン

様々なクラス

©2013 CloudBees, Inc. All Rights Reserved

…

80+のライブラリ

8
拡張ポイント
• コア

interface Animal {
void bark();
}

• プラグイン
@Extension
class Dog implements Animal {
void bark() { print(“ワン!”); }
}
©2013 CloudBees, Inc. All Rights Reserved

9
プラグインはコアをガンガン使う

Project p = …;
Future<Build> f = p.scheduleBuild();
Build b = f.get();

©2013 CloudBees, Inc. All Rights Reserved

10
この苦しみから解脱する方法はないかと
• お釈迦様の絵
• 徐々に蓄積してきたノウハウ・ツールを大公
開

©2013 CloudBees, Inc. All Rights Reserved

11
©2013 CloudBees, Inc. All Rights Reserved

mage © http://sfcitizen.com/blog/wp-content/uploads/2011/11/6302790910_c4eb865892_o-copy.jpg

12
フィールドの隠蔽

class Point {
int x,y;
}

class Point {
int getX();
int getY();
void setX(int);
void setY(int);
}

©2013 CloudBees, Inc. All Rights Reserved

13
インターフェース?抽象クラス?

interface Animal {
void bark();
}

abstract class Animal {
public abstract
void bark();
}

©2013 CloudBees, Inc. All Rights Reserved

14
インターフェース?抽象クラス?

interface Animal {
void bark();
void bark(int times);
}

©2013 CloudBees, Inc. All Rights Reserved

15
インターフェース?抽象クラス?

abstract class Animal {
public abstract void bark();
public void bark(int times) {
for (int i=0; i<times; i++)
bark();
}
}

©2013 CloudBees, Inc. All Rights Reserved

16
ピンポンパターン

abstract class Animal {
@deprecated
public void bark() {
bark(1);
}
public void bark(int times) {
for (int i=0; i<times; i++)
bark();
}
}

©2013 CloudBees, Inc. All Rights Reserved

17
コンストラクタの肥大化
• 外部コードによる
サブクラス化を許可
したい
• GitSCMの例

public GitSCM(
String scmName,
List<UserRemoteConfig> userRemoteConfigs,
List<BranchSpec> branches,
UserMergeOptions userMergeOptions,
Boolean doGenerateSubmoduleConfigurations,
Collection<SubmoduleConfig> submoduleCfg,
boolean clean,
boolean wipeOutWorkspace,
BuildChooser buildChooser, GitRepositoryBrowser browser,
String gitTool,
boolean authorOrCommitter,
String relativeTargetDir,
String reference,
String excludedRegions,
String excludedUsers,
String localBranch,
boolean disableSubmodules,
boolean recursiveSubmodules,
boolean pruneBranches,
boolean remotePoll,
String gitConfigName,
String gitConfigEmail,
boolean skipTag,
String includedRegions,
boolean ignoreNotifyCommit,
boolean useShallowClone) {

©2013 CloudBees, Inc. All Rights Reserved

18
我慢してセッター
class Foo {
void initXYZ(int x, int y, int z) { … }
void initABC(String a, String b, String c) { … }
}

©2013 CloudBees, Inc. All Rights Reserved

19
コンフィグパターン
class FooConfig {
int x,y,z;
String a,b,c;
}

abstract class Foo {
Foo(FooConfig config) {
…
}
}

©2013 CloudBees, Inc. All Rights Reserved

20
©2013 CloudBees, Inc. All Rights Reserved

mage © http://sfcitizen.com/blog/wp-content/uploads/2011/11/6302790910_c4eb865892_o-copy.jpg

21
パッケージ越しにアクセスするた
めにpublicなんだけど、
外部からは使わせたくない

©2013 CloudBees, Inc. All Rights Reserved

22
互換性用に@deprecatedとした
コードを次のステップに進めたい

©2013 CloudBees, Inc. All Rights Reserved

23
だ をつ 修 ア 俺
し く 飾ク俺
て る 子セ
! 道 をス
具

© 小学館

©2013 CloudBees, Inc. All Rights Reserved

24
http://kohsuke.org/access-modifier/
• 独自のアクセスチェッカを定義する
class 俺俺アクセス extends AccessRestriction
{
public void instantiated(loc,target,listener) {
listener.onError(null,loc,
target+“インスタンス生成は禁止”);
}
}
• サブタイプ、読み、書き、呼び出しなど6種
類
©2013 CloudBees, Inc. All Rights Reserved

25
http://kohsuke.org/access-modifier/
• 通常のアクセス修飾子と共に使う
@Restricted(俺俺アクセス.class)
public class Foo {
public String value;
}
• Mavenプラグインがクラスファイルを検査

©2013 CloudBees, Inc. All Rights Reserved

26
©2013 CloudBees, Inc. All Rights Reserved

27
バイナリ互換性を活用
interface Animal {
void bark();
}
class Dog implements Animal {
void bark() { print(“ワン”); }
}

Animal a = new Dog();
a.bark();
©2013 CloudBees, Inc. All Rights Reserved

28
バイナリ互換性を活用
interface Animal {
void bark(int n);
}
1. new Dog()でInstantiationError
class Dog implements Animal{
2. Dog→Animalのキャストで
ClassCastException
void bark() { print(“ワン”); }
3. a.bark(3)でAbstractMethodError
}
4. その他

Animal a = new Dog();
a.bark(3);
©2013 CloudBees, Inc. All Rights Reserved

29
try {
a.bark(3);
} catch (AbstractMethodError e) {
// 互換性モード
…
}

©2013 CloudBees, Inc. All Rights Reserved

30
ジェネリクス
class Foo {
List<Object> getChildren() { … }
}

class Foo {
List<String> getChildren() { … }
}

©2013 CloudBees, Inc. All Rights Reserved

31
ジェネリクス
class Foo<T extends X> implements Future<T> {
T get() { … }
}

class Foo<T extends Y> implements Future<T> {
T get() { … }
}
class Y extends X { … }
©2013 CloudBees, Inc. All Rights Reserved

32
ジェネリクス型変更のルール
• メソッド・フィールドのErasureが変わって
いなければOK
– T<X,Y,…>
→
T
– T extends X →
X
–…

• 検査してくれるツールをいつかは書きたい

©2013 CloudBees, Inc. All Rights Reserved

33
根底のルール
foo/Foo.class
invokevirtual
org.example.Bar#method1(java.lang.String,int,int)boolean
…

org/example/Bar.class

メソッド method1 (java.lang.String,int,int):boolean

©2013 CloudBees, Inc. All Rights Reserved

34
参照解決のルール
• メソッドへの参照
– クラス名:
– メソッド名:
– 戻り値型:
– パラメータ型:

java.lang.String
indexOf
int
java.lang.String,int

• 関連事項
– アクセス修飾子
– 例外

©2013 CloudBees, Inc. All Rights Reserved

35
コード進化のパターン
class Foo {
X get() { … }
}

class Foo {
Y get() { … }
}
class Y extends X { … }
©2013 CloudBees, Inc. All Rights Reserved

36
コード進化のパターン
class Foo {
X get() { … }
}

class Foo {
Y get() { … }
X get() { … }
}
©2013 CloudBees, Inc. All Rights Reserved

37
Bridge Method Injectorプロジェクト bit.ly/b-mi
class Foo {
@WithBridgeMethods(X.class)
Y get() { … }
}

class Foo {
Y get() { … }
X get() { Y y=get(); return y; }
}
©2013 CloudBees, Inc. All Rights Reserved

38
応用
class Foo {
@WithBridgeMethods(value=X.class,
castRequired=true)
Object get() { … }
}
class Foo {
Object get() { … }
X get() { Object o=get(); return (X)o; }
}
©2013 CloudBees, Inc. All Rights Reserved

39
自分はルールを守っていても
モジュールB

ライブラリ 1.0

モジュールA

ライブラリ 2.0

©2013 CloudBees, Inc. All Rights Reserved

40
シェーディング / パッケージ・リネーミング
package org.jenkinsci.foo;
import org.acme.A;
import org.acme.B;
class Foo {
private List<A> a = …;
void bar() { new B().b(); }
}
©2013 CloudBees, Inc. All Rights Reserved

41
シェーディング / パッケージ・リネーミング
package org.jenkinsci.foo;
import hidden.org.acme.A;
import hidden.org.acme.B;
class Foo {
private List<A> a = …;
void bar() { new B().b(); }
}
©2013 CloudBees, Inc. All Rights Reserved

42
シェーディング / パッケージ・リネーミング
• 事後に
– maven-shade-plugin

• 事前に
– 予めリネームしたやつをjarにパッケージしてお
く

©2013 CloudBees, Inc. All Rights Reserved

43
うまくいかない場合もある
• 文字列操作でパッケージ名をいじっている
• META-INF/…
• モジュールの公開APIから参照されている

©2013 CloudBees, Inc. All Rights Reserved

44
©2013 CloudBees, Inc. All Rights Reserved

mage © http://sfcitizen.com/blog/wp-content/uploads/2011/11/6302790910_c4eb865892_o-copy.jpg

45
ありがちなパターン
class Foo {
static final Foo INSTANCE = new Foo();
…
}
class Bar {
void bar() {
doSomethingWith(Foo.INSTANCE);
}
}
©2013 CloudBees, Inc. All Rights Reserved

46
逆立ちしたって無理!
class Foo {
static Foo getInstance() { … }
}

class Bar {
void bar() {
doSomethingWith(Foo.INSTANCE);
}
}

©2013 CloudBees, Inc. All Rights Reserved

47
©2013 CloudBees, Inc. All Rights Reserved

48
書き換え方
class Foo {
@AdaptField(name=“INSTANCE”)
static Foo getInstance() { … }
}

Barのロード時に
書き換え

class Bar {
void bar() {
doSomethingWith(Foo.INSTANCE);
}
}
©2013 CloudBees, Inc. All Rights Reserved

49
Bytecode Compatibility Transformer bit.ly/b-c-t
class Foo {
@AdaptField(name=“INSTANCE”)
static Foo getInstance() { … }
}
foo.jar

Foo.class

変換
定義

©2013 CloudBees, Inc. All Rights Reserved

50
Bytecode Compatibility Transformer bit.ly/b-c-t
• 実行時
– 変換定義 → byte[] transform(byte[] classFile)

独自class loader

foo.jar

bar.jar

変換
定義

©2013 CloudBees, Inc. All Rights Reserved

51
思わぬ落とし穴が!

©2013 CloudBees, Inc. All Rights Reserved

52
思わぬ落とし穴
class Foo {
static Foo INSTANCE;
}
class Bar extends Foo {
void m() {
System.out.println(INSTANCE);
}
Bar#INSTANCE
}
©2013 CloudBees, Inc. All Rights Reserved

53
プログラム変換の利点
• 思い切った書き換え
• 予期しない変更に対応

©2013 CloudBees, Inc. All Rights Reserved

54
プログラム変換の欠点
• 独自のクラスローダが必要

©2013 CloudBees, Inc. All Rights Reserved

55
http://commons.wikimedia.org/wiki/File:Light_Bulb.jpg
©2013 CloudBees, Inc. All Rights Reserved

56
一分で学ぶInvokedynamic
• Java7の新しい機能
• 実行時リンク
• 静的リンクと同じ速度
void foo() {
+リンカの為の追
int x = 5;
加情報
String y = “hello”;
Object o = intとstringからObjectを返す何か(x,y)
return o;
}
+リンカの名前
©2013 CloudBees, Inc. All Rights Reserved

57
http://no-more-tears.kohsuke.org/

class Foo {
void foo() {
Project p = new Project();
Future<Build> f = p.scheduleBuild();
Build b = f.get();
…
}
}

©2013 CloudBees, Inc. All Rights Reserved

58
ビルド時にinvokedynamicに置き換え
new Project()

class Foo {
Project.scheduleBuild()
void foo() {
Project p = [void→Project](this);
Future<Build> f = [Project→Future] (p);
Build b = [Future → Build](f);
…
Future.get()
}
}

©2013 CloudBees, Inc. All Rights Reserved

59
実行時に適宜書き換え

class Foo {
void foo() {
Project p = Project.create();
Future<Build> f = p.scheduleBuild(0);
Build b = f.value;
…
}
}

©2013 CloudBees, Inc. All Rights Reserved

60
まとめ

互換性とコードの進化は両立できる

©2013 CloudBees, Inc. All Rights Reserved

61

Weitere ähnliche Inhalte

Was ist angesagt?

20150101勉強会 dokku alt
20150101勉強会 dokku alt20150101勉強会 dokku alt
20150101勉強会 dokku alt
Shugo Numano
 

Was ist angesagt? (20)

Cloud Foundry V2を、もうちょっと深掘りしよう
Cloud Foundry V2を、もうちょっと深掘りしようCloud Foundry V2を、もうちょっと深掘りしよう
Cloud Foundry V2を、もうちょっと深掘りしよう
 
自動化ハンズオン
自動化ハンズオン自動化ハンズオン
自動化ハンズオン
 
CoreOS OEM on NIFTY Cloud - CoreOS Meetup Tokyo #1 #coreosjp
CoreOS OEM on NIFTY Cloud - CoreOS Meetup Tokyo #1 #coreosjpCoreOS OEM on NIFTY Cloud - CoreOS Meetup Tokyo #1 #coreosjp
CoreOS OEM on NIFTY Cloud - CoreOS Meetup Tokyo #1 #coreosjp
 
どこよりも早い Spring Boot 1.2 解説 #渋谷Java
どこよりも早い Spring Boot 1.2 解説 #渋谷Javaどこよりも早い Spring Boot 1.2 解説 #渋谷Java
どこよりも早い Spring Boot 1.2 解説 #渋谷Java
 
Introduce that Best practices for writing Dockerfiles
Introduce that Best practices for writing DockerfilesIntroduce that Best practices for writing Dockerfiles
Introduce that Best practices for writing Dockerfiles
 
20150101勉強会 dokku alt
20150101勉強会 dokku alt20150101勉強会 dokku alt
20150101勉強会 dokku alt
 
kpackによるコンテナイメージのビルド
kpackによるコンテナイメージのビルドkpackによるコンテナイメージのビルド
kpackによるコンテナイメージのビルド
 
GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけねGitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
 
st2-docker ことはじめ
st2-docker ことはじめst2-docker ことはじめ
st2-docker ことはじめ
 
Quarkus による超音速な Spring アプリケーション開発
Quarkus による超音速な Spring アプリケーション開発Quarkus による超音速な Spring アプリケーション開発
Quarkus による超音速な Spring アプリケーション開発
 
自前CF環境を整えよう 2013年11月版
自前CF環境を整えよう 2013年11月版自前CF環境を整えよう 2013年11月版
自前CF環境を整えよう 2013年11月版
 
Githubを使って簡単に helm repoを公開してみよう
Githubを使って簡単に helm repoを公開してみようGithubを使って簡単に helm repoを公開してみよう
Githubを使って簡単に helm repoを公開してみよう
 
第18回Cloud Foundry輪読会用 Buildpackを使ってアプリを 載せるためのアプローチ
第18回Cloud Foundry輪読会用 Buildpackを使ってアプリを 載せるためのアプローチ第18回Cloud Foundry輪読会用 Buildpackを使ってアプリを 載せるためのアプローチ
第18回Cloud Foundry輪読会用 Buildpackを使ってアプリを 載せるためのアプローチ
 
On-premise コンテナ基盤と Hardware LB を使った "type LoadBalancer"
On-premise コンテナ基盤と Hardware LB を使った "type LoadBalancer"On-premise コンテナ基盤と Hardware LB を使った "type LoadBalancer"
On-premise コンテナ基盤と Hardware LB を使った "type LoadBalancer"
 
Japan Container Day 2018
Japan Container Day 2018Japan Container Day 2018
Japan Container Day 2018
 
Jenkins x Kubernetesが簡単だと思ったら大変だった話
Jenkins x Kubernetesが簡単だと思ったら大変だった話Jenkins x Kubernetesが簡単だと思ったら大変だった話
Jenkins x Kubernetesが簡単だと思ったら大変だった話
 
Cloud foundry(v2)へアプリを載せ替え
Cloud foundry(v2)へアプリを載せ替えCloud foundry(v2)へアプリを載せ替え
Cloud foundry(v2)へアプリを載せ替え
 
AlibabaCloudではじめるKubernetes
AlibabaCloudではじめるKubernetesAlibabaCloudではじめるKubernetes
AlibabaCloudではじめるKubernetes
 
DockerCon参加報告 (`docker build`が30倍以上速くなる話など)
DockerCon参加報告 (`docker build`が30倍以上速くなる話など)DockerCon参加報告 (`docker build`が30倍以上速くなる話など)
DockerCon参加報告 (`docker build`が30倍以上速くなる話など)
 
BOSH-lite で 1VM Cloud Foundry
BOSH-lite で 1VM Cloud FoundryBOSH-lite で 1VM Cloud Foundry
BOSH-lite で 1VM Cloud Foundry
 

Ähnlich wie コードの互換性と進化の両立

第2回デザインパターン資料
第2回デザインパターン資料第2回デザインパターン資料
第2回デザインパターン資料
gaaupp
 
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -
Akio Katayama
 
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
JPCERT Coordination Center
 

Ähnlich wie コードの互換性と進化の両立 (20)

爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon
爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon
爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon
 
第2回デザインパターン資料
第2回デザインパターン資料第2回デザインパターン資料
第2回デザインパターン資料
 
QuickDemo HashiCorp Terraform with Microsoft Azure and VMware vSphere
QuickDemo HashiCorp Terraform with Microsoft Azure and VMware vSphereQuickDemo HashiCorp Terraform with Microsoft Azure and VMware vSphere
QuickDemo HashiCorp Terraform with Microsoft Azure and VMware vSphere
 
「AROW」お披露目(実用編)
「AROW」お披露目(実用編)「AROW」お披露目(実用編)
「AROW」お披露目(実用編)
 
Hyperledger Fabric 簡単構築ツール minifabricのご紹介 〜productionへの移行をminifabricで加速〜
Hyperledger Fabric 簡単構築ツール minifabricのご紹介 〜productionへの移行をminifabricで加速〜Hyperledger Fabric 簡単構築ツール minifabricのご紹介 〜productionへの移行をminifabricで加速〜
Hyperledger Fabric 簡単構築ツール minifabricのご紹介 〜productionへの移行をminifabricで加速〜
 
Groovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUGGroovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUG
 
GoF デザインパターン 2009
GoF デザインパターン 2009GoF デザインパターン 2009
GoF デザインパターン 2009
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんか
 
[1C5] Docker Comose & Swarm mode Orchestration (Japan Container Days - Day1)
[1C5] Docker Comose & Swarm mode Orchestration (Japan Container Days - Day1)[1C5] Docker Comose & Swarm mode Orchestration (Japan Container Days - Day1)
[1C5] Docker Comose & Swarm mode Orchestration (Japan Container Days - Day1)
 
Swift2 の新機能 Protocol Extension
Swift2 の新機能 Protocol ExtensionSwift2 の新機能 Protocol Extension
Swift2 の新機能 Protocol Extension
 
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -
 
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -
 
ストリームデータ分散処理基盤Storm
ストリームデータ分散処理基盤Stormストリームデータ分散処理基盤Storm
ストリームデータ分散処理基盤Storm
 
cocos2d-xとネイティブ間の連携
cocos2d-xとネイティブ間の連携cocos2d-xとネイティブ間の連携
cocos2d-xとネイティブ間の連携
 
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?
 
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
 
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
 
Lithium Labo #1
Lithium Labo #1Lithium Labo #1
Lithium Labo #1
 
Angular ユーザーなら押さえておきたい! TypeScript と Visual Studio Code の基礎と活用
Angular ユーザーなら押さえておきたい! TypeScript と Visual Studio Code の基礎と活用Angular ユーザーなら押さえておきたい! TypeScript と Visual Studio Code の基礎と活用
Angular ユーザーなら押さえておきたい! TypeScript と Visual Studio Code の基礎と活用
 
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
 

Mehr von Kohsuke Kawaguchi

Jenkins User Conference 東京 2015
Jenkins User Conference 東京 2015Jenkins User Conference 東京 2015
Jenkins User Conference 東京 2015
Kohsuke Kawaguchi
 
プロジェクト現状報告・Rubyによるjenkinsプラグイン開発
プロジェクト現状報告・Rubyによるjenkinsプラグイン開発プロジェクト現状報告・Rubyによるjenkinsプラグイン開発
プロジェクト現状報告・Rubyによるjenkinsプラグイン開発
Kohsuke Kawaguchi
 

Mehr von Kohsuke Kawaguchi (20)

Jenkins 2.0 (日本語)
Jenkins 2.0 (日本語)Jenkins 2.0 (日本語)
Jenkins 2.0 (日本語)
 
Workflow, container, and beyond
Workflow, container, and beyondWorkflow, container, and beyond
Workflow, container, and beyond
 
Jenkins User Conference 東京 2015
Jenkins User Conference 東京 2015Jenkins User Conference 東京 2015
Jenkins User Conference 東京 2015
 
JavaOne 2014: Next Step in Automation: Elastic Build Environment
JavaOne 2014: Next Step in Automation: Elastic Build EnvironmentJavaOne 2014: Next Step in Automation: Elastic Build Environment
JavaOne 2014: Next Step in Automation: Elastic Build Environment
 
On sharing ideas & sharing code
On sharing ideas & sharing codeOn sharing ideas & sharing code
On sharing ideas & sharing code
 
Jenkins User Conference 2013: Literate, multi-branch, mobile and more
Jenkins User Conference 2013: Literate, multi-branch, mobile and moreJenkins User Conference 2013: Literate, multi-branch, mobile and more
Jenkins User Conference 2013: Literate, multi-branch, mobile and more
 
Jenkins User Conference 2013 Palo Alto: Keynote
Jenkins User Conference 2013 Palo Alto: KeynoteJenkins User Conference 2013 Palo Alto: Keynote
Jenkins User Conference 2013 Palo Alto: Keynote
 
Jenkins State of union 2013
Jenkins State of union 2013Jenkins State of union 2013
Jenkins State of union 2013
 
How we made jenkins community
How we made jenkins communityHow we made jenkins community
How we made jenkins community
 
第六回Jenkins勉強会
第六回Jenkins勉強会第六回Jenkins勉強会
第六回Jenkins勉強会
 
Large scale automation with jenkins
Large scale automation with jenkinsLarge scale automation with jenkins
Large scale automation with jenkins
 
Jenkins User Conference 2012 San Francisco
Jenkins User Conference 2012 San FranciscoJenkins User Conference 2012 San Francisco
Jenkins User Conference 2012 San Francisco
 
Jenkins+Gitによる検証済みマージ(30分版)
Jenkins+Gitによる検証済みマージ(30分版)Jenkins+Gitによる検証済みマージ(30分版)
Jenkins+Gitによる検証済みマージ(30分版)
 
ここ最近のJenkins新機能
ここ最近のJenkins新機能ここ最近のJenkins新機能
ここ最近のJenkins新機能
 
Jenkins user conference 東京
Jenkins user conference 東京Jenkins user conference 東京
Jenkins user conference 東京
 
Dev@cloudの実装
Dev@cloudの実装Dev@cloudの実装
Dev@cloudの実装
 
Developer summit continuous deliveryとjenkins
Developer summit   continuous deliveryとjenkinsDeveloper summit   continuous deliveryとjenkins
Developer summit continuous deliveryとjenkins
 
Creating a Developer Community
Creating a Developer CommunityCreating a Developer Community
Creating a Developer Community
 
Jenkins user conference 2011
Jenkins user conference 2011Jenkins user conference 2011
Jenkins user conference 2011
 
プロジェクト現状報告・Rubyによるjenkinsプラグイン開発
プロジェクト現状報告・Rubyによるjenkinsプラグイン開発プロジェクト現状報告・Rubyによるjenkinsプラグイン開発
プロジェクト現状報告・Rubyによるjenkinsプラグイン開発
 

Kürzlich hochgeladen

Kürzlich hochgeladen (7)

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 

コードの互換性と進化の両立

Hinweis der Redaktion

  1. 本当に実行するまでわからない
  2. Jenkinsでも似たような問題に何度も遭遇した
  3. でも進化しないといけない、どうするか。
  4. コードの進化と互換性の狭間の苦しみからどう解脱するか。徐々に蓄積してきたノウハウ・ツールを大公開
  5. コンパイルはできないが動く。ソースコード上の規則とバイナリ上の規則の違い。
  6. プログラムを書き換えればいいじゃんか