レガシーコード改善のススメ
Upcoming SlideShare
Loading in...5
×
 

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

on

  • 426 views

レガシーコード改善勉強会(2014/9/27@ヤフーさん)の講演資料です。

レガシーコード改善勉強会(2014/9/27@ヤフーさん)の講演資料です。

Statistics

Views

Total Views
426
Views on SlideShare
335
Embed Views
91

Actions

Likes
3
Downloads
2
Comments
0

3 Embeds 91

http://enterprisegeeks.hatenablog.com 73
https://twitter.com 17
http://www.slideee.com 1

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

  • 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