SlideShare ist ein Scribd-Unternehmen logo
1 von 39
ULS 
レガシーコード改善のススメ 
~保守開発を楽しくする技術を身につけよう~ 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 
2014/9/27 
ウルシステムズ株式会社 
平澤章 
http://www.ulsystems.co.jp 
mailto:info@ulsystems.co.jp 
Tel: 03-6220-1420 Fax: 03-6220-1402
自己紹介 
平澤章(ひらさわあきら) 
ULS 
– 35才の時に生涯一技術者として身を立てると決意したが、 
浮き世のしがらみもあり、若干不本意に思いつつも 
ここ数年は中間管理職としての会社生活を楽しんでいる。 
[著書] [翻訳書- すべて共訳] 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 1 
ウルシステムズ株式会社 
– 企業の戦略的ITに特化したIT技術者集団 
– 技術ブログ 
– http://enterprisegeeks.hatenablog.com/ 
エンタープライズギークス検索
ULS 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 2 
アジェンダ 
保守開発のデフレスパイラル 
レガシーコードをテストで保護する手法 
レガシーコードと闘うための技術大全 
レガシーコードとの闘いで得られる果実 
翻訳時のこぼれ話 
おわりに
ULS 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 3 
皆さんに質問です 
今、どんな仕事をしていますか? 
新規開発の仕事をしている人 
保守開発や運用の仕事をしている人 
開発以外の仕事をしている人 
仕事をしていない人 
この質問には答えたくない人(笑)
最近、保守開発が増えたと思いませんか? 
ULS 
ERPでなんとかなるなら、無理して 
スクラッチ開発なんかしないでしょ 
メインフレームのアプリは、 
2000年代前半にJava 
や.NETで作り替えちゃったし 
ゼロから全部作り替えたいけど、 
お金と時間がもったいないでしょ 
そんなこんなで保守開発が主流に 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 4
だけど、保守開発って大変ですよね 
ULS 
ソースコードはひどいし 
テストコードなんてもちろんないし 
まともなドキュメントは残ってないし 
あっても嘘ばっかり書いてあるし 
前の担当者は退職しちゃってるし 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 5
だけど、保守開発って大変ですよね(続き) 
ULS 
修正中に見つけた別の潜在バグは 
どうすりゃいいのよ? 
元のドキュメントがないのに、変更 
分をどこに書けばいいのよ? 
手間暇かけてテストする時間をど 
うやって作ればいいのよ? 
そもそも、ちゃんと動くのが当たり前だと、 
みんなが思ってること自体どうなのよ? 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 6
保守開発のデフレスパイラル 
ULS 
コードが 
よくわからない 
デグレードが起きる 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
手探りで修正する 
Proprietary & Confidential Powered by 7 
慌ててやっつけで 
修正する 
顧客や上司に 
怒られる 
さらにコードが 
わからなくる 
時間外に 
呼び出される 
人事評価が 
悪くなる 
仕事がどんどん 
つまらなくなる 
スキルが 
身につかない 
オーマイガッ
そんなデフレスパイラルから脱却するには 
ULS 
[対策1] 
きれいにリファクタリングする 
[対策2] 
単体テストを整備する 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 8
レガシーコードのジレンマ 
ULS 
安全にリファクタリングするためには 
先に単体テストを整備する必要がある。 
(しかし、レガシーコードの場合) 
単体テストを整備するためには 
先にリファクタリングする必要がある。 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 9 
その通り! 
オー、ノー
ということで、レガシーコード改善ガイド 
ULS 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
地味ながら 
ロングセラーになっ 
ています 
Proprietary & Confidential Powered by 10 
 原題 
Working Effectively with Legacy Code 
 著者 
マイケル・C・フェザーズ 
 発刊 
