"ソフトウェア開発者が修正しているソフトウェアコードに関連するソフトウェアコードが存在することを前記ソフトウェア開発者に通知するためのコンピュータ実装方法であって、ソフトウェアコードベースを構文解析して、前記ソフトウェアコードに関連する情報を識別するステップと、前記構文解析したソフトウェアコードベースにインデックスを付して、ソフトウェアコードのマッチするセクションの迅速な識別を提供するステップと、ソフトウェアコードを編集している開発者によって提供されるソフトウェアコードの変更を検出するステップと、前記ソフトウェア開発者によって提供される前記コードの変更に関連する任意のコードクローンを識別するステップと、前記クローンが識別されたことを検出すると、少なくとも1つのクローンが存在するため、前記検出された変更を前記識別されたクローンに適用するか否かを前記ソフトウェア開発者が判定することが可能であることを、前記ソフトウェア開発者に通知するステップとを含み、前述のステップを、少なくとも1つのプロセッサにより実施する、方法。前記ソフトウェアコードベースを構文解析するステップは、言語の特徴、コードブロック、変数情報、クラスおよび他のデータ構造の情報、ならびに関数情報のうちの少なくとも1つを識別するステップを含む、請求項1に記載の方法。前記ソフトウェアコードベースを構文解析するステップは、前記開発者が現在取り組んでいるソースコードを構文解析して、以前に構文解析したソフトウェアコードと前記インデックスにおいて比較するステップを含む、請求項1に記載の方法。前記ソフトウェアコードにインデックスを付すステップは、前記開発者のコンピューティング装置からのソフトウェアコードおよび少なくとも1つの他のコードベースにインデックスを付すステップを含む、請求項1に記載の方法。前記ソフトウェアコードにインデックスを付すステップは、前記インデックスに基づくクエリおよび検索の機能を提供して、前記開発者が取り組んでいるソフトウェアの現在の範囲に関連するコードクローンを識別するステップを含む、請求項1に記載の方法。前記ソフトウェアコードにインデックスを付すステップは、開発者がソフトウェアコードをコード管理システムにまたは他の重要なマイルストーンにおいてチェックインすると、前記インデックスを更新するステップを含む、請求項1に記載の方法。前記ソフトウェアコードを構文解析するステップおよび前記ソフトウェアコードにインデックスを付すステップは、ソフトウェアコードの変更を継続的に識別してインデックスを付すコードベースインデックス付けサーバにおいて継続して起こる、請求項1に記載の方法。前記ソフトウェアコードの変更を検出するステップは、前記開発者によるタイピングを検出して、前記ソフトウェアコード内で識別された不具合を解決するステップと、前記ユーザがタイプすると、前記インデックスに対して変更をクエリでサブミットして、前記開発者が取り組んでいる前記コードに関連するコードクローンを識別するステップとを含む、請求項1に記載の方法。前記ソフトウェアコードの変更を検出するステップは、前記開発者がある特定のコードブロックを選択し、前記選択したコードブロックに関連するコードクローンを識別するためにオプションを選択したことを検出するステップを含む、請求項1に記載の方法。前記コードクローンを識別するステップは、前記インデックスにクエリを行うステップと、前記コードの変更の周囲の前記コードの一部を提供して関連するコードを識別するステップとを含む、請求項1に記載の方法。前記コードクローンを識別するステップは、前記開発者が取り組んでいる前記コードベースと同一または異なるコードベースにおけるクローンを識別するステップを含む、請求項1に記載の方法。前記開発者に通知するステップは、統合開発環境IDE内の前記クローンを識別するユーザインタフェースメッセージを提供するステップを含む、請求項1に記載の方法。前記開発者に通知するステップは、前記識別されたコードクローンに関連付けられた別の開発者に追加の通知を提供するステップを含む、請求項1に記載の方法。コードクローンの識別およびアーキテクチャの変更の視覚化を伴う、ソフトウェアコードレビューを拡張するためのコンピュータシステムであって、以下のコンポーネント内に具現化されたソフトウェア命令を実行するよう構成されたプロセッサおよびメモリと、プログラミング言語で記述されたソフトウェアコードを構文解析して、インデックス付けのために前記ソフトウェアコードに関連する情報を識別する構文解析コンポーネントと、構文解析中に識別された前記ソフトウェアコード情報にインデックスを付して、コード情報の迅速な探索およびマッチングを提供するインデックス付けコンポーネントと、ソフトウェアコードの識別された範囲へのソフトウェア開発者による現在の変更を検出する変更検出コンポーネントと、前記ソフトウェア開発者によって加えられる前記検出された変更の前記識別された範囲に関連する1つまたは複数のコードクローンを識別するコードクローン検出コンポーネントと、ソースコードのアーキテクチャモデルを作成し、前記アーキテクチャモデルを他のアーキテクチャモデルと比較してアーキテクチャの差分を識別する差分視覚化コンポーネントと、前記識別されたコードクローンおよび前記識別されたアーキテクチャの差分を視覚的に前記ソフトウェア開発者に提供するユーザインタフェースコンポーネントとを備えたコンピュータシステム。前記変更検出コンポーネントは、前記ソフトウェア開発者がソフトウェアコードを編集するために使用する統合開発環境IDEに関連づけられ、前記変更検出コンポーネントはタイピングおよび他のソフトウェア開発者の入力を監視して、前記ソフトウェア開発者がソフトウェアコードに変更を加えていることを検出し、既知のコードクローンのインデックスと比較するために、1つまたは複数のコード範囲を前記コードクローン検出コンポーネントにサブミットする、請求項14に記載のコンピュータシステム。本明細書において、コード検証システムについて説明する。コード検証システムは、コードクローンの分析および視覚化を伴う拡張コードレビューを提供し、ソフトウェア開発者が同一のコードの同様のインスタンスを自動的に識別するよう支援し、長期にわたるソフトウェアコードのバージョンにおける差分を視覚化する。システムは前述したコードクローン検索技術例えば、2010年4月1日出願のコードクローンの検出および分析と題する米国特許出願番号12/752,942を参照を使用して、コードクローンを識別し、開発者が変更を加えるものと同様のコードに関する情報をユーザに提示する。例えば、システムは、開発者がコードブロックに変更を加えるものと同様のソフトウェアコードを有する位置を表示するツールチップのポップアップまたはウィンドウを提供することができる。より粗いレベルでは、システムは、そのコードが1つまたは複数のクローンを含むコードセグメントに対してチェックインがおこなわれると、開発者または他のチームに自動通知を提供することができる。システムは、変更されるべきコードの一片のクローンコピーを識別し、同一の変更の適用の可能性についてクローンコピーをチェックするようコードレビュアに提案することができる。コード検証システムはまた、開発者がソフトウェアコード本体のアーキテクチャの進化を理解するよう支援する。例えば、ソフトウェア設計者は、プロジェクトの2つのマイルストーン例えば、M1およびM2間のアーキテクチャの進化を理解したいかもしれない。別の例として、2つのソース制御ブランチ間のコードブランチの統合を行う開発者は、2つのブランチにおけるソースコード間のアーキテクチャレベルの差分を理解したいかもしれない。コード検証システムは、アーキテクチャの差分を判定する分析コンポーネント、および、識別した差分を開発者およびソフトウェア開発プロセスに関与する他の人に直感的かつ有益な方法で表示するユーザインタフェースコンポーネントを提供する。これにより、開発者が変更の理由を理解し、または不当なアーキテクチャの変更をそれらが度を越す前に気付くよう支援することができる。システムは、コードクローンに同様の視覚化を提供し、開発者があるクローンと別のクローンとの間の差分を視覚化することを可能にすることができる。これにより、レビュアがコードベースのソースコードの2つのバージョン間のアーキテクチャレベルの差分を分析および視覚化することが可能となり、アーキテクチャレベルの差分の直感的理解を提供し、アーキテクチャレベルのコードレビューの有効性が改善される。従って、コード検証システムにより、コードの正確性が増し、以前に解決されている不具合を有する未検出のコードクローンによるエラーのコストが、重複する努力を避けることによって削減される。開発者は迅速にコードを再利用するために、しばしばコードを複製する。複製されたコードの一片は、コードクローンとも呼ばれる。コードの一片に変更を加えるごとに頻繁に、同一の変更をそのクローンコピーにもまた適用するべきである。今日、コードレビュー中に、レビュアは、同一の変更をそのクローンコピーに適用する必要があるかどうかを、レビュア自身のコードベースの知識を考慮して考え出すことができるだけである。全てのクローンコピーを考慮すると保証することは困難である。コード検証システムはこれを、現在のコードベースのソースコードに、またはコードベースのより拡張した範囲で、インデックスを付すコードクローン検索エンジンに対して、変更されたコード片を検索することによって解決し、コードレビュアに、複製されたコピーをチェックするよう自動的に知らせる。今日、コードレビュアがコードレビュー中に、ソースコードの2つのバージョン間のアーキテクチャレベルの差分を理解することは困難である。既存のツールは、追加および削除された行、単語、または文字などのテキストレベルの差分を指摘することはうまくできるが、ソフトウェアコードは非常に多くの方法で構築することができるので、これらのツールでは、より高レベルのビューは何ら提供できない。コードの現在のバージョンについてのアーキテクチャの情報を表示する、クラスビューア、名前空間ビューアなどの良好な既存のツールもある。しかしながら、これらのツールには、ソフトウェアコードの2つのバージョンを比較し、および何が変わったかを開発者が視覚化するよう支援する機能は有していない。このため、コードレビュアがアーキテクチャレベルのコードのリファクタリングが有用かどうかを考え出すのはさらに困難となる。図1は、1実施形態における、コード検証システムのコンポーネントを例示するブロック図である。システム100は、構文解析コンポーネント110、インデックス付けコンポーネント120、変更検出コンポーネント130、コードクローン検出コンポーネント140、差分視覚化コンポーネント150、ユーザインタフェースコンポーネント160、および通信コンポーネント170を備える。これらのコンポーネントのそれぞれについて、本明細書でさらに詳細に説明する。構文解析コンポーネント110は、プログラミング言語で書かれたソフトウェアコードを構文解析し、インデックス付けのためにソフトウェアコードに関連する情報を識別する。本明細書では単に構文解析と称するが、このプロセスには、構文解析、字句分析、最適化などを含む、ソフトウェアコードのコンパイルに関与する一般的なプロセスを含むことができる。構文解析コンポーネント110は、変数名、コードブロック、言語のキーワード例えば、if、thenおよびwhile、変数宣言、クラス定義、および任意の他のコード特徴を識別することができる。構文解析コンポーネント110は、プラグインモジュール、または様々なプログラミング言語に対処するサブコンポーネントを含むことができる。構文解析コンポーネント110は、チェックインされた大規模なコード本体、ならびに開発者がアクティブに編集中のローカルのコード本体で動作することができる。いくつかの実施形態においては、構文解析コンポーネント110は、ユーザがタイプおよび/または中断すると、入力された新しいテキストを構文解析する例えば、MICROSOFT商標INTELLISENSE商標。インデックス付けコンポーネント120は、構文解析中に識別されたソフトウェアコード情報にインデックスを付し、コード情報の迅速な探索およびマッチングを提供する。コンポーネント120は、大規模なコード本体のインデックス、または複数のコード本体のインデックスを作成し、入力コードにマッチする既知のコードが存在するかどうかを判定するクエリを受け取ることができる。例えば、インデックスには大規模なプロジェクトのコードを含むことができ、システム100は開発者が現在何をタイプしているかに基づいてクエリをサブミットすることができる。システム100はまた、開発者の現在の編集位置周辺のコードのサブセットに基づきクエリを行い、現在の位置に関連するコードクローンを識別することもできる。インデックス付けコンポーネント120は、開発者のコンピューティング装置上でローカルに動作するか、または開発者のコンピューティング装置からアクセス可能なサーバ上で動作してもよい。インデックス付けコンポーネント120は、新しいコードの変更または追加のコードベースが長期にわたり識別されるよう、それらを組み込む漸進的な方法で動作する。変更検出コンポーネント130は、ソフトウェアコードの識別された範囲への開発者による現在の変更を検出する。コンポーネント130は、開発者がソフトウェアコードの編集のために使用するIDEに組み込まれることが可能である。いくつかの実施形態においては、変更検出コンポーネント130がタイピングおよび他の開発者の入力を監視し、開発者がソフトウェアコードに変更を加えていることを検出する。検出された変更は、ある特定のソースファイルにおける、または1つまたは複数のビジュアル編集ツールを介した、ソフトウェアコードの追加、削除、または更新を含むことができる。変更検出コンポーネント130は、1つまたは複数のコード範囲を識別し、既知のコードクローンのインデックスと比較するために、その範囲をコードクローン検出コンポーネント140にサブミットする。コードクローン検出コンポーネント140は、ソフトウェア開発者によって加えられた検出された変更の識別された範囲に関連する1つまたは複数のコードクローンを識別する。システムは、開発者の現在の位置周辺のコードまたはコードの範囲をインデックス付けコンポーネント120にサブミットし、同一または他のソフトウェアプロジェクトにおける同様またはマッチングするコードの範囲を識別する。コードクローン検出コンポーネント140は、開発者のコンピューティング装置上に記憶されたクローンを識別するようローカルに動作するか、または、企業内のサーバ上、もしくは複数のソフトウェアプロジェクトのソースコードのインデックス付けを行うパブリックインターネットサーバ上のような、より広域のレベルで動作してもよい。いくつかの実施形態においては、コードクローン検出コンポーネント140は、粒度情報例えば、ブロックレベル、関数レベル、モジュールレベルの類似性に基づき、または現在のコード位置周辺の決められたサイズ例えば、現在の位置/-100文字に基づき、コードクローンの始まりおよび終わりを識別する。クローンを様々な異なる方法で定義および識別することができ、本明細書の説明は、システム100をどれか1つの特定の方法に限定しようとするものではない。特に、プログラミング言語が異なれば、コードクローンを識別するのに適したソースコードの粒度は変化することになる。差分視覚化コンポーネント150は、ソースコードのアーキテクチャモデルを作成し、そのアーキテクチャモデルを他のアーキテクチャモデルと比較して、アーキテクチャの差分を識別する。コンポーネント150は、同一のソースコードの2つのバージョン例えば、今日のものから1つおよび先週のものから1つを入力として受け取り、2つのバージョンを比較して、アーキテクチャの差分をソフトウェア開発者または設計者に表示することができる。コンポーネント150はまた、異なるコード本体同士を比較して、開発者がアーキテクチャの類似性および差分を視覚化するよう支援することもできる。いくつかの実施形態において、IDEは、コードレビュープロセス中に差分視覚化コンポーネント150を起動し、それにより、開発者がチェックインされたコードと新しいコードとの間のアーキテクチャレベルにおける差分を、容易に識別することができる。ソフトウェアコードを、様々な設計およびアーキテクチャにファクタリングfactored、およびリファクタリングすることができる。しばしば、テキストレベルで著しく変化するソースコードが、アーキテクチャレベルではほとんど変化しない、またその逆の場合もある。例えば、開発者がプログラムにて変数ごとに名前を変える場合、テキストはほとんどマッチしないが、アーキテクチャは同一となるであろう例えば、同一のクラス、クラス間の同一の関係性など。ユーザインタフェースコンポーネント160は、識別されたコードクローンおよび識別されたアーキテクチャの差分を開発者に提供する。ユーザインタフェースコンポーネント160は、GUIgraphicaluserinterface、プログラマティックAPIapplicationprogramminginterface、または情報を開発者に提供する他のインタフェースを含むことができる。コンポーネント160は、IDEの一部としてまたは拡張可能なIDEに統合されたプラグインとして動作して、ユーザがソフトウェアコードを編集するとクローンの識別を提供し、要求に応じてアーキテクチャの比較を提供することができる。いくつかの実施形態において、システム100は、ソースコードの変更をレビューするコードレビュープロセスの一部として動作し、コードレビュープロセス中、GUIまたは他のインタフェースを提供して、現在の変更に関連するコードクローンおよびアーキテクチャの差分を開発者および/またはレビュアに表示する。コンポーネント160はまた、ウェブ、携帯電話、または情報を視覚化するのに適切な他のインタフェースを提供することもできる。いくつかの実施形態において、ユーザインタフェースコンポーネント160は、コードの所有者または他の開発者のソフトウェアコードを基にしたクローンコードが変更されたことを検出すると彼らに通知を提供する通知サブコンポーネントを含む。これにより、開発者が互いをまたはコードの共有について知っていてもいなくても、開発者が関連コード内で他の開発者によって識別された自分達のコードにおける問題を解決することが可能となる。通信コンポーネント170は、システム100が分散されている場合に、システム100の他のコンポーネント間の通信を提供する任意のコンポーネントである。システムは、単一の開発者のクライアントコンピューティング装置上で完全に動作することができるが、一部のユーザは、システム100をより大規模なコード本体に適用することによって付加価値を見出すであろう。システム100は、個々のコンポーネントを1つまたは複数のサーバ上に配置することが可能であり、それにより、単一の開発者のコンピューティング装置上で利用可能なものよりも大規模なコード本体にアクセスすること、およびシステム100の機能を実施するために使用される開発者のコンピューティング装置からのリソース消費の負荷を取り除くこととの両方が可能となる。例えば、コードクローンの検出およびアーキテクチャのモデリングは、コードの複数のバージョンおよび複数のコードベースにアクセスするサーバによって提供されうる。そのような場合、個々の開発者のIDEは、通信コンポーネント170を介してサーバに接続し、開発者を支援する情報を受け取ることができる。通信コンポーネント170は、LANlocalareanetworkまたはインターネット上のTCPtransmissioncontrolprotocolなどの、様々な一般のネットワークプロトコルおよびネットワークを使用することができる。システムはまた、クラウドコンピューティングのリソースを活用して、MICROSOFT商標WINDOWS登録商標AZURE商標が提供する機能のような処理、記憶、または他の機能を、拡張可能なクラウドベースのサーバに分散させることもできる。コード検証システムを実装するコンピューティング装置は、中央処理ユニット、メモリ、入力装置例えば、キーボードおよびポインティングデバイス、出力装置例えば、ディスプレイ装置、および記憶装置例えば、デイスクドライブまたは他の不揮発性記憶媒体を含むことができる。メモリおよび記憶装置は、本システムを実装するまたは有効にするコンピュータ実行可能命令例えば、ソフトウェアで符号化されることが可能なコンピュータ可読記憶媒体である。さらに、データ構造およびメッセージ構造を、通信リンク上の信号などのデータ送信媒体を介して記憶または送信することができる。インターネット、ローカルエリアネットワーク、ワイドエリアネットワーク、ポイントツーポイントダイアルアップ接続、携帯電話ネットワークなどの、様々な通信リンクを使用することができる。本システムの実施形態を、様々な動作環境で実装することができ、それらの動作環境には、パーソナルコンピュータ、サーバコンピュータ、ハンドヘルド装置またはラップトップ装置、マルチプロセッサシステム、マイクロプロセッサベースのシステム、プログラム可能な家庭用電化製品、デジタルカメラ、ネットワークPC、ミニコンピュータ、メインフレームコンピュータ、上記システムまたは装置の何れかを含む分散コンピューティング環境、セットトップボックス、SOCsystemonachipなどを含む。コンピュータシステムは、携帯電話、携帯情報端末、スマートフォン、パーソナルコンピュータ、プログラム可能な家庭用電化製品、デジタルカメラなどであることが可能である。本システムを、プログラムモジュールなどの1つまたは複数のコンピュータまたは他の装置により実行されるコンピュータ実行可能命令の一般的コンテキストで説明することができる。一般に、プログラムモジュールには、特定のタスクを実施するまたは特定の抽象データ型を実装する、ルーチン、プログラム、オブジェクト、コンポーネント、データ構造などを含む。一般的には、プログラムモジュールの機能性を、様々な実施形態において所望の通り結合または分散することができる。図2は、1実施形態における、ソフトウェア開発者が修正しているソフトウェアコードに関連するソフトウェアコードが存在することをその開発者に知らせる、コード検証システムの処理を例示するフロー図である。ブロック210で始まり、システムはソフトウェアコードベースを構文解析し、そのソフトウェアコードに関連する情報を識別する。システムは、言語の特徴、コードブロック、変数情報、クラスおよび他のデータ構造の情報、関数情報などを識別することができる。システムは、構文解析した情報を、ユーザがソフトウェアコードを修正する際にクエリを行うためにインデックスに提供する。システムはまた、開発者が現在取り組んでいるソースコードを構文解析して、以前に構文解析したソフトウェアコードとインデックスにおいて比較する。ブロック220へと続き、システムは、構文解析したソフトウェアコードベースにインデックスを付して、ソフトウェアコードのマッチするセクションの迅速な識別を提供する。インデックスには、開発者のコンピューティング装置からのソフトウェアコード、または潜在的に多数の開発者による潜在的に多数のソフトウェアプロジェクトへの寄与を網羅するより広範なコードベースを含むことができる。システムはインデックスに基づくクエリおよび検索の機能を提供して、開発者が取り組んでいるソフトウェアの現在の範囲に関連するコードクローンを識別する。開発者が、コード管理システムにまたは他の重要なマイルストーンにおいて、ソフトウェアコードをチェックインすると、システムはインデックスを更新することができる。システムはまた、開発者がソースコードを編集する際に関連する情報を探索するために、開発者のコンピューティング装置においてローカルのインデックスを提供することもできる。先の2つのステップは、継続して、次に続くステップより先に、または次に続くステップとは別個のサーバで行うことができる。例えば、システムは、ソフトウェアコードの変更を継続的に識別してインデックスを付すコードクローンインデックス付けサービスを提供することができる。開発者のコンピューティング装置で実行されている別個のサービスにより、開発者が加えた変更を識別し、インデックスサービスにクエリを行って関連するソフトウェアコードを識別してもよい。あるいは、またはさらに、システムは、その同一のコンピューティング装置上で関連するコードを識別するために、インデックスサービスを開発者のコンピューティング装置上に提供してもよい。ブロック230へと続き、システムは、ソフトウェアコードを編集している開発者によって提供されるソフトウェアコードの変更を検出する。システムは、開発者によるタイピングを検出して、ソフトウェアコード内で識別された不具合を解決することができる。ユーザがタイプすると、システムは、インデックスに対して変更をクエリでサブミットして、開発者が取り組んでいるコードに関連するコードを識別することができる。システムはまた、IDE、またはIDEがそれを通してソフトウェアの変更を記述する情報をシステムに提供することができ、かつそれに応じてコードクローンに関する情報を受け取ることができる他のソフトウェアプログラムに、APIを提供することもできる。いくつかの実施形態においては、開発者がある特定のコードブロックを選択し、選択したコードブロックに関連するコードクローンを識別するためにオプション例えば、同様のコードを見つけるを選択することができる。ブロック240へと続き、システムは、開発者によって提供されるコードの変更に関連する任意のコードクローンを識別する。システムは、インデックスを調べて、コードの変更の周囲のそのコードの一部分、または変更前のそのコードの以前のバージョンを提供して、関連するコードの識別を支援する。コードクローンは、現在のコードベース内、関連するコードベース内、またはソフトウェアコードのある特定の範囲を偶然共有する全く関連のないコードベース内に存在し得る。開発者がコードブロックをマクロおよびミクロ両方のレベルで再利用することは、よくあることである。開発者がある特定の関数またはプログラムループを再利用することもあれば、開発者がモジュール全体またはクラス全体を再利用することもある。システムは、様々なレベルおよび粒度でクローンを識別することができる。いくつかの実施形態においては、システムは、ユーザまたはアプリケーションが修正できる構成パラメータを提供して、クローンを識別するレベルを構成する。判定ブロック250へと続き、システムが少なくとも1つのクローンを識別した場合、システムはブロック260へと続き、識別しなかった場合には、システムは完了する。システムは、クローンインデックスサーバから、または開発者のコンピューティング装置上で実行中のローカルのインデックスから、識別されたクローンのリストを受け取ることができる。リストには、クローンのソースコードの記憶位置例えば、URLuniformresourcelocatorまたはファイルパス、ファイル名情報、行番号情報、クローンに関連付けられた開発者などのクローンを記述する情報を含むことができる。ブロック260へと続き、システムは、少なくとも1つのクローンが存在し、それにより、検出された変更を識別されたクローンに適用するかどうかをソフトウェア開発者が判定することが可能であるということを、その開発者に通知する。システムは、ポップアップメッセージ、ツールチップ、IDE内のドッキングリスト、または識別されたクローンを開発者に表示する他のユーザインタフェースを提供することができる。システムは、表示すべきクローンの閾値例えば、10を判定すること、またはクローン間をナビゲートするユーザインタフェース制御を提供することができる。開発者がクローンを修正するためにアクセスしない場合もあり、コードの変更を他の開発者に通知するように、システムが開発者に連絡先情報を提供することができる。システムはまた、コードクローンに関与する他の開発者に、電子メールメッセージなどの自動通知を提供することもできる。通知には、変更を記述する情報、変更を加えた開発者を識別する情報、および、変更の動機を記述する開発者によって提供される任意の情報を含むことができる。ブロック260の後、これらのステップは終了する。図3は、1実施形態における、ソフトウェアコード内の変更に関連するアーキテクチャレベルの変更をソフトウェア開発者に表示する、コード検証システムの処理を例示するフロー図である。ブロック310で開始し、システムは、1つまたは複数のアーキテクチャの特徴を含む第1のソフトウェアコードのバージョンを受け取る。ソフトウェアコードには、開発者が取り組んでいるプロジェクトの一部であるコードベース、または他のコードベースを含むことができる。開発者は、アーキテクチャの比較を受け取りたいソフトウェアコードの2つのバージョンを識別することができる。いくつかの実施形態においては、システムがユーザインタフェースを提供し、それを介して開発者はアーキテクチャの比較を要求することができる。ブロック320へと続き、システムは、受け取った第1のソフトウェアコードのバージョンの概念視覚化を提供する第1のアーキテクチャモデルを作成する。モデルには、クラス、モジュール、名前空間、ならびに、ソフトウェアコードをアーキテクチャレベルで記述する他のプログラミング言語および環境の特徴を含むことができる。モデルには、1つまたは複数のインメモリデータ構造、および第1のソフトウェアコードのバージョンのアーキテクチャをビューするための表示された視覚化したものを含んでもよい。システムは、以前に記憶したソフトウェアコードのアーキテクチャモデルを作成および記憶することができる例えば、チェックイン、リリース、または他のマイルストーン。ブロック330へと続き、システムは、1つまたは複数のアーキテクチャの特徴を含む第2のソフトウェアコードのバージョンを受け取る。第2のバージョンは、同一のコードベース、または開発者がアーキテクチャの差分を識別したい関連するコードベースの次のバージョンであることができる。開発者が第2のソフトウェアバージョンを識別するか、その第2のソフトウェアバージョンは開発者が現在取り組んでいるソースコードのバージョンであると、システムが自動的に推測することができる。いくつかの実施形態において、システムは、第1のソフトウェアバージョンおよび第2のソフトウェアバージョンを、ソース管理システム内のコードブランチを統合する、またはソフトウェアコードをチェックインするといったプロセスの一部として、自動的に識別する。ブロック340へと続き、システムは、受け取った第2のソフトウェアコードのバージョンの概念視覚化を提供する第2のアーキテクチャモデルを作成する。第1のアーキテクチャモデルと同様、第2のモデルは、第2のソフトウェアコードのバージョンのアーキテクチャの構造を強調表示する。モデルには、ユニットテスト、またはソフトウェアコードの各バージョン上で実行される他のベンチマークから得られた性能情報を含むことができる。ブロック345へと続き、システムはコードベースの2つのバージョン間でコードクローン検出を行う。生の検出結果は、一方の関数/断片snippetがコードベースの第1のバージョンからのものであり、他方の関数/断片がコードベースの第2のバージョンからのものである1組のクローンの関数/断片のペアであることもあり得る。コードベースの2つのバージョン間の生のクローンペアは、アーキテクチャレベルのクローンを識別する次のステップでさらに使用される。ブロック350へと続き、システムは第1のアーキテクチャモデルおよび第2のアーキテクチャモデル、ならびに生のクローンペア情報を比較して、2つのモデル間の1つまたは複数の差分を識別する。差分には、加えられたアーキテクチャの特徴、削除されたアーキテクチャの特徴、コードクローンの検出結果に基づくコードの類似性例えば、共有されているコードの割合の識別、行われたリファクタリングの識別などを含むことができる。アーキテクチャの比較により、モデル内で使用されているクローンなどの各モデルを記述する統計、モデルの性能特性などを識別することもできる。システムは、この情報を比較して、性能またはクローンの使用の増減を示すことができる。比較により、変化していないオブジェクトを識別することもでき、これもまた開発者にとって有益な情報であり得る。ブロック360へと続き、システムは、ソフトウェアコードのバージョン間のアーキテクチャの差分を、開発者に変更を示す視覚的ディスプレイで表示する。ディスプレイには、主たるコードの構成要素を矢印と共に示すブロック図を含むことができ、その矢印は、構成要素間または他の視覚化したものとの間のデータフローを表し、アーキテクチャレベルでの変更を簡潔に伝達するのに有用である。いくつかの実施形態においては、システムは、変更の量または他の差分を示す統計をいくつかの表示された構成要素上で表示することができる。ブロック360の後、これらのステップは終了する。図4は、1実施形態における、ソフトウェア開発者にコードクローンに関して通知する、コード検証システムにより表示されるユーザインタフェースを例示するディスプレイ図である。ディスプレイには、ソフトウェアコードを編集および管理する1つまたは複数のツールを提供するIDEウィンドウ410を含む。IDEウィンドウ410には、開発者が現在ビューしているおよび/または編集しているある特定のソフトウェアコードソースファイルを表示するコードウィンドウ420を含む。IDEウィンドウ410はまた、コードクローンを検出するオプションを含む1組のコードレビューオプション430を含む。コードウィンドウ420は複数の識別されたクローンを含む。例えば、コードウィンドウ420は、強調表示された第1の識別されたコード範囲440、およびポップアップウィンドウ450内に表示された識別されたコードクローンを含む。ポップアップウィンドウ450は、クローン名、および、そのクローンに関連付けられたソースファイルを開くためのリンクなどのクローンに関する情報を提供する。開発者はこの情報を使用してコードクローンをビューすることができる。クローンが開発者のバージョンよりも最新のコードを含み、開発者がその変更をコピーする場合もある。また、開発者の変更もクローン内に属し、開発者がクローンを修正するか、クローンの所有者にクローンを修正するよう通知する場合もある。図5は、1実施形態における、ソフトウェアコードに対するアーキテクチャの変更の視覚化をソフトウェア開発者に提供する、コード検証システムにより表示されるユーザインタフェースを例示するディスプレイ図である。ディスプレイは、ソフトウェアコードを編集および管理する1つまたは複数のツールを提供するIDEウィンドウ510を含む。IDEウィンドウ510は、開発者が選択したソフトウェアプロジェクトに関連する、本明細書で説明した視覚化を表示するアーキテクチャ比較ウィンドウ520を含む。IDEウィンドウ510はまた、コードのバージョン間のアーキテクチャの差分を表示するオプションを含む1組のコードレビューオプション530を含む。アーキテクチャ比較ウィンドウ520は、アーキテクチャの特徴および変更を識別する複数のブロックを含む。例えば、アーキテクチャ比較ウィンドウ520は、第1の名前空間540を含む。名前空間540は、クラス550を含む。クラス550は、2つのバージョン間でクラスコードの80が変化していることを示す統計情報560を提供する。別のクラスは、そのクラスがコードのバージョン間で実測性能の30を失っているという指示570を提供している。別の名前空間580は、その名前空間が新しく、第1のソフトウェアコードのバージョンに存在しないこと示している。システムは、これらおよび他の変更を表示して、それにより、開発者はテキストへの生の変更に加えてコードの変更が何を意味するかについてのハイレベルのビューを受け取る。いくつかの実施形態においては、コード検証システムは、コードをレビューする複数の段階で開発者を支援する。セルフレビューである第1段階において、システムは、開発者がソフトウェアコードを修正すると、開発者がソフトウェアコードに加えているそのコードおよび/またはアーキテクチャの変更に関連するコードクローンに関して開発者に入力を与える。レビューの第2段階において、開発者の仲間または開発者の管理者などのレビュアが、システムを使用して、コードクローンの使用またはコードクローンへの変更、およびソフトウェア開発者が加えたアーキテクチャの変更の両方に関して、ソフトウェア開発者の変更をビューする。さらにハイレベルにおいては、チーム設計者または大規模なコード本体に関与する他の人達が、システムを使用して、コードの履歴における主要なポイント例えば、マイルストーンまたはリリース間で行われる個々の変更単数または複数をビューして、変更の本質を視覚化することができる。いくつかの実施形態において、コード検証システムを使用して、コードの再利用を防ぐことができる。ソフトウェアコードはしばしば、企業または他の事業体が自らのソフトウェアコードにおいては負いたくない著作権の制限または他の制限を含む。本システムを使用して、開発者が避けるべきプロジェクト内のコードにマッチするソフトウェアプロジェクト内のコードを識別することができ、それにより開発者または他のレビューが違法となるコードを除去することができる。同様に、企業は、本システムを使用して、識別された脆弱性が、その企業のコードベースのセット全体にわたって解決されることを保証することができる。本システムにより、コードの類似性の広範囲にわたる分析、および以前には利用可能ではなかったレベルでの再利用が可能となる。前述により、コード検証システムの具体的な実施形態を本明細書において例示の目的で説明したが、本発明の趣旨および範囲から逸脱することなく様々な修正を加えることができることは理解されよう。従って、本発明は、添付の特許請求の範囲による場合を除き制限されるものではない。"