InfoQ

InfoQ

News

マイブックマーク

ブックマークするためにログイン または 会員登録 する

ブックマークされました!

ブックマークがエラーになりました。もう一度お願いします。

リファクタリングかリライトか?

作者 Vikas Hazrati , 翻訳者 和智 右桂 投稿日 2009年12月1日

セクション
プロセス/プラクティス,
設計/アーキテクチャ
トピック
設計 ,
Agile ,
Delivering Value
タグ
Refactoring

原文(投稿日:2009/11/24)へのリンク

リファクタリングやリライトの目的は、コードの可読性、構造、明確さを改善することでシステムの健全さを改善する点にある。クリーンなコードはメンテナンスもエンハンスも楽だろう。しかし、多くの状況下にて、アジャイルチームはリファクタリングとリライトのどちらを行うかで厳しい選択を迫られる。

Michael Dubakov氏は、コードベースが時と共に劣化する理由として、以下のものを示している。

  • 次々と増加する機能 これにより複雑さが増加します。
  • 近道とハック これは「この手の込んだ検索が8月までに必要なんだ。以上!」的な機能をサポートするために行われます。
  • 開発者のローテーション 新しい開発者はアーキテクチャの背後にある本質的な決定とアイデアを、全て知っている訳ではありません。変化に合わせて知識が失われていくのは避けられないのです。
  • 開発チームの拡大 人が増えると、コミュニケーションが減ります。コミュニケーションが減ると、悪い決定がなされます。

Dubakov氏によれば、リファクタリングとリライトをすることでよりクリーンなコードにたどり着くけれども、どちらのテクニックも既存のシステムにカオスをもたらす。リファクタリングは少しずつ行う活動なので、一度にシステムのある部分だけに触れることになる。これは局所的に見ればカオスを生み出すのであり、またカオスを含みやすいとも言えるだろう。一方で、リライトはより侵略的な変更であり、システムにより大きなカオスをもたらす。インパクトはより広範囲にわたるので、リライトが安定するまでにかかる期間("stabilization period")はリファクタリングよりもはるかに長くかかる。

リライトの間も古いシステムは残っているので、カオスが絶えず存在することになります。公のリリースの後では、カオスは無視できないほど増加します。多くの新しいバグや不具合(と古いバグや不具合)が想定されますので、安定するまでにかかる期間は長くなります。

 

Peter Schuh氏はしばしば複数のチームが異なる単語を置き換え可能なものとして使用し、それがさらなる混乱とカオスを生み出す結果になると言う。リライトがリファクタリングに比べてリスクの高い提案であることをチームは理解すべきであり、したがって用語法もそれに従って用いられなければならないのだ。氏はこう語っている。

これは意味論にすぎません。そう、誰かが傷つくまでは意味論にすぎないのです。コードをリライトすることにはリスクが伴いますし、時として苦痛を伴う努力です。常にうまくいく訳ではありません。もし私たちがリライトを行いつつそれをリファクタリングと呼び、全てが失敗に終わったら、ビジネス側の人は誰も立ち止まって意味論について考えたりはしないでしょう。次にリファクタリングという単語を聞いた時に縮み上がるだけなのです。

Guido A.J. Stevens氏は興味深い観察をしている。氏によれば、問題はリファクタリングとリライトの間にあるのではない。問題はリファクタリングだけをするか、リファクタリングとリライトを両方するかにあるのだ。チームがシステムをリライトすると決定した時でさえ、最終的には2つのシステムが平行して走ることになる。古いシステムにはリファクタリングが必要だろうし、新しいシステムはリライトされることになる。この2つの組み合わせはあまりに複雑なタスクだ。氏の言葉を引用する。