2004年9月(米国) 
2009年7月(日本) 
テストがないコードは 
レガシーコードだ! 
あなたも、Javaや.NETで 
レガシーコードを書いていませんか?
「レガシーコード改善ガイド」に書いてあること 
ULS 
1.レガシーコードをテストで保護する手法 
「レガシーコードのジレンマ」をすり抜けて、単体テ 
ストを整備するためのさまざまな手法 
2.レガシーコードと闘うための技術大全 
コード修正に限らない、レガシーコードを退治する 
ための、ありとあらゆる技術 
3.レガシーコードとの闘いで得られる果実 
レガシーコードを改善することの意義と効果 
技術者にとっての価値 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 11
「レガシーコード改善ガイド」はTDDケンカ本だ! 
例えるなら、TDD本がリング上で行われるボクシングの試合につ 
いて記した本であるのに対し、本書は街のケンカについて記した 
本である。 
TDD本が構え方、ステップ、ジャブの打ち方について解説してい 
るのに対し、本書は相手が目潰しのために砂を投げてきた時にど 
うするか、刃物を出してきたらどうするか、といった類の、綺麗事 
だけではすまされない様々な現実的な状況への対処方法が例示 
されている。 
いわばTDDケンカ本である。 
ULS 
小野和俊さんのブログ 
(2012年10月1日のエントリー) 
からの引用 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 12
ULS 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 13 
アジェンダ 
保守開発のデフレスパイラル 
レガシーコードをテストで保護する手法 
レガシーコードと闘うための技術大全 
レガシーコードとの闘いで得られる果実 
翻訳時のこぼれ話 
おわりに
レガシーコードのジレンマへの対処方法(その1) 
ULS 
リファクタリングの前に 
単体テストを整備したい 
単体テストを整備する前に 
リファクタリングしたい 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 14 
レガシーコードのジレンマ 
対処方法(その1) 
リファクタリングせずに 
強引に単体テストを整 
備する 
きちんとリファクタリン 
グする
リファクタリングせずに単体テストを整備する手法例(1) 
ULS 
スプラウトメソッド/ スプラウトクラス 
Sprout Method / Sprout Class 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 15 
–状況 
機能を追加する際に、汚い既存のコードには極力手を加えたくない。 
–対処法 
追加機能を独立したメソッドやクラスとして作り、既存のコードには新し 
いコードを呼び出すロジックだけ追加する。 
単体テストは新しく書いたコードにだけ整備し、既存コードのテストはひ 
とまずあきらめる。 
既存の汚いコード 
既存の汚いコード 
スプラウトメソッド 
[before] [after] 
ここだけ単体テスト 
を整備する
リファクタリングせずに単体テストを整備する手法例(2) 
ULS 
Nullを渡す 
Pass Null 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 16 
–状況 
テストしたいメソッドが、生成しづらいオブジェクトを引数に 
取るため、テストコードを書けない。 
–対処法 
引数にNullを渡す。それでテストが動いたら結果オーライ。 
テストしたいメソッド 
生成しづらい 
オブジェクト 
テストしたいメソッド 
Null 
[before] [after]
レガシーコードのジレンマへの対処方法(その2) 
ULS 
レガシーコードのジレンマ 
リファクタリングの前に 
単体テストを整備したい 
単体テストを整備する前に 
リファクタリングしたい 
ジレンマへの対処方法(その2) 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 17 
単体テストを書ける 
ように、最低限のリ 
ファクタリングを行う 
単体テストを整備す 
る 
きちんとリファクタリ 
ングする 
追加のステップ
単体テストを書くためのリファクタリング手法例(1) 
ULS 
静的メソッドの公開 
Expose Static Method 
テスト対象クラステスト対象クラス 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 18 
–状況 
インスタンス生成は困難だが、テストしたいメソッドはインスタンス変数や 
他のインスタンスメソッドを使っていない。 
–対処法 
テストしたいメソッドをstaticメソッドに変えてしまう 
インスタンスメソッドstaticメソッド 
[before] [after]
単体テストを書くためのリファクタリング手法例(2) 
ULS 
テスト対象クラス 
インスタンス変数の入れ替え 
Supersede Instance Variable 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 19 
–状況 
内部で生成しているオブジェクトが邪魔な実処理を行っているため、単 
体テストを書けない。 
–対処法 
テストのためのsetterを追加して、実処理を行う邪魔なオブジェクトを強 
引にダミーに置き換える 
テスト対象クラス 
邪魔なインスタンス邪魔なインスタンス 
テスト用setter 
[before] [after]
単体テストを書くためのリファクタリング手法例(3) 
ULS 
インタフェースの抽出 
Extract Interface 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 20 
–状況 
 メソッドの引数に指定する邪魔なオブジェクトのせいで、単体テストを書 
けない。 
–対処法 
引数に指定するオブジェクト用のインタフェースを定義して、シグニチャ 
を置き換える。 
単体テストでは、テスト用オブジェクトに置き換える。 
[before] [after]
単体テストを書くためのリファクタリング手法例(4) 
ULS 
呼び出しの抽出とオーバーライド 
Extract and Override Call 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 21 
–状況 
 メソッドの内部に邪魔な処理があるために単体テストを書けない。 
