(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2023167588
(43)【公開日】2023-11-24
(54)【発明の名称】判定装置、判定方法および判定プログラム
(51)【国際特許分類】
G06F 8/75 20180101AFI20231116BHJP
【FI】
G06F8/75
【審査請求】未請求
【請求項の数】11
【出願形態】OL
(21)【出願番号】P 2022078882
(22)【出願日】2022-05-12
(71)【出願人】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】110002918
【氏名又は名称】弁理士法人扶桑国際特許事務所
(72)【発明者】
【氏名】山本 知朗
(72)【発明者】
【氏名】佐々木 孝次
(72)【発明者】
【氏名】齊藤 斎
(72)【発明者】
【氏名】橋本 知樹
【テーマコード(参考)】
5B376
【Fターム(参考)】
5B376BC38
(57)【要約】
【課題】ソースコードに対する理解度の判定精度を向上する。
【解決手段】判定装置10は、記憶部11および処理部12を有する。記憶部11は、ソースコードに含まれる命令文の、ユーザによる変更履歴20を記憶する。例えば、変更履歴20は、変更前ソースコード21に対する変更後ソースコード22における差分を示す差分情報22a,22bを示す。処理部12は、変更履歴20により示される、変更された命令文の構造の種類に基づいて、ソースコードに対する当該ユーザの理解度を判定する。
【選択図】
図1
【特許請求の範囲】
【請求項1】
ソースコードに含まれる命令文の、ユーザによる変更履歴を記憶する記憶部と、
前記変更履歴により示される、変更された前記命令文の構造の種類に基づいて、前記ソースコードに対する前記ユーザの理解度を判定する処理部と、
を有する判定装置。
【請求項2】
前記処理部は、前記命令文の構造の種類と前記理解度に対する重みとを関連付けたテーブルを参照して、前記変更履歴が示す変更された前記命令文の構造の種類に応じた、前記理解度に対する重みを算出する、
請求項1記載の判定装置。
【請求項3】
前記処理部は、前記ソースコードに含まれる他の命令文の中に前記命令文が記述された場合、前記他の命令文の構造の種類と前記命令文の構造の種類とに基づいて、前記理解度を判定する、
請求項1記載の判定装置。
【請求項4】
前記処理部は、前記命令文の構造の種類と前記理解度に対する重みとを関連付けたテーブルを参照して、前記変更履歴が示す変更された前記命令文の構造の種類に応じた第1の重みと前記他の命令文の構造の種類に応じた第2の重みとを取得し、前記第1の重みを前記第2の重みにより補正し、補正後の前記第1の重みに基づいて前記理解度を判定する、
請求項3記載の判定装置。
【請求項5】
前記処理部は、前記ソースコードの変更に用いられるエディタの画面において前記命令文がカーソルにより指定されていた時間に基づいて前記理解度を判定する、
請求項1記載の判定装置。
【請求項6】
前記処理部は、
前記命令文の構造の種類と前記理解度に対する重みとを関連付けたテーブルを参照して、前記変更履歴が示す変更された前記命令文の構造の種類に応じた、前記理解度に対する第1の重みを算出し、
前記命令文が前記カーソルにより指定されていた前記時間に応じた、前記理解度に対する第3の重みを算出し、
前記第1の重みと前記第3の重みとに基づいて前記理解度を判定する、
請求項5記載の判定装置。
【請求項7】
前記処理部は、前記ソースコードのうち前記命令文から一定範囲内に記述された他の命令文が前記カーソルにより指定されていた他の時間に基づいて前記第3の重みを算出する、
請求項6記載の判定装置。
【請求項8】
前記処理部は、
前記エディタの画面において前記ソースコードに含まれる複数の命令文それぞれが前記カーソルにより指定されていた前記時間の合計を示す第1の指標値を取得し、
前記第1の重みと前記第3の重みとの積に前記第1の指標値を加算した値を前記ソースコードの規模を示す第2の指標値で割ることで前記理解度に対応するスコアを算出し、前記スコアに基づいて前記理解度を判定する、
請求項6記載の判定装置。
【請求項9】
前記命令文の構造の種類は、変数宣言と反復実行と条件分岐とのうち少なくともいずれかを含む、
請求項1記載の判定装置。
【請求項10】
コンピュータが、
ソースコードに含まれる命令文の、ユーザによる変更履歴を取得し、
前記変更履歴により示される、変更された前記命令文の構造の種類に基づいて、前記ソースコードに対する前記ユーザの理解度を判定する、
判定方法。
【請求項11】
コンピュータに、
ソースコードに含まれる命令文の、ユーザによる変更履歴を取得し、
前記変更履歴により示される、変更された前記命令文の構造の種類に基づいて、前記ソースコードに対する前記ユーザの理解度を判定する、
処理を実行させる判定プログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は判定装置、判定方法および判定プログラムに関する。
【背景技術】
【0002】
ソフトウェア開発では、情報処理技術によりソースコードの作成の支援が行われることがある。例えば、ソースコードの長さおよび複雑度にかかるコードメトリクスおよびプログラム要素の変更履歴にかかるコミット情報に基づいてLong Method Scoreと呼ばれるスコアを生成するソースコード解析装置の提案がある。提案のソースコード解析装置は、当該スコアに基づいてプログラム要素がLong Methodかどうかを判定することにより、ソースコードに含まれる分割すべきプログラム要素を提示する。
【先行技術文献】
【特許文献】
【0003】
【発明の概要】
【発明が解決しようとする課題】
【0004】
ソースコードの作成は、複数の作業者によって行われ得る。この場合、ソースコードの記述が属人化されると、例えば特定の記述箇所に対して特定の作業者しか作業できなくなるなど、ソースコードに対する作業効率が低下し得る。そこで、複数の作業者それぞれのソースコード全体に対する理解を向上させることで、属人化を防ぐことが考えられる。しかし、ソースコードに対する各作業者の理解度を適切に把握することは容易ではない。
【0005】
1つの側面では、本発明は、ソースコードに対する理解度の判定精度を向上することを目的とする。
【課題を解決するための手段】
【0006】
1つの態様では、判定装置が提供される。判定装置は、記憶部と処理部とを有する。記憶部は、ソースコードに含まれる命令文の、ユーザによる変更履歴を記憶する。処理部は、変更履歴により示される、変更された命令文の構造の種類に基づいて、ソースコードに対するユーザの理解度を判定する。
【0007】
また、1つの態様では、判定方法が提供される。また、1つの態様では、判定プログラムが提供される。
【発明の効果】
【0008】
1つの側面では、ソースコードに対する理解度の判定精度を向上できる。
【図面の簡単な説明】
【0009】
【
図1】第1の実施の形態の判定装置を説明する図である。
【
図2】第2の実施の形態の情報処理システムの例を示す図である。
【
図3】管理サーバのハードウェア例を示す図である。
【
図5】改修前ソースコードおよび改修後ソースコードの例を示す図である。
【
図6】改修前ソースコードと改修前構文解析データとの関係の例を示す図である。
【
図9】実装スコア定義テーブルの例を示す図である。
【
図11】カーソル指定時間テーブルおよび参照スコアの例を示す図である。
【
図12】ソースコードエディタ画面の例を示す図である。
【
図15】理解度判定の処理例を示すフローチャートである。
【
図17】ソースコード理解度表示画面の例を示す図である。
【発明を実施するための形態】
【0010】
以下、本実施の形態について図面を参照して説明する。
[第1の実施の形態]
第1の実施の形態を説明する。
【0011】
図1は、第1の実施の形態の判定装置を説明する図である。
判定装置10は、ソースコードに対するユーザの理解の度合い、すなわち理解度を判定する。判定装置10は、記憶部11および処理部12を有する。記憶部11は、RAM(Random Access Memory)などの揮発性記憶装置でもよいし、HDD(Hard Disk Drive)やフラッシュメモリなどの不揮発性記憶装置でもよい。処理部12は、CPU(Central Processing Unit)、DSP(Digital Signal Processor)、ASIC(Application Specific Integrated Circuit)、FPGA(Field Programmable Gate Array)などを含み得る。処理部12はプログラムを実行するプロセッサでもよい。「プロセッサ」には、複数のプロセッサの集合(マルチプロセッサ)も含まれ得る。
【0012】
記憶部11は、ソースコードに含まれる命令文の、ユーザによる変更履歴20の情報を記憶する。例えば、変更履歴20は、変更前ソースコード21に対する変更後ソースコード22の差分を示す差分情報を含む。変更前ソースコード21は、あるソースコード名で識別されるソースコードの変更前の記述である。変更後ソースコード22は、変更前ソースコード21がユーザにより変更されたソースコードである。変更履歴20は、変更前ソースコード21の本体および変更後ソースコード22の本体を含まなくてもよい。該当のソースコードは複数のユーザにより変更されてもよい。ソースコードが複数のユーザにより変更される場合、差分情報はユーザごとに変更履歴20に保持される。
【0013】
例えば、変更履歴20は、あるユーザに対応付けられた差分情報22a,22bを含む。差分情報22aは、変更後ソースコード22において、変更前ソースコード21から変更された記述が「int a = 10;」であることを示す。
【0014】
また、差分情報22bは、変更後ソースコード22において、変更前ソースコード21から変更された記述が「} else if (FLAG == 1){…」であることを示す。差分情報22bは、変更後ソースコード22において、変更前ソースコード21から追加された記述が「} else if (FLAG == 1){…」であることを示してもよい。
【0015】
変更履歴20は、処理部12により作成されてもよい。例えば、処理部12は、該当のユーザにより変更前ソースコード21が変更後ソースコード22に変更されると、変更前ソースコード21と変更後ソースコード22とを比較することで、差分情報22a,22bを取得してもよい。
【0016】
処理部12は、変更履歴20により示される、変更された命令文の構造の種類に基づいて、ソースコードに対するユーザの理解度を判定する。ここで、ソースコードの記述に用いられる命令文の構造は、命令の実行を制御するための構造である。命令文の構造の種類は、プログラム言語の規約に応じて予め定められる。命令文の構造の種類には、例えば、変数宣言、反復実行、条件分岐などがある。命令文の構造の種類は、プログラム言語で命令文の記述のために用意される予約語に対応付けられる。
【0017】
プログラム言語の一例にJava(登録商標)が挙げられる。例えば、Javaでは、32ビット整数型の変数の宣言は、予約語「int」を用いて記述される。「int」を用いて宣言された変数への値の代入を行う命令文の構造の種類は、変数宣言に分類されてもよい。また、Javaでは、条件分岐は、例えば予約語「if」や予約語「else」を用いて記述される。例えば、予約語「if」や予約語「else」を用いて記述される条件分岐の命令文の構造の種類は、if-else文である。条件分岐は、予約語「switch」や予約語「case」などを用いて記述されることもある。また、反復実行は、例えば、for文やwhile文を用いて記述される。命令文の他の構造についても、予約語が予め定められている。このように、処理部12は、該当の命令文に含まれる予約語や該当の命令文に関連する予約語により、該当の命令文の構造の種類を分類し得る。
【0018】
命令文の構造は、その種類によって、ソースコードへの記述の難易度が変わる。例えば、変数宣言のようにソースコードの比較的狭い範囲に対する理解があれば編集を行える命令文の構造もあれば、条件分岐のようにソースコードの比較的広い範囲に対する理解がなければ編集を行えない命令文の構造もある。この場合、変数宣言の編集は比較的難易度が低いが、条件分岐の編集は比較的難易度が高いと言える。
【0019】
そこで、処理部12は、例えば、変更履歴20により示される差分情報22aから、変更された命令文の構造の種類が変数宣言であることを特定する。すると、処理部12は、変数宣言の変更に応じた、ソースコードに対するユーザの理解度の第1の重みw1を決定する。また、処理部12は、例えば、変更履歴20により示される差分情報22bから、変更された命令文の構造の種類がif-else文であることを特定する。すると、処理部12は、if-else文の変更に応じた、ソースコードに対するユーザの理解度の第2の重みw2を決定する。
【0020】
例えば、命令文の構造の種類に応じた理解度に対する重みを示す情報は、記憶部11に予め記憶されてもよい。この場合、処理部12は、記憶部11に記憶された当該重みを示す情報に基づいて、ソースコードにおいて変更が行われた命令文の構造の種類に応じた、理解度に対する重みを取得できる。
【0021】
処理部12は、例えば変更が行われた命令文の構造の種類に応じた各重みの線形結合により、ソースコードに対するユーザの理解度を示す指標値を求めてもよい。上記の例では、処理部12は、当該指標値Wを、W=α*w1+β*w2と求める。例えば、指標値Wの値が大きい程、ユーザの理解度は高いとする。この場合、w1<w2である。変数宣言はソースコードへの理解が比較的浅くても記述できるが、if-else文のような条件分岐はソースコードへの理解が比較的深くなければ記述できないからである。
【0022】
ここで、係数α,βは重みを補正する係数、あるいは他の重みである。例えばα,βは、何れも正の実数である。α=β=1でもよい。あるいは、処理部12は、α,βそれぞれの値を、ソースコードの変更時において、ソースコードの編集に用いられるエディタ上での各変更箇所に対するユーザの注目時間に応じて決定してもよい。例えば、処理部12は、α,βそれぞれの値を、該当の命令文の構造に関する記述箇所に対する、当該エディタ上でのカーソルの指定時間、あるいは、当該指定時間に対応する指標値に比例する値としてもよい。
【0023】
こうして、処理部12は、例えば、上記の指標値Wにより、ソースコードに対するユーザの理解度を決定する。処理部12は、指標値Wを、そのままユーザの理解度としてもよいし、指標値Wからユーザの理解度が「高い」、「中程度」、「低い」といった理解度の度合い、あるいは理解度のランクを更に判定してもよい。そして、処理部12は、ソースコードに対するユーザの理解度を示す情報を出力する。例えば、処理部12は、ソースコードに対する複数のユーザそれぞれの理解度を示す出力画面を、判定装置10に接続された表示装置に表示させてもよい。処理部12は、ネットワークを介して判定装置10以外の情報処理装置に当該出力画面の情報を送信してもよい。
【0024】
このように、判定装置10によれば、ソースコードに含まれる命令文の、ユーザによる変更履歴20が取得される。変更履歴20により示される、変更された命令文の構造の種類に基づいて、ソースコードに対するユーザの理解度が判定される。
【0025】
ここで、ソースコードに対するユーザの理解度を判定する比較例の方法として、例えば該当のユーザが該当のソースコードの編集を行ったことがあるか否かを基準に理解度を判定することが考えられる。しかし、比較例の方法では、ユーザがソースコードの編集を行ったことがあれば、該当のユーザがソースコードに対する理解があり、ユーザがソースコードの編集を行ったことがなければ、該当のユーザがソースコードに対する理解がないと判定できるだけである。すなわち、比較例の方法では、ソースコードに対するユーザの理解度の判定の精度が低い。
【0026】
そこで、判定装置10は、変更された命令文の構造の種類を基にユーザの理解度の判定を行うことで、ソースコードに対するユーザの理解度の判定精度を向上できる。具体的には、上記のように、命令文の構造の種類に応じて、ソースコードにおける記述の難易度は異なる。比較的難易度が高い場合、該当の記述の編集には、ソースコードにおける広範な理解を要する。一方、比較的難易度が低い場合、該当の記述の編集には、ソースコードにおける限定的な理解で足りる。このため、判定装置10は、変更された命令文の構造の種類を基に変更の難易度に応じたユーザの理解度を多段階に詳細に判定可能になる。
【0027】
例えば、ソフトウェアを開発するユーザは、該当のソースコードに対する複数のユーザの理解度の、判定装置10による判定結果を示す出力画面を確認することで、ソースコードに対する自身または他のユーザの理解度を把握できる。例えば、ユーザは、理解度の比較的高いユーザと、理解度の比較的低いユーザとを組ませるペアプログラミングなどを計画することで、複数のユーザそれぞれのソースコード全体に対する理解度を効率的に向上させることができる。こうして、判定装置10は、ソースコード作成における属人化の抑制を支援できる。その結果、判定装置10は、ソフトウェアの効率的な開発を支援できる。
【0028】
例えば、ソフトウェアの開発手法として、アジャイル開発が用いられることがある。アジャイル開発では、複数の作業者により、ソフトウェアの機能単位に、開発、テスト、実装などの工程が比較的短期間で繰り返し行われ、開発効率の向上のために、ソースコードの記述の属人化の防止が特に求められる。このため、判定装置10によるソースコードに対する理解度の判定は、例えば、アジャイル開発を行う現場において特に有効である。
【0029】
以下では、より具体的な例により、判定装置10の機能を更に詳細に説明する。
[第2の実施の形態]
次に、第2の実施の形態を説明する。
【0030】
図2は、第2の実施の形態の情報処理システムの例を示す図である。
第2の実施の形態の情報処理システムは、管理サーバ100および端末装置200,300を含む。管理サーバ100および端末装置200,300は、ネットワーク40に接続される。ネットワーク40は、例えばLAN(Local Area Network)である。ネットワーク40は、WAN(Wide Area Network)やインターネットなどでもよい。
【0031】
管理サーバ100は、複数のユーザによるソフトウェアの開発を支援するサーバコンピュータである。ソフトウェアの開発手法には、例えばアジャイル開発が用いられる。管理サーバ100は、ソフトウェアのソースコードをバージョンごとに管理するリポジトリとして機能する。また、管理サーバ100は、ソースコードに対する複数のユーザそれぞれの理解度を判定し、ユーザに提供する。管理サーバ100は、第1の実施の形態の判定装置10の一例である。
【0032】
端末装置200,300は、ユーザによるソースコードの編集に用いられるクライアントコンピュータである。例えば、端末装置200はユーザXにより利用される。また、端末装置300は、ユーザYにより利用される。端末装置200,300は、ソースコードエディタとして機能する。ソースコードエディタは、ユーザによるソースコードの編集を支援するツールである。端末装置200,300は、改修対象のソースコードを管理サーバ100から取得し、ユーザによる改修を受け付ける。端末装置200,300は、ユーザによる改修後のソースコードを管理サーバ100に登録する。例えば、ユーザX,Yは、あるソフトウェアのソースコードの作成を行うチームのメンバである。図示を省略しているが、当該チームにはユーザX,Y以外のメンバも所属し得る。
【0033】
管理サーバ100は、複数のユーザそれぞれの識別情報に対応付けて、当該ユーザによる改修前のソースコードと、改修後のソースコードとを管理する。改修前のソースコードは、改修前ソースコードと言われる。改修後のソースコードは、改修後ソースコードと言われる。
【0034】
図3は、管理サーバのハードウェア例を示す図である。
管理サーバ100は、CPU101、RAM102、HDD103、GPU(Graphics Processing Unit)104、入力インタフェース105、媒体リーダ106およびNIC(Network Interface Card)107を有する。なお、CPU101は、第1の実施の形態の処理部12の一例である。RAM102またはHDD103は、第1の実施の形態の記憶部11の一例である。
【0035】
CPU101は、プログラムの命令を実行するプロセッサである。CPU101は、HDD103に記憶されたプログラムやデータの少なくとも一部をRAM102にロードし、プログラムを実行する。なお、CPU101は複数のプロセッサコアを含んでもよい。また、管理サーバ100は複数のプロセッサを有してもよい。以下で説明する処理は複数のプロセッサまたはプロセッサコアを用いて並列に実行されてもよい。また、複数のプロセッサの集合を「マルチプロセッサ」または単に「プロセッサ」と言うことがある。
【0036】
RAM102は、CPU101が実行するプログラムやCPU101が演算に用いるデータを一時的に記憶する揮発性の半導体メモリである。なお、管理サーバ100は、RAM以外の種類のメモリを備えてもよく、複数個のメモリを備えてもよい。
【0037】
HDD103は、OS(Operating System)やミドルウェアやアプリケーションソフトウェアなどのソフトウェアのプログラム、および、データを記憶する不揮発性の記憶装置である。なお、管理サーバ100は、フラッシュメモリやSSD(Solid State Drive)などの他の種類の記憶装置を備えてもよく、複数の不揮発性の記憶装置を備えてもよい。
【0038】
GPU104は、CPU101からの命令に従って、管理サーバ100に接続されたディスプレイ41に画像を出力する。ディスプレイ41としては、CRT(Cathode Ray Tube)ディスプレイ、液晶ディスプレイ(LCD:Liquid Crystal Display)、プラズマディスプレイ、有機EL(OEL:Organic Electro-Luminescence)ディスプレイなど、任意の種類のディスプレイを用いることができる。
【0039】
入力インタフェース105は、管理サーバ100に接続された入力デバイス42から入力信号を取得し、CPU101に出力する。入力デバイス42としては、マウス、タッチパネル、タッチパッド、トラックボールなどのポインティングデバイス、キーボード、リモートコントローラ、ボタンスイッチなどを用いることができる。また、管理サーバ100に、複数の種類の入力デバイスが接続されていてもよい。
【0040】
媒体リーダ106は、記録媒体43に記録されたプログラムやデータを読み取る読み取り装置である。記録媒体43として、例えば、磁気ディスク、光ディスク、光磁気ディスク(MO:Magneto-Optical disk)、半導体メモリなどを使用できる。磁気ディスクには、フレキシブルディスク(FD:Flexible Disk)やHDDが含まれる。光ディスクには、CD(Compact Disc)やDVD(Digital Versatile Disc)が含まれる。
【0041】
媒体リーダ106は、例えば、記録媒体43から読み取ったプログラムやデータを、RAM102やHDD103などの他の記録媒体にコピーする。読み取られたプログラムは、例えば、CPU101によって実行される。なお、記録媒体43は可搬型記録媒体であってもよく、プログラムやデータの配布に用いられることがある。また、記録媒体43やHDD103を、コンピュータ読み取り可能な記録媒体と言うことがある。
【0042】
NIC107は、ネットワーク40に接続され、ネットワーク40を介して他のコンピュータと通信を行うインタフェースである。NIC107は、例えば、スイッチやルータなどの通信装置とケーブルで接続される。NIC107は、無線通信インタフェースでもよい。
【0043】
端末装置200,300も管理サーバ100と同様のハードウェアにより実現される。
図4は、管理サーバの機能例を示す図である。
管理サーバ100は、ソースコード記憶部110、制御情報記憶部120および制御部130を有する。ソースコード記憶部110および制御情報記憶部120には、RAM102やHDD103の記憶領域が用いられる。制御部130は、RAM102に記憶されたプログラムがCPU101により実行されることで実現される。
【0044】
ソースコード記憶部110は、ソフトウェアのソースコードを記憶する。ソースコードは複数のユーザにより改修される。ソースコード記憶部110は、改修を行ったユーザの識別情報に対応付けて、当該ソースコードの改修前後の内容を保持する。例えば、ソースコード記憶部110は、改修前ソースコード111と改修後ソースコード112とを記憶する。改修前ソースコード111は、改修前のソースコードである。改修後ソースコード112は、改修前ソースコード111に対するユーザXによる改修後のソースコードである。図示を省略しているが、ソースコード記憶部110は、ユーザYを含む他のメンバに対応付けられた改修後ソースコードと改修前ソースコードとを保持してもよい。ここで、改修前ソースコード111は、変更前ソースコード21の一例である。改修後ソースコード112は、変更後ソースコード22の一例である。
【0045】
制御情報記憶部120は、制御部130によるユーザのソースコードに対する理解度の判定に用いられる制御情報を記憶する。制御情報は、改修前構文解析データ121、改修後構文解析データ122、実装スコア定義テーブル123、カーソル指定時間テーブル124、スコア管理テーブル125および理解度テーブル126を含む。
【0046】
改修前構文解析データ121は、改修前ソースコード111に対する構文解析の結果を示す情報である。改修前構文解析データ121は、改修前ソースコード111に含まれる命令文の構造の解析結果を含む。
【0047】
改修後構文解析データ122は、改修後ソースコード112に対する構文解析の結果を示す情報である。改修後構文解析データ122は、改修後ソースコード112に含まれる命令文の構造の解析結果を含む。
【0048】
実装スコア定義テーブル123は、ソースコードにおける命令文の構造の種類ごとの実装スコアを定める情報である。実装スコアは、ソースコードに対するユーザの理解度の重みを示す。ここで、ソースコードに対するユーザの理解度は、スコア化されて評価される。ユーザの理解度に対応するスコアは理解度判定スコアと言われる。理解度判定スコアが大きい程、ユーザの理解度は高いと評価される。理解度判定スコアが小さい程、ユーザの理解度は低いと評価される。この場合、ソースコードにおける編集の難易度が高い命令文の構造の種類に対する実装スコアは大きくなる。一方、ソースコードにおける編集の難易度が低い命令文の構造の種類に対する実装スコアは小さくなる。
【0049】
カーソル指定時間テーブル124は、ユーザによるソースコードの編集時におけるソースコードエディタ上でのカーソル指定時間の取得結果を示す情報である。カーソル指定時間は、ソースコードエディタに表示されるソースコードにおいて、カーソルが当てられた箇所ごとに、当該カーソルが当てられていた時間として取得される。改修前ソースコード111が改修後ソースコード112に変更される間に、ある箇所に複数回カーソルが当てられた場合、各回の合計時間が当該箇所に対するカーソル指定時間となる。
【0050】
スコア管理テーブル125は、ソースコードに対するユーザの理解度の判定の基になるスコアを保持するテーブルである。ユーザの理解度の判定の基になるスコアには、実装スコアおよび参照スコアが含まれる。実装スコアは、ユーザにより変更された命令文の構造の種類と、実装スコア定義テーブル123とに基づいて決定される。参照スコアは、カーソル指定時間テーブル124に基づいて決定される。また、実装スコアおよび参照スコアに基づいて、ユーザの理解度に対応する理解度判定スコアが決定される。
【0051】
理解度テーブル126は、ソースコードに対して判定されたユーザの理解度の情報を保持する情報である。
制御部130は、ソースコードに対するユーザの理解度を判定する。制御部130は、構文解析部131、カーソル指定時間取得部132、構文解析結果比較部133および理解度判定部134を有する。
【0052】
構文解析部131は、ソースコードに含まれる構文の解析、すなわち、構文解析を行う。例えば、構文解析部131は、改修前ソースコード111の構文解析を行い、改修前構文解析データ121を生成する。また、構文解析部131は、改修後ソースコード112の構文解析を行い、改修後構文解析データ122を生成する。
【0053】
カーソル指定時間取得部132は、端末装置200,300で実行されるソースコードエディタからカーソル指定時間を取得し、カーソル指定時間テーブル124に記録する。
構文解析結果比較部133は、改修前構文解析データ121と改修後構文解析データ122とを比較し、改修前後でのソースコードの差分を示す変更履歴を取得する。
【0054】
理解度判定部134は、構文解析結果比較部133により取得された変更履歴と、実装スコア定義テーブル123とに基づいて、ソースコードに対するユーザの理解度を判定する。具体的には、理解度判定部134は、変更履歴からユーザにより変更された命令文の構造の種類を抽出し、実装スコア定義テーブル123に基づいて、当該命令文の構造の種類に応じた実装スコアを決定する。
【0055】
また、理解度判定部134は、カーソル指定時間テーブル124に基づいて、変更された命令文の構造が記述された箇所のカーソル指定時間に応じた参照スコアを決定する。そして、理解度判定部134は、決定した実装スコアと参照スコアとに基づいて、理解度判定スコアを算出し、理解度判定スコアに応じて、ユーザの理解度を判定する。理解度判定部134は、理解度判定スコアの算出に用いる実装スコアや参照スコアを、スコア管理テーブル125により管理する。理解度判定スコアは、値が大きいほどユーザの理解度が高く、値が小さいほどユーザの理解度が低いことを示す。理解度判定部134は、判定した理解度を、ソースコードの識別情報とユーザの識別情報とに対応付けて、理解度テーブル126に記録する。
【0056】
理解度判定部134は、理解度テーブル126に基づいて、ソースコードに対するユーザの理解度を示す情報を出力する。例えば、理解度判定部134は、ソースコードに対するユーザの理解度を示す画面を、ディスプレイ41に表示させたり、端末装置200,300のディスプレイに表示させたりしてもよい。
【0057】
次に、プログラム言語の一例としてJavaを用いる場合の改修前ソースコード111および改修後ソースコード112の例を説明する。
図5は、改修前ソースコードおよび改修後ソースコードの例を示す図である。
【0058】
例えば、改修前ソースコード111および改修後ソースコード112は、メソッド名「SampleMethod」のメソッドの定義を示す。例えば、改修前ソースコード111の「int tmp = 0;」の記述は、改修後ソースコード112では「int tmp = 100;」と変更されている。また、例えば、改修前ソースコード111では、if文の「FLAG == 1」のときの条件分岐がないのに対し、改修後ソースコード112では当該if文において「FLAG == 1」のときの条件分岐が追加される変更が行われている。改修後ソースコード112における「FLAG == 1」のときの条件分岐の記述は、「} else if (FLAG == 1){」、「result = 11;」に相当する。
【0059】
改修後ソースコード112の上記以外の箇所は、改修前ソースコード111から変更されていない。
図6は、改修前ソースコードと改修前構文解析データとの関係の例を示す図である。
【0060】
改修前構文解析データ121は、改修前ソースコード111に基づいて、構文解析部131により生成され、制御情報記憶部120に格納される。改修前構文解析データ121は、レコード名data1~data5で識別される5つのレコードを有する。data1~data5は、改修前ソースコード111に含まれる構文の情報を示す。構文の情報には、「int」、「if」、「switch」などの予約語に応じた命令文の構造の種類を示す情報が含まれる。構文解析部131は、改修前ソースコード111の構文解析を行うことで、data1~data5を生成する。構文解析には、既存の方法が用いられる。
【0061】
例えば、data1は、「int tmp = 0;」に対応する変数宣言(variableDeclaration)を示す。
また、data2~data5は、「switch(param){」に対応するswitch文のグループ(SwitchBlockStatementGroup)の要素を示す。data2は、「case 1:」の場合である。data3,4は、「case 10:」の場合である。後述されるように「case 10:」の場合は、「FLAG」の値により更に細分化される。data5は、「default:」の場合である。
【0062】
図7は、改修前構文解析データの例を示す図である。
改修前構文解析データ121の各レコードは、次の情報を有する。例えば、前述のように、data1は、「int tmp = 0;」に対応する変数宣言「variableDeclaration tmp = 0」を有する。
【0063】
また、data2~data5は、「switch(param){」に対応するswitch文のグループ「SwitchBlockStatementGroup」の情報に加えて、下記の情報を有する。
【0064】
data2は、「case 1:」に対応するswitch文のcase表現「SwitchLabel case:param == 1」および変数表現「Expression result = 10」を有する。
【0065】
data3は、「case 10:」に対応するswitch文のcase表現「SwitchLabel case:param == 10」を有する。また、data3は、「if FLAG == 0」に対応する条件分岐「IfThenElseStatement (FLAG == 0)= True」を有する。更に、data3は、「result = 10;」に対応する変数宣言「variableDeclaration result = 10」を有する。例えば、予約語「int」で宣言された変数「result」へ値を代入する命令文の構造の種類は、変数宣言とされ得る。
【0066】
data4は、「case 10:」に対応するswitch文のcase表現「SwitchLabel case:param == 10」を有する。また、data4は、「else」に対応する条件分岐「IfThenElseStatement (FLAG != 0)= True」を有する。更に、data4は、「result = 100;」に対応する変数宣言「variableDeclaration result = 100」を有する。
【0067】
data5は、「default:」に対応するswitch文のcase表現「SwitchLabel default」および「break;」に対応するBreak文「Break」を有する。
【0068】
このように、命令文の構造が入れ子になる場合、上位の命令文の構造と、下位の命令文の構造とがグループ化される。例えば、data2は、上位の命令文の構造「switch(param)」と、下位の命令文の構造「case 1:」とを示す情報を含む。
【0069】
また、data3は、上位の命令文の構造「switch(param)」と、下位の命令文の構造「case 10:」とを示す情報を含む。data3は、上位の命令文の構造「case 10:」と、下位の命令文の構造「if FLAG == 0」とを示す情報を含む。更に、data3は、上位の命令文の構造「if FLAG == 0」と、下位の命令文の構造「result = 10;」とを示す情報を含む。data4,data5も同様である。
【0070】
図8は、改修後構文解析データの例を示す図である。
改修後構文解析データ122は、改修後ソースコード112に基づいて、構文解析部131により生成され、制御情報記憶部120に格納される。改修後構文解析データ122は、レコード名data1a~data6aで識別される6つのレコードを有する。
【0071】
data1aは、「int tmp = 100;」に対応する変数宣言「variableDeclaration tmp = 100」を有する。
data2a,data3aは、それぞれdata2,data3と同じである。
【0072】
data4aは、改修後ソースコード112で追加された条件分岐の記述「} else if (FLAG == 1){」、「result = 11;」に相当する。
data5a,data6aは、それぞれdata4,data5と同じである。ただし、data5aは、該当のif文においてdata4aで示される条件分岐が追加されていることから、当該if文に係る条件が「((FLAG != 0) && (FLAG != 1))=True」と記載される。
【0073】
構文解析結果比較部133は、改修前構文解析データ121におけるdata1~data5の各レコードを、改修後構文解析データ122におけるdata1a~data6aの各レコードと順番に比較する。構文解析結果比較部133は、当該比較により、改修前ソースコード111に対する改修後ソースコード112の差分に対応する命令文の構造の種類を特定することができる。
【0074】
例えば、構文解析結果比較部133は、改修前構文解析データ121のdata1と、改修後構文解析データ122のdata1aとの比較により、変数tmpの変数宣言に関する変更が行われたことを特定する。
【0075】
また、構文解析結果比較部133は、改修前構文解析データ121のdata2,data3と、改修後構文解析データ122のdata2a,data3aとの比較により、data2a,data3aには変更がないことを特定する。
【0076】
また、構文解析結果比較部133は、改修後構文解析データ122のdata4aに対応するレコードが、改修前構文解析データ121に存在しないことを検出する。すると、構文解析結果比較部133は、data4aで示される命令文の構造のグループ、すなわち、switch文、if文および変数宣言の組合せに関する変更が行われたことを特定する。
【0077】
また、構文解析結果比較部133は、改修前構文解析データ121のdata4,data5と、改修後構文解析データ122のdata5a,data6aとの比較により、data5a,data6aには変更がないことを特定する。ここで、data5aにおける条件「((FLAG != 0) && (FLAG != 1))=True」は、該当のif文の他の条件「FLAG == 0」および「FLAG == 1」の何れでもないことを示す。すなわち、条件「((FLAG != 0) && (FLAG != 1))=True」は、「else」の記述に相当するので、構文解析結果比較部133は、data4とdata5aとが同じであり、変更がないと判断する。
【0078】
なお、構文解析結果比較部133は、改修後構文解析データ122のdata1a~data6aそれぞれを、改修前構文解析データ121のdata1~data5のうちの一致する項目が多いレコードに優先的に対応付けてもよい。ここで、項目は、例えば、レコードに含まれる命令文の構造の情報(例えば、SwitchLabel case:param == 10など)と、その入れ子構造とを含む。入れ子構造は、例えばcase文の中にif文が記述されるというように、ある命令文の中に、他の命令文が記述される構造である。例えば、data3とdata3aとでは、両レコードに含まれる項目は全て一致する。構文解析結果比較部133は、data1a~data6aのうち、data1~data5の何れにも対応付けられないレコードを、ソースコードに新たに追加された記述に対応する命令文の構造を示すレコードと特定してもよい。
【0079】
構文解析結果比較部133は、こうして改修前構文解析データ121と改修後構文解析データ122とを比較することで、改修前ソースコード111に対する改修後ソースコード112の差分を示す変更履歴を取得し、制御情報記憶部120に格納する。
【0080】
図9は、実装スコア定義テーブルの例を示す図である。
実装スコア定義テーブル123は、制御情報記憶部120に予め格納される。実装スコア定義テーブル123は、ソースコード構造種別および実装スコアの項目を含む。ソースコード構造種別は、ソースコードに記述される命令文の構造の種類が登録される。命令文の構造の種類は、プログラム言語の規約に応じて予め定められる。命令文の構造の種類は、プログラム言語で命令文の記述のために用意される予約語に対応付けられる。実装スコアの項目には、該当の命令文の構造の種類に対応する実装スコアが登録される。
【0081】
例えば、実装スコア定義テーブル123は、ソースコード構造種別「PackageName」、実装スコア「1」のレコードを有する。このレコードは、変更された命令文の構造の種類が「PackageName」、すなわち、パッケージ宣言の場合に実装スコアが「1」であることを示す。
【0082】
また、実装スコア定義テーブル123は、ソースコード構造種別「VariableDeclaration」、実装スコア「1」のレコードを有する。このレコードは、変更された命令文の構造の種類が「VariableDeclaration」、すなわち、変数宣言の場合に実装スコアが「1」であることを示す。
【0083】
また、実装スコア定義テーブル123は、ソースコード構造種別「Switch Expression Block」、実装スコア「5」のレコードを有する。このレコードは、変更された命令文の構造の種類が「Switch Expression Block」、すなわち、switch文による条件分岐の場合、実装スコアが「5」であることを示す。
【0084】
また、実装スコア定義テーブル123は、ソースコード構造種別「case Expression」、実装スコア「10」のレコードを有する。このレコードは、変更された命令文の構造の種類が「case Expression」、すなわち、case文による条件分岐の場合、実装スコアが「10」であることを示す。
【0085】
また、実装スコア定義テーブル123は、ソースコード構造種別「If Expression Statement」、実装スコア「10」のレコードを有する。このレコードは、変更された命令文の構造の種類が「If Expression Statement」、すなわち、if文またはif-else文による条件分岐の場合、実装スコアが「10」であることを示す。
【0086】
実装スコア定義テーブル123には、他のソースコード構造種別、すなわち、他の命令文の構造の種類に対しても、実装スコアが予め登録される。
ここで、実装スコア定義テーブル123では、変更時の難易度が高いソースコード構造種別であるほど、実装スコアが高くなるように定義される。ソースコード構造種別ごとの変更時の難易度やそれに応じた実装スコアは、例えば、開発経験が比較的長く、プログラミングに対する深い知識を有するユーザにより、当該ユーザの経験に基づいて決定され、実装スコア定義テーブル123に設定される。
【0087】
図10は、総実装スコアの決定例を示す図である。
構文解析結果比較部133は、改修後構文解析データ122のdata1a~data6aのうち、改修前ソースコード111に対する改修後ソースコード112の差分に対応するdata1a,data4aに実装フラグ「1」を設定する。一方、構文解析結果比較部133は、data2a,data3a,data5a,data6aに実装フラグ「0」を設定する。実装フラグは、改修後ソースコード112のうちユーザにより変更された箇所を示すフラグであり、変更履歴の情報に相当する。改修後構文解析データ122の変更された箇所に対応するレコードには、実装フラグ「1」が設定され、それ以外の箇所に対応するレコードには、実装フラグ「0」が設定される。
【0088】
また、理解度判定部134は、改修後構文解析データ122の各レコードに対して、総実装スコアを求める。具体的には、理解度判定部134は、該当のレコードに含まれる命令文の構造の種類に対応する実装スコアを、実装スコア定義テーブル123から取得し、合計することで、当該レコードに対する総実装スコアを算出する。
【0089】
例えば、data1aの場合、命令文の構造の種類は「variableDeclaration」で示される変数宣言である。このため、理解度判定部134は、実装スコア定義テーブル123に基づいて、data1aに対応する総実装スコアを「1」と算出する。
【0090】
また、data4aの場合、1つ目の命令文の構造の種類は「SwitchBlockStatementGroup」で示されるswitch文による条件分岐である。2つ目の命令文の構造の種類は「SwitchLabel case…」で示されるcase文による条件分岐である。3つ目の命令文の構造の種類は「IfThenElseStatement…」で示されるif-else文による条件分岐である。4つ目の命令文の構造の種類は「variableDeclaration」で示される変数宣言である。このため、理解度判定部134は、実装スコア定義テーブル123に基づいて、data4aに対応する総実装スコアを、「5+10+10+1=26」と算出する。
【0091】
理解度判定部134は、他のレコードについても同様に、実装スコア定義テーブル123に基づいて、総実装スコアを求めることができる。ただし、後述されるように、理解度判定フラグの計算に用いられる総実装スコアは、実装フラグ「1」のレコードの総実装スコアである。このため、理解度判定部134は、実装フラグ「0」のレコードに対する総実装スコアの計算を省略してもよい。
【0092】
また、構文解析結果比較部133は、改修後構文解析データ122における実装フラグ「1」に対応するレコードについて、改修前ソースコード111に対する改修後ソースコード112の差分の行を特定し、当該差分の行に対して更に実装フラグ「1」を付与する。構文解析結果比較部133は、改修後ソースコード112の当該差分の行以外の行には、実装フラグ「0」を付与する。改修後ソースコード112の行単位の実装フラグは、後述されるスコア管理テーブル125に登録される。
【0093】
図11は、カーソル指定時間テーブルおよび参照スコアの例を示す図である。
カーソル指定時間テーブル124は、例えば、端末装置200のソースコードエディタ上で、ユーザXにより改修前ソースコード111が改修後ソースコード112に改修された際の、改修後ソースコード112の各行に対するカーソル指定時間を示す。カーソル指定時間テーブル124は、#、ソースコードおよびカーソル指定時間の項目を含む。
【0094】
#の項目には、改修後ソースコード112の行を識別する番号が登録される。ソースコードの項目には、該当の行におけるソースコードの記述が登録される。カーソル指定時間の項目には、カーソル指定時間が登録される。
【0095】
例えば、カーソル指定時間テーブル124は、#「1」、ソースコード「int sampleMethod(int param){」、カーソル指定時間「0sec」のレコードを有する。このレコードは、改修後ソースコード112の行番号「1」に対応する「int sampleMethod(int param){」の記述について、ソースコードエディタ上でカーソルが当てられた時間が0sec、すなわち、0秒であったことを示す。ここで、「sec」はsecond(秒)の略である。
【0096】
また、カーソル指定時間テーブル124は、#「4」、ソースコード「switch(param){」、カーソル指定時間「7sec」のレコードを有する。このレコードは、改修後ソースコード112の行番号「4」に対応する「switch(param){」の記述について、ソースコードエディタ上でカーソルが当てられた時間が7秒であったことを示す。
【0097】
理解度判定部134は、カーソル指定時間テーブル124に基づいて、各行に対する参照スコアを算出する。具体的には、理解度判定部134は、カーソル指定時間を参照基準点の前後の複数行に整数値で均等配分することで、各行に対する参照スコアを算出する。参照基準点は、実際にカーソルが当てられた行である。当該複数行の数は、一例では、参照基準点の行を含めて5行である。理解度判定部134は、カーソル指定時間のうち、5行で均等配分できずに余った分を、参照基準点に割り当てる。ここで、参照基準点からカーソル指定時間が配分される行を、周辺点と言う。第1参照基準点が第2参照基準点の周辺点の場合、第1参照基準点のカーソル指定時間から第1参照基準点に割り当てられるスコアと、第2参照基準点のカーソル指定時間から第1参照基準点に割り当てられるスコアとの和が、第1参照基準点の参照スコアとなる。理解度判定部134は、カーソル指定時間が1秒および2秒である参照基準点に対しては、周辺点を無しとする。
【0098】
例えば、カーソル指定時間テーブル124の#「4」の行を参照基準点として着目すると、理解度判定部134は、#「2,3,5,6」の行を当該参照基準点に対する周辺点とする。この場合、理解度判定部134は、#「2~6」の5行に、カーソル指定時間7秒を、整数値で、1ずつ均等配分する。これにより、#「3,4,5,6」の行の参照スコアは「1」になる。そして、理解度判定部134は、余った2を、参照基準点である#「4」の行に加算し、#「4」の行に対する参照スコアを「3」とする。
【0099】
また、理解度判定部134は、例えば#「16」の行については、#「17」の参照基準点の周辺点でもあるため、#「16」の参照基準点としてのスコア「1」に、#「17」の周辺点としてのスコア「1」を加算して、参照スコアを「2」とする。
【0100】
図12は、ソースコードエディタ画面の例を示す図である。
ソースコードエディタ画面400は、端末装置200,300それぞれにより表示されるソースコードエディタの画面である。例えば、カーソル指定時間の計測機能は、端末装置200,300が実行するソースコードエディタのプラグイン機能として実装される。
【0101】
ソースコードエディタ画面400は、編集対象のソースコードの内容を表示する。例えば、ユーザXは、端末装置200を操作してソースコードエディタ画面400に改修前ソースコード111の内容を表示させ、編集することで、改修後ソースコード112を作成できる。ソースコードエディタ画面400は、カーソル401および支援情報表示欄402を含む。
【0102】
カーソル401は、ユーザXによりポインティングデバイスなどを用いて指定された箇所を表す画面要素である。例えば、カーソル401は、ソースコードの指定された行を強調して表示する。ユーザXは、カーソル401で指定された箇所を、キーボードなどの入力デバイスを用いて編集する。
図12の例では、カーソル401が9行目に当てられている。この状態では、9行目を参照基準点としたカーソル指定時間が計測される。
【0103】
支援情報表示欄402は、カーソル401で指定された箇所に含まれる変数の定義情報などの支援情報を表示する欄である。ソースコードエディタ画面400の例では、カーソル401で指定された「result = 1;」の記述に対して、変数「result」の定義情報が支援情報表示欄402に表示されている。また、ソースコードエディタ画面400の例では、カーソル401で指定された「result = 1;」の記述に対して、他の箇所に記述された「result」の文字列も強調して表示されている。
【0104】
ユーザは、ソースコードを参照する際、ソースコードエディタ上のキーワード検索で変数を追っていくことになる。ユーザがキーワード検索でヒットした箇所を中心に目でソースコードの記述を追う場合、カーソル指定時間は長くなり易い。カーソル指定時間が長いほど、ユーザによる該当の箇所およびその周辺の記述に対する思考時間も長いと推定される。ユーザによる思考時間が長くなれば、ユーザによる該当の記述に関する理解も高まる。このため、理解度判定部134は、ソースコードに対するユーザの理解度の判定に、カーソル指定時間を考慮することで、理解度の判定をより高精度に行える。
【0105】
図13は、スコア管理テーブルの例を示す図である。
スコア管理テーブル125は、#、ソースコード、実装フラグ(a)、総実装スコア(b)、参照スコア(c)およびa*b*cの項目を含む。#の項目には、レコードを識別する番号が登録される。ソースコードの項目には、ソースコードの行を識別する番号が登録される。ソースコードの項目には、ソースコードの該当の行の内容が登録される。実装フラグ(a)の項目には、実装フラグが登録される。総実装スコア(b)の項目には、当該行に対応する、改修後構文解析データ122におけるレコードに対して計算された総実装スコアが登録される。参照スコア(c)の項目には、参照スコアが登録される。a*b*cの項目には、実装フラグ(a)*総実装スコア(b)*参照スコア(c)の値が登録される。
【0106】
例えば、スコア管理テーブル125は、#「1」、ソースコード「int sampleMethod(int param){」、実装フラグ(a)=「0」、総実装スコア(b)=「0」、参照スコア(c)=「0」、a*b*c=「0」のレコードを有する。このレコードは、改修後ソースコード112の#「1」の記述「int sampleMethod(int param){」について、実装フラグa=0、総実装スコアb=0、参照スコアc=0であり、a*b*c=0*0*0=0であることを示す。
【0107】
また、スコア管理テーブル125は、#「11」、ソースコード「}else if (FLAG == 1){」、実装フラグ(a)=「1」、総実装スコア(b)=「26」、参照スコア(c)=「2」、a*b*c=「52」のレコードを有する。このレコードは、改修後ソースコード112の#「11」の記述「}else if (FLAG == 1){」について、実装フラグa=1、総実装スコアb=26、参照スコアc=2であり、a*b*c=1*26*2=52であることを示す。
【0108】
ここで、改修後ソースコード112の#「12」に対応する記述「result = 11;」は、#「11」に対応する記述と同様に、改修後構文解析データ122のdata4aのレコードに対応する。したがって、改修後ソースコード112の#「12」に対応する当該記述に対する総実装スコアbもb=26となる。
【0109】
スコア管理テーブル125は、改修後ソースコード112の他の行の記述に対しても、同様に、実装フラグ(a)、総実装スコア(b)、参照スコア(c)、a*b*cが登録される。
【0110】
理解度判定部134は、スコア管理テーブル125に基づいて、改修後ソースコード112に対するユーザXの理解度を次のように判定する。
図14は、理解度判定の例を示す図である。
【0111】
図14(A)は、ソースコードに改修がある場合、すなわち、改修前ソースコード111に対して、改修後ソースコード112に変更された箇所が存在する場合の理解度判定スコアの計算例を示す。
図14(B)は、ソースコードに改修がない場合、すなわち、該当のソースコードに対してソースコードエディタ上での変更は行われずに、ソースコードの内容の参照だけが行われた場合の理解度判定スコアの計算例を示す。
【0112】
理解度判定部134は、スコア管理テーブル125における各レコードの実装フラグを合計し、実装フラグの合計が1以上の場合に、ソースコードに改修があると判定し、実装フラグの合計が0の場合に、ソースコードに改修がないと判定する。
【0113】
ソースコードに改修がある場合、理解度判定部134は、スコア管理テーブル125のa*b*cの値の合計を計算する。a*b*cの値の合計は、
図14では「実装フラグ×実装スコア×参照スコア」と表記される。スコア管理テーブル125の例では、a*b*cの値の合計は、1+52+26=79である。
【0114】
次に、理解度判定部134は、a*b*cの値の合計に、スコア管理テーブル125の参照スコアの合計を加算して、参照スコアによる重み付けを行う。a*b*cの値の合計に参照スコアの合計を加算する演算は、
図14では「実装フラグ×実装スコア×参照スコア+参照スコア(重み付け)」と表記される。このように参照スコアの合計を加算する理由は、該当のユーザ(本例ではユーザX)により改修後ソースコード112に対する内容の参照が行われている場合、当該ユーザによる改修後ソースコード112に対する理解度が増していると推定されるからである。スコア管理テーブル125の例では、参照スコアの合計は1+1+3+1+1+1+1+1+2+1+1+1+1+2+2+1=21である。よって、a*b*cの値の合計に参照スコアの合計を加算した値は、79+21=100である。
【0115】
そして、理解度判定部134は、a*b*cの値の合計に参照スコアの合計を加算した値を、改修後ソースコード112の総ステップ数、すなわち、総行数で割った値を、理解度判定スコアとする。a*b*cの値の合計に参照スコアの合計を加算した値を総行数で割る演算は、
図14では「(実装フラグ×実装スコア×参照スコア+参照スコア)/総ステップ数」と表記される。このように、改修後ソースコード112の総行数で割る理由は、理解度判定の対象となるソースコードの規模によって、理解度判定スコアを正規化するためである。例えば、ソースコードの規模が小さい程、該当のソースコードに対する理解度は向上し易く、ソースコードの規模が大きい程、該当のソースコードに対する理解度は向上し難い傾向にある。よって、理解度判定部134は、a*b*cの値の合計に参照スコアの合計を加算した値を該当のソースコードの総行数で割ることで、ソースコードの規模に応じた理解度の変化傾向を理解度判定スコアに適切に反映させ、理解度の判定精度を向上できる。
【0116】
次に、ソースコードに改修がない場合、理解度判定部134は、スコア管理テーブルの参照スコアが0以外のレコードの個数を該当のソースコードの総ステップ数(総行数)で割った値に0.5を乗算することで、理解度判定スコアを求める。ソースコードに改修がない場合の理解度判定スコアの演算は、
図14では「参照スコアが0以外の個数/総ステップ数×0.5」と表記される。0.5の乗算は、理解度判定スコアへの参照スコアの影響が実装スコアの影響の半分(0.5)になるように重み付けることを意味する。このように、理解度判定部134は、該当のユーザがソースコードエディタを用いてソースコードの内容を参照しただけの場合に対しても、理解度判定スコアを求めることができる。
【0117】
スコア管理テーブル125の例では、参照スコアが0以外のレコードの個数は、16である。したがって、スコア管理テーブル125において、仮に、実装フラグが全て「0」の場合、理解度判定部134は、理解度判定スコアを、16/21*0.5=0.4と計算する。
【0118】
理解度判定部134は、計算した理解度判定スコアと理解度判定基準134aとに基づいて改修後ソースコード112に対するユーザXの理解度を判定する。理解度判定基準134aは、理解度判定部134が予め有する情報であり、例えば制御情報記憶部120に予め記憶されてもよい。例えば、理解度判定基準134aは、理解度判定スコアが大きい程、理解度が高いと判定することを示す。一例では、理解度判定基準134aは、理解度のランクを、理解度の高い方からS,A,B,C,Zと定義する。ランクSは、理解度判定スコアが1.0以上の場合である。ランクAは、理解度判定スコアが0.7以上1.0未満の場合である。ランクBは、理解度判定スコアが0.5以上0.7未満の場合である。ランクCは、理解度判定スコアが0.3以上0.5未満の場合である。ランクZは、理解度判定スコアが0以上0.3未満の場合である。
【0119】
次に、管理サーバ100による理解度判定の処理手順の例を説明する。
図15は、理解度判定の処理例を示すフローチャートである。
(S10)構文解析部131は、改修前ソースコード111の構文解析を行い、改修前構文解析データ121を生成する。構文解析部131は、改修前構文解析データ121を、制御情報記憶部120に格納する。
【0120】
(S11)カーソル指定時間取得部132は、ユーザXによる端末装置200におけるソースコードエディタを用いたソースコード改修中に、ソースコードエディタ画面400上のカーソル指定位置およびカーソル指定時間を端末装置200から取得する。カーソル指定時間取得部132は、取得したカーソル位置とカーソル指定時間を、カーソル指定時間テーブル124に記録する。なお、ソースコード改修により、改修前ソースコード111は、改修後ソースコード112に変更される。このため、カーソル指定時間テーブル124には、改修が完了した段階では、改修後ソースコード112に対して、カーソル指定時間が記録される。また、改修後ソースコード112は、端末装置200から管理サーバ100にアップロードされ、ソースコード記憶部110に格納される。
【0121】
(S12)構文解析部131は、改修後ソースコード112の構文解析を行い、改修後構文解析データ122を生成する。構文解析部131は、改修後構文解析データ122を、制御情報記憶部120に格納する。
【0122】
(S13)構文解析結果比較部133は、ソースコード改修前後の構文解析データを比較する。具体的には、構文解析結果比較部133は、改修前構文解析データ121および改修後構文解析データ122の各レコードを比較し、変更されたレコードに実装フラグ「1」、変更されていないレコードに実装フラグ「0」を設定する。
【0123】
また、構文解析結果比較部133は、当該実装フラグの設定結果に基づいて、改修後ソースコード112の各行に対して、スコア管理テーブル125に実装フラグを設定する。前述のように、構文解析結果比較部133は、改修後構文解析データ122における実装フラグ「1」のレコードについて、改修前ソースコード111に対する改修後ソースコード112の差分の行を特定し、当該差分の行に対して実装フラグ「1」を付与する。構文解析結果比較部133は、改修後ソースコード112の当該差分の行以外の行には、実装フラグ「0」を付与する。構文解析結果比較部133は、改修後ソースコード112の各行の実装フラグを、スコア管理テーブル125に記録する。
【0124】
(S14)理解度判定部134は、実装スコア定義テーブル123に基づいて、改修後構文解析データ122から実装スコアを算出する。
図10で例示したように、理解度判定部134は、改修後構文解析データ122のレコードに、変更された命令文の構造の種類が複数特定される場合、命令文の構造の種類ごとの実装スコアを合計した総実装スコアを、該当のレコードに対して算出する。理解度判定部134は、算出した総実装スコアを、スコア管理テーブル125に記録する。
【0125】
(S15)理解度判定部134は、カーソル指定時間テーブル124から参照スコアを算出し、スコア管理テーブル125に記録する。
(S16)理解度判定部134は、スコア管理テーブル125に基づいて、ソースコード(改修後ソースコード112)に対するユーザXの理解度を判定する。具体的には、理解度判定部134は、スコア管理テーブル125の各レコードに対して、実装フラグ(a)*総実装スコア(b)*参照スコア(c)を計算してスコア管理テーブル125に記録する。そして、理解度判定部134は、スコア管理テーブル125に基づいて、
図14で説明した方法により、理解度判定スコアを算出する。理解度判定部134は、理解度判定スコアと、理解度判定基準134aとに基づいて、改修後ソースコード112に対するユーザXの理解度のランクを決定する。理解度判定部134は、算出した理解度判定スコアと、ユーザXの理解度のランクとを、理解度テーブル126に記録する。そして、管理サーバ100による理解度判定が終了する。
【0126】
理解度判定部134は、理解度テーブル126に基づいて、改修後ソースコード112に対するユーザXの理解度を示す情報を出力してもよい。例えば、理解度判定部134は、改修後ソースコード112に対するユーザXの理解度を示す画面を、ディスプレイ41に表示させたり、端末装置200,300のディスプレイに表示させたりしてもよい。また、制御部130は、ユーザYなどの他のユーザについても、
図15の手順によりソースコードに対する理解度を判定することができる。
【0127】
次に、理解度テーブル126の例を説明する。
図16は、理解度テーブルの例を示す図である。
理解度テーブル126は、ソースコード名、ユーザID(IDentifier)、理解度判定スコア累積および理解度の項目を含む。ソースコード名の項目には、ソースコードの名称が登録される。ユーザIDの項目には、該当のソースコードに対して理解度の判定が行われたユーザのユーザIDが登録される。理解度判定スコア累積の項目には、該当のソースコードに対して計算された該当のユーザの理解度判定スコアの累積が登録される。理解度判定スコアの累積は、該当のソースコードが該当のユーザにより変更されるたびに、理解度判定部134により計算される。理解度の項目には、理解度判定スコアの累積に対して理解度判定基準134aを基に判定される理解度のランクが登録される。
【0128】
例えば、理解度テーブル126は、ソースコード名「sample.java」、ユーザID「U1」、理解度判定スコア累積「0.32」、理解度「C」のレコードを有する。このレコードは、ソースコード名「sample.java」のソースコードに対するユーザID「U1」のユーザに対する理解度判定スコアの累積が「0.32」であり、当該ソースコードに対する当該ユーザの理解度のランクが「C」であることを示す。
【0129】
また、理解度テーブル126は、ソースコード名「sample.java」のソースコードに対して、ユーザID「U2」を含む他のユーザの理解度判定スコア累積および理解度のレコードも有する。
【0130】
このように、理解度判定部134は、あるソースコードに対して複数のユーザそれぞれによる変更が行われるたびに、当該変更による改修前ソースコードに対する改修後ソースコードの変更履歴により当該ユーザの理解度判定スコアを算出する。そして、理解度判定部134は、該当のソースコードに対する当該ユーザの理解度判定スコアの累積を理解度テーブル126に記録してもよい。また、理解度判定部134は、理解度判定スコアの累積に応じて判定した理解度のランクを、理解度テーブル126に記録してもよい。
【0131】
図17は、ソースコード理解度表示画面の例を示す図である。
例えば、理解度判定部134は、理解度テーブル126に基づいて、ソースコード理解度表示画面500を、ディスプレイ41に表示させてもよい。あるいは、理解度判定部134は、ソースコード理解度表示画面500を、端末装置200,300に接続されたディスプレイに表示させてもよい。例えば、管理サーバ100は、Webサーバとして機能してもよい。また、端末装置200,300は、Webブラウザとして機能してもよい。例えば、管理サーバ100は、ソースコード理解度表示画面500の画面情報を提供し、端末装置200,300のWebブラウザによりソースコード理解度表示画面500を表示させてもよい。
【0132】
例えば、ソースコード理解度表示画面500は、ソースコード名「sample.java」のソースコードに対し、ユーザ名「XXX XXX」のユーザの理解度のランクが「C」であることを示す。また、ソースコード理解度表示画面500は、当該ソースコードに対し、ユーザ名「YYY YYY」のユーザの理解度のランクが「S」であることを示す。ソースコード理解度表示画面500は、当該ソースコードに対し、3以上のユーザに対する理解度のランクを含み得る。
【0133】
このように、管理サーバ100は、ソースコードに対する各ユーザの理解度の判定精度を向上できる。ソースコードを開発するユーザは、ソースコード理解度表示画面500を確認することで、ソースコードに対する各ユーザの理解度を容易に把握することができる。例えば、ユーザは、理解度の比較的高いユーザと、理解度の比較的低いユーザとを組ませるペアプログラミングなどを計画することで、複数のユーザそれぞれのソースコード全体に対する理解度を効率的に向上させることができる。こうして、管理サーバ100は、ソースコード作成における属人化の抑制を支援できる。その結果、管理サーバ100は、ソフトウェアの効率的な開発を支援できる。
【0134】
管理サーバ100によるソースコードに対する理解度の判定は、例えば、アジャイル開発を行う現場において特に有効である。アジャイル開発では、複数の作業者により、ソフトウェアの機能単位に、開発、テスト、実装などの工程が比較的短期間で繰り返し行われ、開発効率の向上のために、ソースコードの記述の属人化の防止が特に求められるためである。
【0135】
以上説明したように、管理サーバ100は次の処理を実行する。
制御部130は、ソースコードに含まれる命令文の、ユーザによる変更履歴を取得する。制御部130は、変更履歴により示される、変更された命令文の構造の種類に基づいて、ソースコードに対するユーザの理解度を判定する。
【0136】
これにより、管理サーバ100は、ソースコードに対するユーザの理解度の判定精度を向上できる。例えば、スコア管理テーブル125に含まれる実装フラグであって、改修前ソースコード111に対する改修後ソースコード112の差分の記述を示す実装フラグは、変更履歴の一例である。
【0137】
制御部130は、命令文の構造の種類と理解度に対する重みとを関連付けたテーブルを参照して、変更履歴が示す変更された命令文の構造の種類に応じた、理解度に対する重みを算出してもよい。これにより、管理サーバ100は、変更された命令文の構造の種類に応じた重みを適切に取得でき、当該重みに基づいて理解度を精度良く判定できる。
【0138】
ここで、実装スコア定義テーブル123は、命令文の構造の種類と理解度に対する重みとを関連付けたテーブルの一例である。例えば、制御部130は、変更された命令文の構造の種類に対して実装スコア定義テーブル123に設定された実装スコアを、そのまま理解度に対する重みとしてもよい。変更された命令文が他の命令文の中に記述されている場合、制御部130は、変更された命令文の構造の種類に対応する実装スコアと他の命令文の構造の種類に対応する実装スコアとの和を、変更された命令文の構造の種類に応じた理解度に対する重みとしてもよい。
【0139】
また、制御部130は、ソースコードに含まれる他の命令文の中に、変更された命令文が記述された場合、他の命令文の構造の種類と変更された命令文の構造の種類とに基づいて、理解度を判定してもよい。これにより、管理サーバ100は、ソースコードに対するユーザの理解度の判定精度をより向上できる。変更された命令文が他の命令文の中に入れ子構造で記述される場合、ユーザは、当該命令文の変更の際に、他の命令文の構造についても考慮した上で変更を行ったと推定されるからである。
【0140】
例えば、制御部130は、命令文の構造の種類と理解度に対する重みとを関連付けたテーブルを参照して、変更履歴が示す変更された命令文の構造の種類に応じた第1の重みと他の命令文の構造の種類に応じた第2の重みとを取得してもよい。制御部130は、取得した第1の重みを第2の重みにより補正し、補正後の第1の重みに基づいて理解度を判定してもよい。
【0141】
上記のように、変更された命令文が他の命令文の中に入れ子構造で記述される場合、ユーザは、当該命令文の変更の際に、他の命令文の構造についても考慮した上で変更を行ったと推定される。したがって、上記の補正を行うことで、管理サーバ100は、ソースコードに対するユーザの理解度の判定精度をより向上できる。例えば、制御部130は、実装スコア定義テーブル123を参照して、変更された命令文の構造の種類に対応する実装スコアを、理解度に対する第1の重みW1として取得する。また、制御部130は、実装スコア定義テーブル123を参照して、他の命令文の構造の種類に対応する実装スコアを第2の重みW2として取得する。例えば、制御部130は、第1の重みW1に第2の重みW2を加算する補正を行うことで、第1の重みW1に対する補正後の第1の重みW3(=W1+W2)を算出する。この場合、制御部130は、補正後の第1の重みW3に基づいて理解度を判定する。
【0142】
例えば、
図10における総実装スコア、または、
図13のスコア管理テーブル125の#「11」、「12」の総実装スコアは、補正後の第1の重みの一例である。なお、スコア管理テーブル125の#「11」の総実装スコアのように、該当の命令文の入れ子構造の中に他の命令文がある場合に、制御部130は、該当の命令文の構造の種類に応じた重みを、当該他の命令文の構造の種類に応じた他の重みにより補正してもよい。この場合、制御部130は、当該補正後の重みに基づいて理解度を判定してもよい。
【0143】
また、制御部130は、ソースコードの変更に用いられるエディタの画面において命令文がカーソルにより指定されていた時間に基づいて理解度を判定してもよい。これにより、管理サーバ100は、ソースコードに対するユーザの理解度の判定精度をより向上できる。ソースコードエディタ画面400は、ソースコードの変更に用いられるエディタの画面の一例である。また、カーソル指定時間は、エディタ(ソースコードエディタ)の画面において命令文がカーソルにより指定されていた時間に相当する。
【0144】
例えば、制御部130は、命令文の構造の種類と理解度に対する重みとを関連付けたテーブルを参照して、変更履歴が示す変更された命令文の構造の種類に応じた、理解度に対する第1の重みを算出してもよい。更に、制御部130は、上記エディタにおいて命令文がカーソルにより指定されていた時間に応じた、理解度に対する第3の重みを算出してもよい。そして、制御部130は、第1の重みと第3の重みとに基づいて理解度を判定してもよい。
【0145】
これにより、管理サーバ100は、ソースコードに対するユーザの理解度の判定精度をより向上できる。なお、参照スコアは、第3の重みの一例である。
制御部130は、第3の重みの算出の際、ソースコードのうち該当の命令文から一定範囲内に記述された他の命令文がカーソルにより指定されていた他の時間に基づいて第3の重みを算出してもよい。これにより、管理サーバ100は、該当の命令文に対する第3の重みを適切に取得できる。エディタ上で他の命令文がカーソルにより指定されている場合、ユーザは、他の命令文の周囲の記述についても参照しており、該当の命令文に対する理解度を高める影響があると推定されるからである。ここで、一定範囲とは、例えば、該当の命令文が記述される行の前後1行の範囲、または、前後2行の範囲などのように、予め定められる範囲である。
【0146】
また、制御部130は、エディタの画面においてソースコードに含まれる複数の命令文それぞれがカーソルにより指定されていた時間の合計を示す第1の指標値を取得してもよい。制御部130は、第1の重みと第3の重みとの積に第1の指標値を加算した値を、ソースコードの規模を示す第2の指標値で割ることで理解度に対応するスコア(評価値)を算出してもよい。そして、制御部130は、当該スコアに基づいて理解度を判定してもよい。
【0147】
これにより、管理サーバ100は、ソースコードに対するユーザの理解度を精度良く判定できる。
図14で例示した理解度判定スコアは、理解度に対応するスコアの一例である。
【0148】
また、制御部130は、第1の重みと第3の重みとの積を取ることで、変更された命令文の構造の種類と、エディタ上でユーザにより参照された時間とに応じた理解度に対する重みを適切に計算できる。
【0149】
また、制御部130は、第1の重みと第3の重みとの積に第1の指標値を加算することで、ユーザがソースコードを参照した総時間に応じて、理解度に対する重みを適切に補正できる。ユーザがソースコードを参照した総時間が長いほど、ソースコードに対するユーザの理解度は高まっていると推定されるからである。例えば、
図13で例示したスコア管理テーブル125における参照スコアの合計は、第1の指標値の一例である。
【0150】
更に、制御部130は、第1の重みと第3の重みとの積に上記指標値を加算した値を、ソースコードの規模を示す第2の指標値で割ることで、算出されるスコアを、ソースコードの規模によって正規化できる。ソースコードの規模が大きい程、ユーザによる理解度は上がり難いと推定されるからである。ソースコードに含まれるステップ数、すなわち、行数は、第2の指標値の一例である。
【0151】
なお、第1の実施の形態の情報処理は、処理部12にプログラムを実行させることで実現できる。また、第2の実施の形態の情報処理は、CPU101にプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体43に記録できる。
【0152】
例えば、プログラムを記録した記録媒体43を配布することで、プログラムを流通させることができる。また、プログラムを他のコンピュータに格納しておき、ネットワーク経由でプログラムを配布してもよい。コンピュータは、例えば、記録媒体43に記録されたプログラムまたは他のコンピュータから受信したプログラムを、RAM102やHDD103などの記憶装置に格納し(インストールし)、当該記憶装置からプログラムを読み込んで実行してもよい。
【符号の説明】
【0153】
10 判定装置
11 記憶部
12 処理部
20 変更履歴
21 変更前ソースコード
22 変更後ソースコード
22a,22b 差分情報