Patrick Smacchia氏は15年余りの間ソフトウェア開発に携わってきた Visual C# の MVP です。彼は現場での経験から着想した .NET プラットフォームに関する書籍である Practical .NET 2 and C# 2 の著者です。数学および計算機科学の学位取得後、彼は Societe Generale 社での証券取引、Amadeus 社での航空券予約システム、さらに Alcatel 社での衛星基地局など様々な分野でソフトウェア開発を手がけてきました。現在彼は NDepend というツールの主導的な開発者です。
Rob Bazinet (RB): NDepend とは何でしょうか?
Patrick Smacchia (PS): NDepend は .NET 開発者およびアーキテクトのためのツールです。コードベースはとても複雑なものですが、NDepened はソースコードからの情報の取得を手助けするツールです。例えば、NDepened を使ってあなたのコードベースが正しく階層化されているかどうかを知ったり、前回のリリースから何が変更されたかを把握したり、あるいは従来のツールでは何時間あるいは何日もかかっていたかも知れないような、コードの品質の評価を行って即座に何らかのタスクを提示するといったことが可能です。
RB: どうやって NDpened のアイデアを思い付いたのですか?
PS: 5年前、私は巨大かつ低質なコードベースのコンサルティングに取り組んでいました。同じ頃、私は Robert C Martin氏による素晴らしい著書 Agile Software Development, Principles, Patterns, and Practices(リンク) を読んでいました。その本はコードベースのコンポーネント化を評価するいくつかのクールなメトリクスについて解説しています。
当時私は C++ から .NET へと移行していた頃で、C++ の RTTI よりもずっと有力な System.Reflection の方が好みだと思うものの1つでした。それで当然のように、その巨大で低質なコードベースに対して Martin のメトリクスが何を示すのかを確かめるため、Reflection に基づいたちょっとしたツールの開発を始めました。後にそのツールを OSS 化し、その機能に対する多くの需要からそれは徐々にポピュラーになっていきました。そこで、私はもしこのツールが視覚化とクエリ処理の機能をサポートすれば、コードの複雑性にどう取り扱うのかという新しいステップを示す事ができるのではないかと気づきました。
RB: NDepend はコード記述のタスクおよび/あるいは開発のライフサイクルにおいてどのように役立ちますか?
PS: NDepend はリファクタリング、コードレビュー、コード品質のチェックと向上、設計浸食の検査、コードの調査、コードの閲覧、ビルドプロセスルールの励行といった様々なタスクにおいて非常に役立ちます。
NDpenend は依存関係マトリクスパネルと '箱と矢印' グラフの生成によってコンポーネント、名前空間、クラス、・・・等々の依存関係を表示することができるため、コードのリファクタリングにおいても有用です。
NDepend はコード品質の評価に利用可能な60以上のコードメトリクスをサポートしています。
NDepend の解析プロセスは MSBuild あるいは NAnt のビルドプロセスに統合することができます。解析が実行される度にビルドプロセスの健全性に関するレポートが出力されます。
コード構造クエリ専用の言語 (Code Query Language, CQL) によって、開発者は自身のコードベースに関するどのような種類の質問も問い合わせる事ができます。
- どのクラスが IDisposable を実装しているか?
SELECT TYPES WHERE IsClass AND Implements "System.IDisposable" - どの公開メソッドが非公開として宣言可能か?
SELECT METHODS WHERE IsPublic AND CouldBePrivate - どのメソッドがあるフィールドに値を割り当てているか?
SELECT METHODS WHERE IsDirectlyWriting "MyNamespace.MyClass.m_Field" - 複雑なメソッドのうちどれが十分にコメントが記述されていないか?
SELECT METHODS WHERE CyclomaticComplexity > 15 AND PercentageComment < 20
この CQL 言語はビルド毎にチェック可能なルールを定義するためにも使用できます。何らかのルール違反があった場合は、ユーザはレポートからその通知を受けます。NDepend には50以上のあらかじめ定義されたルールがあり、またユーザが以下のようにカスタムなルールをシームレスに定義できるように設計されています。
- 静的フィールドは m_XXX と命名されてはならない(カスタム命名規約)。
WARN IF Count > 0 IN SELECT FIELDS WHERE NameLike "^m_" AND IsStatic - ユーザインターフェイス層をデータベース層に直接依存させたくない。
WARN IF Count > 0 IN SELECT NAMESPACES WHERE IsDirectlyUsing "DataLayer" AND NameIs "UILayer" - MyAssembly および MyAssembly2 以外のアセンブリのメソッドのコードは30行を超えてはならない。
WARN IF Count > 0 IN SELECT METHODS OUT OF ASSEMBLIES "MyAssembly1", "MyAssembly2" WHERE NbLinesOfCode > 30
NDepend は2つのバージョンのコードベースを比較するのに利用できます。この機能は特に新バージョンをリリースする場合やスモークテストやコードレビューにおいて変更点に注目したい場合に役立ちます。また CQL 言語は差分を調査するのにきわめて役に立ちます。例えば、2つのビルドの間で変更されているメソッドをリスト化するには、単に以下のように記述するだけです。
- SELECT METHODS WHERE CodeWasChanged
最後に、NDepend は Visual Studio 2005 と 2008 のアドインおよび Reflector のアドインとして提供され、これらのツール上からその機能にアクセスすることができます。
RB: どうすれば NDepend を使い始めることができますか?おすすめの手順は?
PS: まずは NDepend をダウンロードしてあなたのコードベースを解析してください。VisualNDepend UI は Visual Studio と全く同じルック&フィールとなるように洗練されていますので、シームレスに実行できるはずです。
解析が完了すると、VisualNDepend UI は解析結果を閲覧するためのパネルをいくつか表示します。この時点でユーザは依存関係を閲覧するのか、メトリクスを閲覧するのか、CQL 言語を用いてコードベースに対するクエリを実行するのか、2つの解析結果を比較するのか、・・・等々を選択する必要があります。各機能には大抵それぞれ専用のパネルがあります。いくつかの '事始め' の説明を含む埋め込みのヘルプ欄もあります。スクリーンキャストもいくつかリンクされています。それらはそれぞれ特定のタスクの実行方法を説明しています。最後に、私たちのウェブサイトには完全な CQL の仕様などの詳細な文書が記載されています。
一度各機能をマスターすれば、コードベースのレビューや合理化のためにそれらを取り混ぜて利用できるようになります。
RB: NDepend は .NET Framework 3.5 に対応していますか?3.0 は?
PS: はい、 新しい NDepend のバージョン 2.6 の Visual Studio アドインは Visual Studio 2008 に対応しています。また NDepend は .NET 3.5 および 3.0 のアセンブリの解析が可能です。
RB: NDepend は .NET 言語用の製品ですが、今後 .NET 以外のプラットフォームに対応する予定はありますか?動的コードベース解析への対応の予定はありますか?
PS: はい。NDepend は C# で記述されていますが、そのうち .NET コードの解析に特化しているコードは5%だけです。これは95%のコードは解析対象コードのプラットフォームから抽象化されていることを意味しています。これに関連して、協力会社の OCTO Technoloy 社(リンク)が今現在 Java のコードを解析可能なバージョンの NDepend を開発しています。ソフトウェアや情報システムアーキテクチャに重点的に取り組んでいるフランスの企業である OCTO Technology 社は、Java および .NET の専門家たちで構成されるコンサルタント会社です。OCTO 社の .NET コンサルタントたちは NDepend がお気に入りで、と同時に Java コンサルタントたちが同じようなツールを求めていました。それで私たちは協力関係を結ぶことを決定しました。
XDepend プロジェクト(NDepend の Java 版)のベータ版が2008年の第1四半期中に利用可能となる予定です。
RB: NDepend によるコード解析を習得するのは難しそうにも思えますが、ユーザのためのチュートリアルや手引書などはありますか?
PS: VisualNDepend UI にはいくつか '事始め' の説明を含んだ埋め込みのヘルプ欄もありますし、またスクリーンキャストもいくつかリンクされています。www.ndepend.com/GettingStarted.aspx には取っ掛かりとなるいくつかの3分間のスクリーンキャストがあります。他にも主なユースケースシナリオを解説したいくつかのスクリーンキャストがメインページ(リンク)から参照されています。さらにその先へと踏み込むため、ドキュメンテーションの項では例えば完全な CQL の仕様書(リンク)、全てのメトリクス(リンク)に関する説明、そして Scott Hanselman氏(リンク)、Stuart Celarier氏および Patick Cauldwell氏(リンク)による要約ポスター「テーブルマット見える化名人の PDF」(PDF)などの文書も提供しています。また私は http://codebetter.com/blogs/patricksmacchia/default.aspx で NDepend の高度な使用方法を説明するブログ記事を定期的に配信しています。
RB: ソフトウェアチームを立ち上げてすぐに活動できるようなトレーニングは提供していますか?
PS: 私たちはたまにエンタープライズライセンスを発注していただいて特別なトレーニングを望まれた顧客を訪問しています。トレーニングは主要な活動ではないのですが、私たちはそれを続けていきたいと考えています。ユーザと直に接することでとても参考になることがあります。この製品にはユーザからのフィードバックによる機能が満載です。
RB: NDepend で最も強力な、もしくは最高の機能は何だと思われますか?またそれはなぜですか?
PS: 難しい質問ですが、実のところ私たちは NDepend のコード記述に NDepend を大いに利用しています。個人的に私は依存関係を閲覧してアーキテクチャをきれいに保つためにマトリクスを毎日利用しています。私たちは恒久的にコード品質の手入れを行うための400以上の CQL ルールを保持しています。また私は比較機能の中毒者でもあります。変更中のコードをレビューするためにそれを頻繁に利用しています。私は本当に、悪魔は変化の中にある、と信じていますから。
良かったのは、このような作業が奏功して私たちの開発プロセスは大幅に改善され、持続可能なリズムで新しいバージョンをリリースできているということです。詳細は私たちのリリースノート(リンク)で知ることができます。
RB: Patrick さん、本日は貴重なお時間を割いていただき NDepend について教えてくださって本当にありがとうございました。
NDepend に関する詳細は NDepend のウェブサイト(リンク)を参照してください。Ptrick氏についてより詳しいことは彼のブログで知ることができます。
原文はこちらです:http://www.infoq.com/articles/patrick-smacchia-interview
(このArticleは2008年1月7日に原文が掲載されました)