–対処法 
邪魔な処理をメソッドに切り出す。 
テスト用のサブクラスを定義して、邪魔な処理をオーバーライドする。 
[before] [after]
ULS 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 22 
アジェンダ 
保守開発のデフレスパイラル 
レガシーコードをテストで保護する手法 
レガシーコードと闘うための技術大全 
レガシーコードとの闘いで得られる果実 
翻訳時のこぼれ話 
おわりに
レガシーコードを解読するためのさまざまな手法(1) 
ULS 
仕様化テスト 
Characterization Test 
–既存のコードをそのまま動かすテストケースを書いて 
動作を把握する。 
–そのテストケースはドキュメントとして扱う。 
試行リファクタリング 
Scratch Refactoring 
–コードを理解するために自由にリファクタリングする。 
–ただし修正したコードはチェックインせず破棄する。 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 23
レガシーコードを解読するためのさまざまな手法例(2) 
ULS 
メソッド分類法 
Method Grouping 
–巨大なクラスに定義されているメソッドを、名前とアク 
セス属性で分類することで、責務を把握する 
evaluate branchingExpression 
causalExpression 
variableExpression 
valueExpression 
nextTerm 
hasMoreTerms 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
addVariable 
Proprietary & Confidential Powered by 24
レガシーコードを解読するためのさまざまな手法(3) 
ULS 
機能スケッチ 
Feature Sketch 
–レガシーコードを解読する際に、メソッドの呼び出しや 
変数へのアクセスの関係を図に描いてみる 
duration extend() 
dailyRate 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
extendForWork() 
Proprietary & Confidential Powered by 25 
getPrincipalFee() 
getTotalFee()
レガシーコードを解読するためのさまざまな手法(4) 
ULS 
白紙のCRC 
Naked CRC 
–白紙のカードをオブジェクトに見立てて、それを動かし 
ながら、設計内容を複数のメンバーで議論する 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 26
レガシーコードと闘うためのその他の技術(1) 
ULS 
コンパイラまかせ 
Lean on the Compiler 
–力作業は自分で行わず、コンパイラにまかせる 
ペアプログラミング 
Pair Programming 
–間違いを防止するために、二人で作業する 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 27
レガシーコードと闘うためのその他の技術(2) 
ULS 
超集中編集 
Hyperaware Editing 
–世界をシャットアウトし、レガシーコードとの闘いに没 
頭できる状態にして作業を行う。 
心頭滅却すれば 
火もまた涼し 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 28
ULS 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 29 
アジェンダ 
保守開発のデフレスパイラル 
レガシーコードをテストで保護する手法 
レガシーコードと闘うための技術大全 
レガシーコードとの闘いで得られる果実 
翻訳時のこぼれ話 
おわりに
コードが自然にきれいになる 
単体テストを整備すると、クラスやメソッドの独立 
性が高くなる 
コードがどんどんきれいになる 
ULS 
–依存関係を排除することで、テスト対象クラスやメソッ 
ドの凝集度が上がり、結合度が下がる 
–単体テストを整備する作業を繰り返すと、テストコード 
が整備されるだけでなく、優れたコードのオアシスが 
できてくる 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 30
ULS 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 31 
技術者にとってのメリット 
隣の新規開発の芝はそれほど青くない 
–新規開発プロジェクトはデスマーチになりがち 
実践的な設計スキルが身につく 
–具体的なコードを前提に作業するので、設計のトレー 
ドオフ判断がしやすい 
–すぐにリリースするため、フィードバックを早く得られる 
レガシーコードとの闘いは意外と楽しい 
–少しずつ改善して、優れたコードの 
オアシスを広げていく充実感
ULS 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 32 
アジェンダ 
保守開発のデフレスパイラル 
レガシーコードをテストで保護する手法 
レガシーコードと闘うための技術大全 
レガシーコードとの闘いで得られる果実 
翻訳時のこぼれ話 
おわりに
ULS 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 33 
翻訳時のこぼれ話(1) 
レガシーなのにCOBOLが出てこないなんて! 
–2004年冬に、某出版社さんから翻訳を 
打診されましたが、そのときは断っちゃいました 
当時の感覚では、Javaでレガシーはないなと。
ULS 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 34 
翻訳時のこぼれ話(2) 
翻訳作業中に原書の読書会を発見! 
–猛者たちが集う、濃いコミュニティだったので、 
出版後にこっぴどく批判されることを心配しました(笑) 
–で、おそるおそる読書会に参加して、翻訳作業への協 
力を依頼したところ、快く対応していただきました。 
貢献していただいたこと 
– 原稿の査読 
– 質問や嘆きを表現した第2部の章タイトルの日本語表現 
– 「レガシーコード改善ガイド」というタイトルの命名
ULS 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 35 
アジェンダ 
保守開発のデフレスパイラル 
レガシーコードをテストで保護する手法 
レガシーコードと闘うための技術大全 
レガシーコードとの闘いで得られる果実 
翻訳時のこぼれ話 
おわりに
保守開発のデフレスパイラル 
ULS 
コードが 
よくわからない 
デグレードが起きる 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
手探りで修正する 
Proprietary & Confidential Powered by 36 
慌ててやっつけで 
修正する 
顧客や上司に 
怒られる 
さらにコードが 
わからなくる 
時間外に 
呼び出される 
人事評価が 
悪くなる 
仕事がどんどん 
つまらなくなる 
スキルが 
身につかない 
オーマイガッ
レガシーコード改善技術を身につけて 
保守開発のデフレスパイラル 
余裕を持ってリファク 
ULS 
デグレードが起こら 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
ない 
Proprietary & Confidential Powered by 37 
設計スキルが 
上がる 
顧客や上司に 
褒められる 
コードがどんどん 
きれいになる 
デート中に 
呼び出されない 
給料が上がる 
仕事がどんどん 
楽しくなる 
レガシーコード改善 
技術を身につけると 
タリングできる 
確信を持って 
修正できる 
保守開発を楽しもう!
ULS 
おしまい! 
Copyright © 2014 UL Systems, Inc. All rights reserved. 
Proprietary & Confidential Powered by 38

Weitere ähnliche Inhalte

Was ist angesagt?

分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれKumazaki Hiroki
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐりKazuyuki TAKASE
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)Mikiya Okuno
 
マイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦いマイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦いota42y
 
20190828 AWS Black Belt Online Seminar Amazon Aurora with PostgreSQL Compatib...
20190828 AWS Black Belt Online Seminar Amazon Aurora with PostgreSQL Compatib...20190828 AWS Black Belt Online Seminar Amazon Aurora with PostgreSQL Compatib...
20190828 AWS Black Belt Online Seminar Amazon Aurora with PostgreSQL Compatib...Amazon Web Services Japan
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Taku Miyakawa
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところY Watanabe
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなKentaro Matsui
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法についてYuji Otani
 
私にとってのテスト
私にとってのテスト私にとってのテスト
私にとってのテストTakuto Wada
 
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティスAmazon Web Services Japan
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugItsuki Kuroda
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門泰 増田
 
Amazon Aurora - Auroraの止まらない進化とその中身
Amazon Aurora - Auroraの止まらない進化とその中身Amazon Aurora - Auroraの止まらない進化とその中身
Amazon Aurora - Auroraの止まらない進化とその中身Amazon Web Services Japan
 
MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法yoku0825
 

Was ist angesagt? (20)

分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれ
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
マイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦いマイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦い
 
20190828 AWS Black Belt Online Seminar Amazon Aurora with PostgreSQL Compatib...
20190828 AWS Black Belt Online Seminar Amazon Aurora with PostgreSQL Compatib...20190828 AWS Black Belt Online Seminar Amazon Aurora with PostgreSQL Compatib...
20190828 AWS Black Belt Online Seminar Amazon Aurora with PostgreSQL Compatib...
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 
私にとってのテスト
私にとってのテスト私にとってのテスト
私にとってのテスト
 
Paxos
PaxosPaxos
Paxos
 
Raft
RaftRaft
Raft
 
AWS Black Belt Online Seminar Amazon Aurora
AWS Black Belt Online Seminar Amazon AuroraAWS Black Belt Online Seminar Amazon Aurora
AWS Black Belt Online Seminar Amazon Aurora
 
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
 
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajpAt least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
 