衰え行くコードベースをメンテナンスしつつ、なおかつ新しいシステムを書くことは、リソースを枯渇させることになるでしょう。あなたのチームは分断され、遅延が発生することになります。計画をしっかり立て、注意深く移行をしなければなりません。その一方で、あなたの競合企業は製品化に時間がかかるという問題を抱えておらず、あなたの顧客を奪おうとするでしょう。しかし、あなたがもしこの現実を見据えた上で、なおリライトに賭けようと思うのであれば、成功のチャンスがあるかもしれません。

Naresh Jain氏は、特にレガシーコードに関して次のように提案している。コードが難解で、それが何をしているのかチームでも良く分からないのであればリファクタリングせよ。コードが何をしているのかが明確でありながら、理解するのが難しければリライトせよ。

このように、リファクタリングの方が少しずつシステムを改善するのには好まれる。ペースは遅く、小さく継続的な改善によって品質を高める。リライトにはメリットもあるが、多くの状況ではよりリスクの高い選択肢であり、チームはその結果を確実なものにすることはできない。Joel on Softwareに、次のようにある通りである。

次のことを覚えておくことは重要です。あなたがスクラッチから始める時、最初の時よりも良い仕事ができると信じるに足る理由は一切ないのです。

特集コンテンツ一覧

GAE開発の落とし穴

Googleのクラウド環境をつかったGoogle App Engineによる開発するにあたり、初めての試みで苦悩する開発者達の経験をもとに、各開発フェーズにあわせて問題点やどう解決したかをご紹介します

イベントレポート:「Coqチュートリアル#1」

去る1月12日、定理証明支援系ツールCoqの初心者向けチュートリアルが開催さ れた(http://kokucheese.com/event/index/23667/)。今後も2月2日 (http://kokucheese.com/event/index/23744/)、2月9日、2月16日と引き続き開 催されていく予定である。本記事では、開催の様子をレポートする。

Javaの未来についてのNeal Gafter氏とのディスカッション

Choosing Options

Neal Gafter氏はOracleによるJava買収の影響に関する議論、Javaにセグメンテッドスタックやメタオブジェクトプロトコルを追加することについての主張、そしてJavaとC#との比較について話をしてくれた。

Google Dartのエッセンス:アプリケーションの構築、スナップショット、Isolate

GoogleはVMをともなう新しい言語であり、JSコンパイラでもあるDartをプレビューした。 InfoQはDartのアプリの構築に貢献する文法の裏側を探った:スナップショット、Isolate、モジュール方式

CSPベースのモデル検査ツール「Process Analysis Toolkit」

本記事ではCSPベースの「マルチドメイン・モデル検査ツール」である、PAT(Process Analysis Toolkit)について紹介する。モデル検査は、形式手法(Formal Method)という方法論を基礎とする技術であり、複雑さが増大しながらも安全性を求められる、現在のソフトウェア開発の状況に対する処方箋の1つとして注目されている手法である。

Jenkinsによる継続的インテグレーションのススメ(4) ~CloudBeesでJenkinsをサービスとして使う~

前回まで、Jenkinsの幾つかの側面に注目して解説をしてきました。シリーズ最後の今回は、Jenkinsをサービスとして使う方法を紹介します。

書籍『抽象によるソフトウェア設計-Alloyではじめる形式手法-』の紹介

Alloyは、MITにて開発された仕様記述言語であり、ツールによる自動解析を使い、インクリメンタルに形式仕様が書けることが特長である。筆者らはAlloy開発者による、Alloyを使った形式手法入門書を翻訳、今夏にオーム社より刊行した。本記事では、Alloyの簡単な概要と、翻訳書『抽象によるソフトウェア設計』(「Alloy本」)を紹介する。

Windows デバイスで開発するタッチユーザーインターフェイス

スマートフォンを中心としたマルチデバイスにおけるタッチユーザーインターフェイスへの対応は、既に必須の項目となりつつある。本記事では、Windows デバイスにおける UX のベースとなっている「メトロ」というデザイン言語を掘り下げながら、既存環境を意識しつつもどのようにタッチユーザーインターフェイス開発に取り組んでいくべきであるかについて解説していく。