SlideShare une entreprise Scribd logo
1  sur  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

Contenu connexe

Tendances

例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
SAT/SMTソルバの仕組み
SAT/SMTソルバの仕組みSAT/SMTソルバの仕組み
SAT/SMTソルバの仕組みMasahiro Sakai
 
【メタサーベイ】基盤モデル / Foundation Models
【メタサーベイ】基盤モデル / Foundation Models【メタサーベイ】基盤モデル / Foundation Models
【メタサーベイ】基盤モデル / Foundation Modelscvpaper. challenge
 
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Springドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring増田 亨
 
ChatGPT 人間のフィードバックから強化学習した対話AI
ChatGPT 人間のフィードバックから強化学習した対話AIChatGPT 人間のフィードバックから強化学習した対話AI
ChatGPT 人間のフィードバックから強化学習した対話AIShota Imai
 
テストとリファクタリングに関する深い方法論 #wewlc_jp
テストとリファクタリングに関する深い方法論 #wewlc_jpテストとリファクタリングに関する深い方法論 #wewlc_jp
テストとリファクタリングに関する深い方法論 #wewlc_jpkyon mm
 
45分間で「ユーザー中心のものづくり」ができるまで詰め込む
45分間で「ユーザー中心のものづくり」ができるまで詰め込む45分間で「ユーザー中心のものづくり」ができるまで詰め込む
45分間で「ユーザー中心のものづくり」ができるまで詰め込むYoshiki Hayama
 
なぜデータモデリングが重要なのか?
なぜデータモデリングが重要なのか?なぜデータモデリングが重要なのか?
なぜデータモデリングが重要なのか?Yoshitaka Kawashima
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメYoji Kanno
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなKentaro Matsui
 
「顧客の声を聞かない」とはどういうことか
「顧客の声を聞かない」とはどういうことか「顧客の声を聞かない」とはどういうことか
「顧客の声を聞かない」とはどういうことかYoshiki Hayama
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ増田 亨
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターンSoudai Sone
 
マスターデータの キャッシュシステムの改善の話
マスターデータの キャッシュシステムの改善の話マスターデータの キャッシュシステムの改善の話
マスターデータの キャッシュシステムの改善の話natsumi_ishizaka
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説murachue
 
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチYoshiki Hayama
 
私にとってのテスト
私にとってのテスト私にとってのテスト
私にとってのテストTakuto Wada
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるpospome
 
リーンなコードを書こう:実践的なオブジェクト指向設計
リーンなコードを書こう:実践的なオブジェクト指向設計リーンなコードを書こう:実践的なオブジェクト指向設計
リーンなコードを書こう:実践的なオブジェクト指向設計増田 亨
 

Tendances (20)

例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
SAT/SMTソルバの仕組み
SAT/SMTソルバの仕組みSAT/SMTソルバの仕組み
SAT/SMTソルバの仕組み
 
【メタサーベイ】基盤モデル / Foundation Models
【メタサーベイ】基盤モデル / Foundation Models【メタサーベイ】基盤モデル / Foundation Models
【メタサーベイ】基盤モデル / Foundation Models
 
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Springドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
 
ChatGPT 人間のフィードバックから強化学習した対話AI
ChatGPT 人間のフィードバックから強化学習した対話AIChatGPT 人間のフィードバックから強化学習した対話AI
ChatGPT 人間のフィードバックから強化学習した対話AI
 
テストとリファクタリングに関する深い方法論 #wewlc_jp
テストとリファクタリングに関する深い方法論 #wewlc_jpテストとリファクタリングに関する深い方法論 #wewlc_jp
テストとリファクタリングに関する深い方法論 #wewlc_jp
 
45分間で「ユーザー中心のものづくり」ができるまで詰め込む
45分間で「ユーザー中心のものづくり」ができるまで詰め込む45分間で「ユーザー中心のものづくり」ができるまで詰め込む
45分間で「ユーザー中心のものづくり」ができるまで詰め込む
 
なぜデータモデリングが重要なのか?
なぜデータモデリングが重要なのか?なぜデータモデリングが重要なのか?
なぜデータモデリングが重要なのか?
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
「顧客の声を聞かない」とはどういうことか
「顧客の声を聞かない」とはどういうことか「顧客の声を聞かない」とはどういうことか
「顧客の声を聞かない」とはどういうことか
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
 
マスターデータの キャッシュシステムの改善の話
マスターデータの キャッシュシステムの改善の話マスターデータの キャッシュシステムの改善の話
マスターデータの キャッシュシステムの改善の話
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
 
私にとってのテスト
私にとってのテスト私にとってのテスト
私にとってのテスト
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
 
リーンなコードを書こう:実践的なオブジェクト指向設計
リーンなコードを書こう:実践的なオブジェクト指向設計リーンなコードを書こう:実践的なオブジェクト指向設計
リーンなコードを書こう:実践的なオブジェクト指向設計
 

En vedette

レガシーコードとの付き合い方とテストでの話
レガシーコードとの付き合い方とテストでの話レガシーコードとの付き合い方とテストでの話
レガシーコードとの付き合い方とテストでの話H Iseri
 
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
 

En vedette (7)

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

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

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テクノクロス
 

Similaire à レガシーコード改善のススメ (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