Amazon Aurora - Auroraの止まらない進化とその中身
Amazon Aurora - Auroraの止まらない進化とその中身Amazon Aurora - Auroraの止まらない進化とその中身
Amazon Aurora - Auroraの止まらない進化とその中身
 
MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法
 

Andere mochten auch

レガシーコードとの付き合い方とテストでの話
レガシーコードとの付き合い方とテストでの話レガシーコードとの付き合い方とテストでの話
レガシーコードとの付き合い方とテストでの話H Iseri
 
テストとリファクタリングに関する深い方法論 #wewlc_jp
テストとリファクタリングに関する深い方法論 #wewlc_jpテストとリファクタリングに関する深い方法論 #wewlc_jp
テストとリファクタリングに関する深い方法論 #wewlc_jpkyon mm
 
Nyandoc: Scaladoc/Javadoc to markdown converter
Nyandoc: Scaladoc/Javadoc to markdown converterNyandoc: Scaladoc/Javadoc to markdown converter
Nyandoc: Scaladoc/Javadoc to markdown convertertod esking
 
「レガシーコード」とはいったい?
「レガシーコード」とはいったい?「レガシーコード」とはいったい?
「レガシーコード」とはいったい?Hiroyuki Ohnaka
 
精神論によるいきいきとした組織づくりのご提案
精神論によるいきいきとした組織づくりのご提案精神論によるいきいきとした組織づくりのご提案
精神論によるいきいきとした組織づくりのご提案tod esking
 
貧者のための入力デバイス
貧者のための入力デバイス貧者のための入力デバイス
貧者のための入力デバイスtod esking
 
概観テキストマイニング
概観テキストマイニング概観テキストマイニング
概観テキストマイニングtod esking
 
仕様変更で死なないためのユニットテスト
仕様変更で死なないためのユニットテスト仕様変更で死なないためのユニットテスト
仕様変更で死なないためのユニットテストtod esking
 

Andere mochten auch (8)

レガシーコードとの付き合い方とテストでの話
レガシーコードとの付き合い方とテストでの話レガシーコードとの付き合い方とテストでの話
レガシーコードとの付き合い方とテストでの話
 
テストとリファクタリングに関する深い方法論 #wewlc_jp
テストとリファクタリングに関する深い方法論 #wewlc_jpテストとリファクタリングに関する深い方法論 #wewlc_jp
テストとリファクタリングに関する深い方法論 #wewlc_jp
 
Nyandoc: Scaladoc/Javadoc to markdown converter
Nyandoc: Scaladoc/Javadoc to markdown converterNyandoc: Scaladoc/Javadoc to markdown converter
Nyandoc: Scaladoc/Javadoc to markdown converter
 
「レガシーコード」とはいったい?
「レガシーコード」とはいったい?「レガシーコード」とはいったい?
「レガシーコード」とはいったい?
 
精神論によるいきいきとした組織づくりのご提案
精神論によるいきいきとした組織づくりのご提案精神論によるいきいきとした組織づくりのご提案
精神論によるいきいきとした組織づくりのご提案
 
貧者のための入力デバイス
貧者のための入力デバイス貧者のための入力デバイス
貧者のための入力デバイス
 
概観テキストマイニング
概観テキストマイニング概観テキストマイニング
概観テキストマイニング
 
仕様変更で死なないためのユニットテスト
仕様変更で死なないためのユニットテスト仕様変更で死なないためのユニットテスト
仕様変更で死なないためのユニットテスト
 

Ähnlich wie レガシーコード改善のススメ

OpenStack Days Tokyo 2014のプレゼンテーション資料(モーフ・ラボ & アセアン・ラボ)
OpenStack Days Tokyo 2014のプレゼンテーション資料(モーフ・ラボ & アセアン・ラボ)OpenStack Days Tokyo 2014のプレゼンテーション資料(モーフ・ラボ & アセアン・ラボ)
OpenStack Days Tokyo 2014のプレゼンテーション資料(モーフ・ラボ & アセアン・ラボ)Satoshi Konno
 
モダンアジャイル - Agile Japan 2017 地方サテライト版 #agilejapan
モダンアジャイル - Agile Japan 2017 地方サテライト版 #agilejapanモダンアジャイル - Agile Japan 2017 地方サテライト版 #agilejapan
モダンアジャイル - Agile Japan 2017 地方サテライト版 #agilejapan満徳 関
 
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]David Buck
 
Ulsアジャイル推進室 エンタープライズアジャイルがやってくる! 20160312
Ulsアジャイル推進室 エンタープライズアジャイルがやってくる! 20160312Ulsアジャイル推進室 エンタープライズアジャイルがやってくる! 20160312
Ulsアジャイル推進室 エンタープライズアジャイルがやってくる! 20160312Shozaburo Yoshihara
 
CNNチュートリアル
CNNチュートリアルCNNチュートリアル
CNNチュートリアルIkuro Sato
 
ソフトウェア設計原則【SOLID】を学ぶ #3 依存性逆転の原則.pdf
ソフトウェア設計原則【SOLID】を学ぶ #3 依存性逆転の原則.pdfソフトウェア設計原則【SOLID】を学ぶ #3 依存性逆転の原則.pdf
ソフトウェア設計原則【SOLID】を学ぶ #3 依存性逆転の原則.pdf耕二 阿部
 
実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡
実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡
実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡心 谷本
 
[網元] WordPress 高速化チューニング AMI
[網元] WordPress 高速化チューニング AMI [網元] WordPress 高速化チューニング AMI
[網元] WordPress 高速化チューニング AMI Hiromichi Koga
 
スマートなシステム、スマートなディペンダビリティ保証-次世代システムを頼れるものへ
スマートなシステム、スマートなディペンダビリティ保証-次世代システムを頼れるものへスマートなシステム、スマートなディペンダビリティ保証-次世代システムを頼れるものへ
スマートなシステム、スマートなディペンダビリティ保証-次世代システムを頼れるものへFuyuki Ishikawa
 
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発慎一 古賀
 
【JaSST'11 Kansai】 開発者とテスト担当者に最適なコラボレーションと効率化を!
【JaSST'11 Kansai】 開発者とテスト担当者に最適なコラボレーションと効率化を!【JaSST'11 Kansai】 開発者とテスト担当者に最適なコラボレーションと効率化を!
【JaSST'11 Kansai】 開発者とテスト担当者に最適なコラボレーションと効率化を!智治 長沢
 
いまさらアジャイル巡業 In Tokyo アジャイルモデリング
いまさらアジャイル巡業 In Tokyo アジャイルモデリングいまさらアジャイル巡業 In Tokyo アジャイルモデリング
いまさらアジャイル巡業 In Tokyo アジャイルモデリングYuki Tagami
 
DBTS2015 Tokyo DBAが知っておくべき最新テクノロジー
DBTS2015 Tokyo DBAが知っておくべき最新テクノロジーDBTS2015 Tokyo DBAが知っておくべき最新テクノロジー
DBTS2015 Tokyo DBAが知っておくべき最新テクノロジーMasaya Ishikawa
 
エンタープライズへのアジャイル開発の導入事例
エンタープライズへのアジャイル開発の導入事例エンタープライズへのアジャイル開発の導入事例
エンタープライズへのアジャイル開発の導入事例Shozaburo Yoshihara
 
Coldfusionを活かすシステム企画をリーンスタートアップに学ぶ
Coldfusionを活かすシステム企画をリーンスタートアップに学ぶColdfusionを活かすシステム企画をリーンスタートアップに学ぶ
Coldfusionを活かすシステム企画をリーンスタートアップに学ぶmasashi takehara
 
[db tech showcase Tokyo 2015] C17:MySQL Cluster ユーザー事例紹介~JR東日本情報システム様における導入事例...
[db tech showcase Tokyo 2015] C17:MySQL Cluster ユーザー事例紹介~JR東日本情報システム様における導入事例...[db tech showcase Tokyo 2015] C17:MySQL Cluster ユーザー事例紹介~JR東日本情報システム様における導入事例...
[db tech showcase Tokyo 2015] C17:MySQL Cluster ユーザー事例紹介~JR東日本情報システム様における導入事例...Insight Technology, Inc.
 
クラウドファースト時代のAWS活用事例と今後の展望 - AWS Cloud Storage & DB Day 2014
クラウドファースト時代のAWS活用事例と今後の展望 - AWS Cloud Storage & DB Day 2014 クラウドファースト時代のAWS活用事例と今後の展望 - AWS Cloud Storage & DB Day 2014
クラウドファースト時代のAWS活用事例と今後の展望 - AWS Cloud Storage & DB Day 2014 Takayuki Enomoto
 
Androidテスティング実践3 ユニットテスト・CI編
Androidテスティング実践3 ユニットテスト・CI編Androidテスティング実践3 ユニットテスト・CI編
Androidテスティング実践3 ユニットテスト・CI編株式会社 NTTテクノクロス
 

Ähnlich wie レガシーコード改善のススメ (20)

OpenStack Days Tokyo 2014のプレゼンテーション資料(モーフ・ラボ & アセアン・ラボ)
OpenStack Days Tokyo 2014のプレゼンテーション資料(モーフ・ラボ & アセアン・ラボ)OpenStack Days Tokyo 2014のプレゼンテーション資料(モーフ・ラボ & アセアン・ラボ)
OpenStack Days Tokyo 2014のプレゼンテーション資料(モーフ・ラボ & アセアン・ラボ)
 
モダンアジャイル - Agile Japan 2017 地方サテライト版 #agilejapan
モダンアジャイル - Agile Japan 2017 地方サテライト版 #agilejapanモダンアジャイル - Agile Japan 2017 地方サテライト版 #agilejapan
モダンアジャイル - Agile Japan 2017 地方サテライト版 #agilejapan
 
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
 
Ulsアジャイル推進室 エンタープライズアジャイルがやってくる! 20160312
Ulsアジャイル推進室 エンタープライズアジャイルがやってくる! 20160312Ulsアジャイル推進室 エンタープライズアジャイルがやってくる! 20160312
Ulsアジャイル推進室 エンタープライズアジャイルがやってくる! 20160312
 
CNNチュートリアル
CNNチュートリアルCNNチュートリアル
CNNチュートリアル
 
ソフトウェア設計原則【SOLID】を学ぶ #3 依存性逆転の原則.pdf
ソフトウェア設計原則【SOLID】を学ぶ #3 依存性逆転の原則.pdfソフトウェア設計原則【SOLID】を学ぶ #3 依存性逆転の原則.pdf
ソフトウェア設計原則【SOLID】を学ぶ #3 依存性逆転の原則.pdf
 
実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡
実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡
実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡
 
[網元] WordPress 高速化チューニング AMI
[網元] WordPress 高速化チューニング AMI [網元] WordPress 高速化チューニング AMI
[網元] WordPress 高速化チューニング AMI
 
スマートなシステム、スマートなディペンダビリティ保証-次世代システムを頼れるものへ
スマートなシステム、スマートなディペンダビリティ保証-次世代システムを頼れるものへスマートなシステム、スマートなディペンダビリティ保証-次世代システムを頼れるものへ
スマートなシステム、スマートなディペンダビリティ保証-次世代システムを頼れるものへ
 
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
 
【JaSST'11 Kansai】 開発者とテスト担当者に最適なコラボレーションと効率化を!
【JaSST'11 Kansai】 開発者とテスト担当者に最適なコラボレーションと効率化を!【JaSST'11 Kansai】 開発者とテスト担当者に最適なコラボレーションと効率化を!
【JaSST'11 Kansai】 開発者とテスト担当者に最適なコラボレーションと効率化を!
 
Androidテスティング実践2 システムテスト編
Androidテスティング実践2 システムテスト編Androidテスティング実践2 システムテスト編
Androidテスティング実践2 システムテスト編
 
いまさらアジャイル巡業 In Tokyo アジャイルモデリング
いまさらアジャイル巡業 In Tokyo アジャイルモデリングいまさらアジャイル巡業 In Tokyo アジャイルモデリング
いまさらアジャイル巡業 In Tokyo アジャイルモデリング
 
DBTS2015 Tokyo DBAが知っておくべき最新テクノロジー
DBTS2015 Tokyo DBAが知っておくべき最新テクノロジーDBTS2015 Tokyo DBAが知っておくべき最新テクノロジー
DBTS2015 Tokyo DBAが知っておくべき最新テクノロジー
 
July techfesta2014 f30
July techfesta2014 f30July techfesta2014 f30
July techfesta2014 f30
 
エンタープライズへのアジャイル開発の導入事例
エンタープライズへのアジャイル開発の導入事例エンタープライズへのアジャイル開発の導入事例
エンタープライズへのアジャイル開発の導入事例
 
Coldfusionを活かすシステム企画をリーンスタートアップに学ぶ
Coldfusionを活かすシステム企画をリーンスタートアップに学ぶColdfusionを活かすシステム企画をリーンスタートアップに学ぶ
Coldfusionを活かすシステム企画をリーンスタートアップに学ぶ
 
[db tech showcase Tokyo 2015] C17:MySQL Cluster ユーザー事例紹介~JR東日本情報システム様における導入事例...
[db tech showcase Tokyo 2015] C17:MySQL Cluster ユーザー事例紹介~JR東日本情報システム様における導入事例...[db tech showcase Tokyo 2015] C17:MySQL Cluster ユーザー事例紹介~JR東日本情報システム様における導入事例...
[db tech showcase Tokyo 2015] C17:MySQL Cluster ユーザー事例紹介~JR東日本情報システム様における導入事例...
 
クラウドファースト時代のAWS活用事例と今後の展望 - AWS Cloud Storage & DB Day 2014
クラウドファースト時代のAWS活用事例と今後の展望 - AWS Cloud Storage & DB Day 2014 クラウドファースト時代のAWS活用事例と今後の展望 - AWS Cloud Storage & DB Day 2014
クラウドファースト時代のAWS活用事例と今後の展望 - AWS Cloud Storage & DB Day 2014
 
Androidテスティング実践3 ユニットテスト・CI編
Androidテスティング実践3 ユニットテスト・CI編Androidテスティング実践3 ユニットテスト・CI編
Androidテスティング実践3 ユニットテスト・CI編
 

レガシーコード改善のススメ

  • 1. ULS レガシーコード改善のススメ ~保守開発を楽しくする技術を身につけよう~ Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 2014/9/27 ウルシステムズ株式会社 平澤章 http://www.ulsystems.co.jp mailto:info@ulsystems.co.jp Tel: 03-6220-1420 Fax: 03-6220-1402
  • 2. 自己紹介 平澤章(ひらさわあきら) ULS – 35才の時に生涯一技術者として身を立てると決意したが、 浮き世のしがらみもあり、若干不本意に思いつつも ここ数年は中間管理職としての会社生活を楽しんでいる。 [著書] [翻訳書- すべて共訳] Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 1 ウルシステムズ株式会社 – 企業の戦略的ITに特化したIT技術者集団 – 技術ブログ – http://enterprisegeeks.hatenablog.com/ エンタープライズギークス検索
  • 3. ULS Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 2 アジェンダ 保守開発のデフレスパイラル レガシーコードをテストで保護する手法 レガシーコードと闘うための技術大全 レガシーコードとの闘いで得られる果実 翻訳時のこぼれ話 おわりに
  • 4. ULS Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 3 皆さんに質問です 今、どんな仕事をしていますか? 新規開発の仕事をしている人 保守開発や運用の仕事をしている人 開発以外の仕事をしている人 仕事をしていない人 この質問には答えたくない人(笑)
  • 5. 最近、保守開発が増えたと思いませんか? ULS ERPでなんとかなるなら、無理して スクラッチ開発なんかしないでしょ メインフレームのアプリは、 2000年代前半にJava や.NETで作り替えちゃったし ゼロから全部作り替えたいけど、 お金と時間がもったいないでしょ そんなこんなで保守開発が主流に Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 4
  • 6. だけど、保守開発って大変ですよね ULS ソースコードはひどいし テストコードなんてもちろんないし まともなドキュメントは残ってないし あっても嘘ばっかり書いてあるし 前の担当者は退職しちゃってるし Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 5
  • 7. だけど、保守開発って大変ですよね(続き) ULS 修正中に見つけた別の潜在バグは どうすりゃいいのよ? 元のドキュメントがないのに、変更 分をどこに書けばいいのよ? 手間暇かけてテストする時間をど うやって作ればいいのよ? そもそも、ちゃんと動くのが当たり前だと、 みんなが思ってること自体どうなのよ? Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 6
  • 8. 保守開発のデフレスパイラル ULS コードが よくわからない デグレードが起きる Copyright © 2014 UL Systems, Inc. All rights reserved. 手探りで修正する Proprietary & Confidential Powered by 7 慌ててやっつけで 修正する 顧客や上司に 怒られる さらにコードが わからなくる 時間外に 呼び出される 人事評価が 悪くなる 仕事がどんどん つまらなくなる スキルが 身につかない オーマイガッ
  • 9. そんなデフレスパイラルから脱却するには ULS [対策1] きれいにリファクタリングする [対策2] 単体テストを整備する Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 8
  • 10. レガシーコードのジレンマ ULS 安全にリファクタリングするためには 先に単体テストを整備する必要がある。 (しかし、レガシーコードの場合) 単体テストを整備するためには 先にリファクタリングする必要がある。 Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 9 その通り! オー、ノー
  • 11. ということで、レガシーコード改善ガイド ULS Copyright © 2014 UL Systems, Inc. All rights reserved. 地味ながら ロングセラーになっ ています Proprietary & Confidential Powered by 10  原題 Working Effectively with Legacy Code  著者 マイケル・C・フェザーズ  発刊 2004年9月(米国) 2009年7月(日本) テストがないコードは レガシーコードだ! あなたも、Javaや.NETで レガシーコードを書いていませんか?
  • 12. 「レガシーコード改善ガイド」に書いてあること ULS 1.レガシーコードをテストで保護する手法 「レガシーコードのジレンマ」をすり抜けて、単体テ ストを整備するためのさまざまな手法 2.レガシーコードと闘うための技術大全 コード修正に限らない、レガシーコードを退治する ための、ありとあらゆる技術 3.レガシーコードとの闘いで得られる果実 レガシーコードを改善することの意義と効果 技術者にとっての価値 Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 11
  • 13. 「レガシーコード改善ガイド」はTDDケンカ本だ! 例えるなら、TDD本がリング上で行われるボクシングの試合につ いて記した本であるのに対し、本書は街のケンカについて記した 本である。 TDD本が構え方、ステップ、ジャブの打ち方について解説してい るのに対し、本書は相手が目潰しのために砂を投げてきた時にど うするか、刃物を出してきたらどうするか、といった類の、綺麗事 だけではすまされない様々な現実的な状況への対処方法が例示 されている。 いわばTDDケンカ本である。 ULS 小野和俊さんのブログ (2012年10月1日のエントリー) からの引用 Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 12
  • 14. ULS Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 13 アジェンダ 保守開発のデフレスパイラル レガシーコードをテストで保護する手法 レガシーコードと闘うための技術大全 レガシーコードとの闘いで得られる果実 翻訳時のこぼれ話 おわりに
  • 15. レガシーコードのジレンマへの対処方法(その1) ULS リファクタリングの前に 単体テストを整備したい 単体テストを整備する前に リファクタリングしたい Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 14 レガシーコードのジレンマ 対処方法(その1) リファクタリングせずに 強引に単体テストを整 備する きちんとリファクタリン グする
  • 16. リファクタリングせずに単体テストを整備する手法例(1) ULS スプラウトメソッド/ スプラウトクラス Sprout Method / Sprout Class Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 15 –状況 機能を追加する際に、汚い既存のコードには極力手を加えたくない。 –対処法 追加機能を独立したメソッドやクラスとして作り、既存のコードには新し いコードを呼び出すロジックだけ追加する。 単体テストは新しく書いたコードにだけ整備し、既存コードのテストはひ とまずあきらめる。 既存の汚いコード 既存の汚いコード スプラウトメソッド [before] [after] ここだけ単体テスト を整備する
  • 17. リファクタリングせずに単体テストを整備する手法例(2) ULS Nullを渡す Pass Null Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 16 –状況 テストしたいメソッドが、生成しづらいオブジェクトを引数に 取るため、テストコードを書けない。 –対処法 引数にNullを渡す。それでテストが動いたら結果オーライ。 テストしたいメソッド 生成しづらい オブジェクト テストしたいメソッド Null [before] [after]
  • 18. レガシーコードのジレンマへの対処方法(その2) ULS レガシーコードのジレンマ リファクタリングの前に 単体テストを整備したい 単体テストを整備する前に リファクタリングしたい ジレンマへの対処方法(その2) Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 17 単体テストを書ける ように、最低限のリ ファクタリングを行う 単体テストを整備す る きちんとリファクタリ ングする 追加のステップ
  • 19. 単体テストを書くためのリファクタリング手法例(1) ULS 静的メソッドの公開 Expose Static Method テスト対象クラステスト対象クラス Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 18 –状況 インスタンス生成は困難だが、テストしたいメソッドはインスタンス変数や 他のインスタンスメソッドを使っていない。 –対処法 テストしたいメソッドをstaticメソッドに変えてしまう インスタンスメソッドstaticメソッド [before] [after]
  • 20. 単体テストを書くためのリファクタリング手法例(2) ULS テスト対象クラス インスタンス変数の入れ替え Supersede Instance Variable Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 19 –状況 内部で生成しているオブジェクトが邪魔な実処理を行っているため、単 体テストを書けない。 –対処法 テストのためのsetterを追加して、実処理を行う邪魔なオブジェクトを強 引にダミーに置き換える テスト対象クラス 邪魔なインスタンス邪魔なインスタンス テスト用setter [before] [after]
  • 21. 単体テストを書くためのリファクタリング手法例(3) ULS インタフェースの抽出 Extract Interface Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 20 –状況  メソッドの引数に指定する邪魔なオブジェクトのせいで、単体テストを書 けない。 –対処法 引数に指定するオブジェクト用のインタフェースを定義して、シグニチャ を置き換える。 単体テストでは、テスト用オブジェクトに置き換える。 [before] [after]
  • 22. 単体テストを書くためのリファクタリング手法例(4) ULS 呼び出しの抽出とオーバーライド Extract and Override Call Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 21 –状況  メソッドの内部に邪魔な処理があるために単体テストを書けない。 –対処法 邪魔な処理をメソッドに切り出す。 テスト用のサブクラスを定義して、邪魔な処理をオーバーライドする。 [before] [after]
  • 23. ULS Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 22 アジェンダ 保守開発のデフレスパイラル レガシーコードをテストで保護する手法 レガシーコードと闘うための技術大全 レガシーコードとの闘いで得られる果実 翻訳時のこぼれ話 おわりに
  • 24. レガシーコードを解読するためのさまざまな手法(1) ULS 仕様化テスト Characterization Test –既存のコードをそのまま動かすテストケースを書いて 動作を把握する。 –そのテストケースはドキュメントとして扱う。 試行リファクタリング Scratch Refactoring –コードを理解するために自由にリファクタリングする。 –ただし修正したコードはチェックインせず破棄する。 Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 23
  • 25. レガシーコードを解読するためのさまざまな手法例(2) ULS メソッド分類法 Method Grouping –巨大なクラスに定義されているメソッドを、名前とアク セス属性で分類することで、責務を把握する evaluate branchingExpression causalExpression variableExpression valueExpression nextTerm hasMoreTerms Copyright © 2014 UL Systems, Inc. All rights reserved. addVariable Proprietary & Confidential Powered by 24
  • 26. レガシーコードを解読するためのさまざまな手法(3) ULS 機能スケッチ Feature Sketch –レガシーコードを解読する際に、メソッドの呼び出しや 変数へのアクセスの関係を図に描いてみる duration extend() dailyRate Copyright © 2014 UL Systems, Inc. All rights reserved. extendForWork() Proprietary & Confidential Powered by 25 getPrincipalFee() getTotalFee()
  • 27. レガシーコードを解読するためのさまざまな手法(4) ULS 白紙のCRC Naked CRC –白紙のカードをオブジェクトに見立てて、それを動かし ながら、設計内容を複数のメンバーで議論する Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 26
  • 28. レガシーコードと闘うためのその他の技術(1) ULS コンパイラまかせ Lean on the Compiler –力作業は自分で行わず、コンパイラにまかせる ペアプログラミング Pair Programming –間違いを防止するために、二人で作業する Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 27
  • 29. レガシーコードと闘うためのその他の技術(2) ULS 超集中編集 Hyperaware Editing –世界をシャットアウトし、レガシーコードとの闘いに没 頭できる状態にして作業を行う。 心頭滅却すれば 火もまた涼し Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 28
  • 30. ULS Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 29 アジェンダ 保守開発のデフレスパイラル レガシーコードをテストで保護する手法 レガシーコードと闘うための技術大全 レガシーコードとの闘いで得られる果実 翻訳時のこぼれ話 おわりに
  • 31. コードが自然にきれいになる 単体テストを整備すると、クラスやメソッドの独立 性が高くなる コードがどんどんきれいになる ULS –依存関係を排除することで、テスト対象クラスやメソッ ドの凝集度が上がり、結合度が下がる –単体テストを整備する作業を繰り返すと、テストコード が整備されるだけでなく、優れたコードのオアシスが できてくる Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 30
  • 32. ULS Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 31 技術者にとってのメリット 隣の新規開発の芝はそれほど青くない –新規開発プロジェクトはデスマーチになりがち 実践的な設計スキルが身につく –具体的なコードを前提に作業するので、設計のトレー ドオフ判断がしやすい –すぐにリリースするため、フィードバックを早く得られる レガシーコードとの闘いは意外と楽しい –少しずつ改善して、優れたコードの オアシスを広げていく充実感
  • 33. ULS Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 32 アジェンダ 保守開発のデフレスパイラル レガシーコードをテストで保護する手法 レガシーコードと闘うための技術大全 レガシーコードとの闘いで得られる果実 翻訳時のこぼれ話 おわりに
  • 34. ULS Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 33 翻訳時のこぼれ話(1) レガシーなのにCOBOLが出てこないなんて! –2004年冬に、某出版社さんから翻訳を 打診されましたが、そのときは断っちゃいました 当時の感覚では、Javaでレガシーはないなと。
  • 35. ULS Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 34 翻訳時のこぼれ話(2) 翻訳作業中に原書の読書会を発見! –猛者たちが集う、濃いコミュニティだったので、 出版後にこっぴどく批判されることを心配しました(笑) –で、おそるおそる読書会に参加して、翻訳作業への協 力を依頼したところ、快く対応していただきました。 貢献していただいたこと – 原稿の査読 – 質問や嘆きを表現した第2部の章タイトルの日本語表現 – 「レガシーコード改善ガイド」というタイトルの命名
  • 36. ULS Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 35 アジェンダ 保守開発のデフレスパイラル レガシーコードをテストで保護する手法 レガシーコードと闘うための技術大全 レガシーコードとの闘いで得られる果実 翻訳時のこぼれ話 おわりに
  • 37. 保守開発のデフレスパイラル ULS コードが よくわからない デグレードが起きる Copyright © 2014 UL Systems, Inc. All rights reserved. 手探りで修正する Proprietary & Confidential Powered by 36 慌ててやっつけで 修正する 顧客や上司に 怒られる さらにコードが わからなくる 時間外に 呼び出される 人事評価が 悪くなる 仕事がどんどん つまらなくなる スキルが 身につかない オーマイガッ
  • 38. レガシーコード改善技術を身につけて 保守開発のデフレスパイラル 余裕を持ってリファク ULS デグレードが起こら Copyright © 2014 UL Systems, Inc. All rights reserved. ない Proprietary & Confidential Powered by 37 設計スキルが 上がる 顧客や上司に 褒められる コードがどんどん きれいになる デート中に 呼び出されない 給料が上がる 仕事がどんどん 楽しくなる レガシーコード改善 技術を身につけると タリングできる 確信を持って 修正できる 保守開発を楽しもう!
  • 39. ULS おしまい! Copyright © 2014 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 38