説明

プログラミング能力診断装置及びプログラミング能力診断方法、並びにコンピュータプログラム

【課題】 プログラミング課題に対する解決能力を簡易かつ迅速に診断することができるとともに、プログラミング課題の内容を勘違いして作成されたことによるプログラムの誤評価を防ぐ。
【解決手段】 クライアント端末2Bにおいて、所望のプログラム出力が得られるか否かのテストが実行された後、テスト通過プログラムと、被験者がテスト通過プログラムを作成する過程で生成された複数の中間生成プログラムを復元可能なプログラム構成情報とを読み込んで、被験者のプログラミング能力を診断するプログラミング能力診断装置(クライアント端末2A)であって、テスト通過プログラムの作成過程を再生するとともに、一の処理モジュール若しくは複数の処理モジュール各々の処理手順又は一の処理モジュール若しくは複数の処理モジュール間の構造が可視化された図を生成し、テスト通過プログラムの作成過程と、生成された図とを表示部25に表示させる。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、被験者にプログラミング課題を出題し、被験者からそのプログラミング課題に対する解答を取得し、課題解決能力を診断するプログラミング能力診断装置及びプログラミング能力診断方法、並びにコンピュータプログラムに関する。
【背景技術】
【0002】
IT系企業では、プログラマの考課や育成を目的として、様々なスキル診断が行われている。例えば、プログラマを採用する際、小規模なプログラミング課題を与え、プログラマが作成した解答(コーディング)の巧拙によって採用の要否を決定する場合がある。また、社員の昇進試験において、業務と関連する何らかのプログラミング課題を与え、そのプログラミング課題に対する解答の出来不出来によって、昇進の認否を決定する場合もある。これらの場合、評価者は、プログラマが作成したプログラムを見て、プログラミング能力の有無を適切に評価することが求められる。しかし、一般的にプログラミング能力を適切に評価することは容易ではない。
【0003】
例えば、二人の被験者にプログラミング課題を出題し、作成された2つのプログラムを見比べた場合、ともに模範解答に近いプログラムであったとしても、片方の被験者は10分でコーディングし、他方の被験者は30分でコーディングしていたときには、当然プログラミング能力に差があり、前者の評価を高くすべきである。また、片方の被験者はプログラミングの作業過程で間違いが多く、デバッグ回数が頻繁にあったのに対し、他方の被験者はデバッグ回数がほとんどなかったときにも、当然プログラミング能力に差があり、今度は後者の評価を高くすべきである。しかし、従来の評価方法は、作成されたプログラムを見比べるだけの評価方法であることが多く、このような評価方法ではプログラミング能力を適切に評価することが難しかった。
【0004】
そこで、プログラムが作成される過程に着目し、プログラミング過程の再生、プログラミング過程で経過した時間の計測、プログラミング過程におけるコンパイル回数のカウントなどを行う技術として、例えば特許文献1に開示されたプログラミング教育支援システムがある。具体的には、プログラミング課題の解答(コーディング)過程をリアルタイムに把握してデータベース化し、記録したデータに基づいて解答過程(プログラミング過程)を再現したり、プログラミングの経過時間を計測したり、その経過時間に対する入力文字数やコンパイルタイミングのグラフによる視覚化を行ったりすることで、各学習者(被験者)の思考過程や理解不足の箇所を把握し、ひいてはプログラミング習熟度を把握できるようになっている。
【先行技術文献】
【特許文献】
【0005】
【特許文献1】特開2006−227218号公報(段落[0007]等)
【発明の概要】
【発明が解決しようとする課題】
【0006】
一般に、ある程度規模の大きなプログラムを作成する場合には、バグ修正のしやすさ、メンテナンス効率等の観点から、論理構造がシンプルかつ明確なプログラムが好ましい。例えば、個々の関数モジュールを単に先頭から順番に羅列していくプログラムよりも、main関数などの基本構造の中で個々の関数モジュールをサブルーチン化したプログラムの方が、設計思想としては好ましい。しかし、従来のプログラミング教育支援システムのように、プログラミング経過時間に対する入力文字数やコンパイルタイミングのグラフによる視覚化を行っただけでは、論理構造が簡易かつ明確かどうか、といったプログラムの構造を構築する能力を評価することは困難である。
【0007】
この点、被験者によって作成されたプログラム全体を見れば、ある程度の論理構造を把握することはできるとも考えられる。しかし、社内の人事担当者などプログラミングに詳しくない者がプログラムの論理構造を把握することは困難である。また、たとえ評価者がプログラミングに詳しい者であったとしても、例えば数十〜数百行のプログラム全体の論理構造を把握するためにはそれなりに時間が掛かる。特に、プログラマの採用試験やプログラマの人材派遣などを考えた場合、数十人、数百人といったプログラマのプログラミング能力を評価しなければならない場合も少なくないが、その際、全員分のプログラム全体に目を通す作業は、非常に煩雑かつ時間の掛かる作業である。
【0008】
更に、上述したプログラミング教育支援システムでは、プログラミング課題の内容を勘違いして作成されたプログラムでないかどうかまでは判別できない。例えば、行数が少なくて一見すると論理構造がシンプルに見えるプログラムが作成された場合において、被験者自身のコンパイルにより文法エラーは除かれていたとしても、それがプログラミング課題の内容を勘違いして作られたものであるときには、低評価にすべきである。しかし、上述したプログラミング教育支援システムでは、被験者がプログラミング課題の内容を正しく把握していることを前提にしているので、プログラミング課題の内容を勘違いしているにも拘わらず、シンプルな論理構造のプログラムが作成された場合、誤って高評価になる可能性は否定できない。
【0009】
このように、従来の評価方法では、被験者のプログラミング能力、特にプログラムの構造を構築する能力を診断することは困難であった。また、被験者の人数が大勢になった場合に、プログラミングに熟知した者が相当な時間を掛けなければ、被験者全員のプログラム構造構築能力を簡易かつ迅速に診断することは困難であった。さらに、プログラミング課題の内容を勘違いして作成されたことによるプログラムの誤評価を防ぐことが困難であった。
【0010】
本発明は、以上の点に鑑みてなされたものであり、その目的は、プログラミング課題に対する解決能力、特にプログラムの構造を構築する能力を簡易かつ迅速に診断することができるとともに、プログラミング課題の内容を勘違いして作成されたことによるプログラムの誤評価を防ぐプログラミング能力診断装置及びプログラミング能力診断方法、並びにコンピュータプログラムを提供することにある。
【課題を解決するための手段】
【0011】
第1の発明に係るプログラミング能力診断装置は、プログラミング課題を出題された被験者がプログラミング課題を解決するプログラムを作成するプログラム作成装置において、被験者によってプログラムが作成され、プログラミング課題を出題した出題者により設定された所望のプログラム出力が得られるか否かのテストが実行された後、一の処理モジュール又は複数の処理モジュールから構成され、所望のプログラム出力が得られてテストを通過したテスト通過プログラムと、被験者がテスト通過プログラムを作成する過程で生成された複数の中間生成プログラムを復元可能なプログラム構成情報と、を読み込んで、被験者のプログラミング能力を診断するものであって、テスト通過プログラムとプログラム構成情報とを記憶する記憶部と、プログラム構成情報により復元される複数の中間生成プログラムに基づいて、上述したテスト通過プログラムの作成過程を再生する再生部と、テスト通過プログラムに基づいて、一の処理モジュール若しくは複数の処理モジュール各々の処理手順又は一の処理モジュール若しくは複数の処理モジュール間の構造が可視化された図を生成する可視化図生成部と、再生部により再生される上述したテスト通過プログラムの作成過程と、可視化図生成部により生成された図とを表示部に表示させる制御部と、を備える。
【0012】
このような構成によれば、プログラミング能力診断の対象となるプログラムは、プログラミング課題を出題した出題者により設定された所望のプログラミング出力が得られるテスト通過プログラムになる。また、テスト通過プログラムに基づいて、一の処理モジュール若しくは複数の処理モジュール各々の処理手順又は一の処理モジュール若しくは複数の処理モジュール間の構造が可視化された図が生成される。そして、その可視化された図とテスト通過プログラムの作成過程とが表示部に表示される。したがって、プログラミング課題の内容を勘違いして作成されたプログラムは、プログラミング能力診断の対象から排除されるので、プログラミング課題の内容を勘違いして作成されたことによるプログラムの誤評価を防ぐことができる。また、プログラミング能力診断を行う者は、表示部を通じて、一の処理モジュール若しくは複数の処理モジュール各々の処理手順又は一の処理モジュール若しくは複数の処理モジュール間の構造が可視化された図を視認することによって、自身がプログラミングに熟知していなくても、プログラムの構造を構築する能力を簡易に診断することができる。また、被験者が大勢いた場合であっても、この図を視認することで、明らかにプログラミング能力の劣る被験者を排除して、残りの被験者については必要に応じて再生部により再生されるテスト通過プログラムの作成過程を視認することができるので、プログラムの構造を構築する能力を効率的かつ迅速に診断することができる。なお、本明細書でいう「処理モジュール」とは、何らかの作業工程を一つの処理としてまとめたものをいい、プログラムの一般的な構成要素となる関数モジュールだけでなく、例えば、プログラム中で意味や内容がまとまっている作業を一つの手続きとしてまとめたサブルーチン、複数の処理を一つにまとめたプロシージャ、プログラムの部分プログラムとして機能するサブプログラムなど、如何なる種類・名称のものであってもよい。また、本明細書でいう「プログラム構成情報」は、被験者がテスト通過プログラムを作成する過程で生成された複数の中間生成プログラムを復元可能な情報であれば如何なる情報であってもよい。
【0013】
第2の発明に係るプログラミング能力診断装置では、上述したプログラム構成情報により復元される複数の中間生成プログラムに基づいて、一の処理モジュール又は複数の処理モジュール各々が生成されたタイミングを解析するタイミング解析部を備え、制御部は、タイミング解析部の解析結果を前記表示部に表示させる。
【0014】
このような構成によれば、プログラミング能力診断を行う者は、一の処理モジュール又は複数の処理モジュール各々が生成されたタイミングを知ることで、プログラムの構造を頭の中で如何に早く構築することができるか、といった能力を診断することができる。例えば、プログラムを完成させるために必要な処理モジュールが、早いタイミングで全部揃った被験者は、プログラム構造を見通す力が優れていることが分かる。逆に、なかなか必要な処理モジュールが生成されなかった被験者は、このような力が劣っていることが分かる。
【0015】
第3の発明に係るプログラミング能力診断装置では、一の処理モジュール又は複数の処理モジュール各々について、タイミング解析部によって解析されたタイミングよりも前に、被験者による処理モジュールの記述があるか否かを、プログラム構成情報により復元される複数の中間生成プログラムを用いて検索する検索部を備え、制御部は、検索部の検索結果を表示部に表示させる。
【0016】
このような構成によれば、処理モジュールが被験者によって記述されたタイミングを把握することができる。すなわち、上述したタイミング解析部により、一の処理モジュール又は複数の処理モジュール各々が生成されたタイミングを解析することは可能であるが、これは、あくまでタイミング解析部により解析が成功したタイミングである。例えば、被験者が処理モジュールをソースコード中に記述した直後のタイミングは、まだ処理モジュールが完成していないため、上述したタイミング解析部による解析は成功せず、タイミング解析部のみでは知ることができない。そのため、プログラム構成情報により復元される複数の中間生成プログラムを用いて、プログラム中に被験者による処理モジュールの記述があるか否かを検索することによって、被験者が処理モジュールを記述した直後のタイミングまで知ることができ、ひいては被験者が処理モジュールの必要性に気づいた時期など、被験者の思考過程を把握することができる。
【0017】
第4の発明に係るプログラミング能力診断装置では、一の処理モジュール内又は複数の処理モジュール間でコードの重複度合いを示すコード重複率を解析するコード重複率解析部を備え、制御部は、コード重複率解析部の解析結果を表示部に表示させる。
【0018】
このような構成によれば、プログラミング能力診断を行う者は、プログラムの構造を効率的に構築できているか、といった能力を診断することができる。例えば、コード重複率の低いプログラムを作成した被験者は、無駄が少なく効率的なプログラム構造を構築できる力が優れていることが分かる。逆に、コード重複率の高いプログラムを作成した被験者は、このような力が劣っていることが分かる。また、コード重複率が高いプログラムは、コード重複に起因して仕様変更時に変更箇所が多くなりがちである。したがって、コード重複率の低いプログラムは、仕様変更が発生した際のメンテナンス性に優れていることになる。
【0019】
第5の発明に係るプログラミング能力診断装置では、表示部においてユーザの操作を受け付ける受付部を備え、制御部は、受付部からの操作信号に基づいて、可視化図生成部により生成された図と、タイミング解析部の解析結果と、コード重複率解析部の解析結果とを選択的に表示部に表示させる。
【0020】
このような構成によれば、プログラミング能力診断を行う者は、例えばマウス等からなる受付部を操作して、可視化図生成部により生成された図と、タイミング解析部の解析結果と、コード重複率解析部の解析結果とを、表示部において選択的に切り替えることができるので、プログラムの構造を構築する能力を様々な視点から簡易かつ迅速に診断することができる。
【0021】
第6の発明に係るプログラミング能力診断方法では、プログラミング課題を出題された被験者がプログラミング課題を解決するプログラムを作成するプログラム作成装置において、被験者によってプログラムが作成され、プログラミング課題を出題した出題者により設定された所望のプログラム出力が得られるか否かのテストが実行された後、一の処理モジュール又は複数の処理モジュールから構成され、所望のプログラム出力が得られてテストを通過したテスト通過プログラムと、被験者がテスト通過プログラムを作成する過程で生成された複数の中間生成プログラムを復元可能なプログラム構成情報と、を読み込んで、被験者のプログラミング能力を診断するプログラミング能力診断方法であって、テスト通過プログラムとプログラム構成情報とを記憶する記憶ステップと、プログラム構成情報により復元される複数の中間生成プログラムに基づいて、テスト通過プログラムの作成過程を再生する再生ステップと、テスト通過プログラムに基づいて、一の処理モジュール若しくは複数の処理モジュール各々の処理手順又は一の処理モジュール若しくは複数の処理モジュール間の構造が可視化された図を生成する可視化図生成ステップと、再生ステップにより再生されるテスト通過プログラムの作成過程と、可視化図生成ステップにより生成された図とを、表示部に表示させるステップと、を含む。
【0022】
第7の発明に係るコンピュータプログラムでは、プログラミング課題を出題された被験者がプログラミング課題を解決するプログラムを作成するプログラム作成装置において、被験者によってプログラムが作成され、プログラミング課題を出題した出題者により設定された所望のプログラム出力が得られるか否かのテストが実行された後、一の処理モジュール又は複数の処理モジュールから構成され、所望のプログラム出力が得られてテストを通過したテスト通過プログラムと、被験者がテスト通過プログラムを作成する過程で生成された複数の中間生成プログラムを復元可能なプログラム構成情報と、を読み込んで、被験者のプログラミング能力を診断するプログラミング能力診断装置として、コンピュータを機能させるためのコンピュータプログラムであって、テスト通過プログラムとプログラム構成情報とを記憶する記憶部と、プログラム構成情報により復元される複数の中間生成プログラムに基づいて、テスト通過プログラムの作成過程を再生する再生部と、テスト通過プログラムに基づいて、一の処理モジュール若しくは複数の処理モジュール各々の処理手順又は一の処理モジュール若しくは複数の処理モジュール間の構造が可視化された図を生成する可視化図生成部と、再生部により再生されるテスト通過プログラムの作成過程と、可視化図生成部により生成された図を表示部に表示させる制御部と、を備えるプログラミング能力診断装置として、コンピュータを機能させる。
【0023】
このような構成からなるプログラミング能力診断方法及びコンピュータプログラムによれば、上述した第1の発明に係るプログラミング能力診断装置と同様に、プログラムの構造を構築する能力を簡易かつ迅速に診断することができるとともに、プログラミング課題の内容を勘違いして作成されたことによるプログラムの誤評価を防ぐことができる。
【発明の効果】
【0024】
以上説明したように、本発明によれば、プログラミング能力診断を行う者は、一の処理モジュール若しくは複数の処理モジュール各々の処理手順又は一の処理モジュール若しくは複数の処理モジュール間の構造が可視化された図を視認することによって、自身がプログラミングに熟知していなくても、また、被験者が大勢いる場合であっても、プログラムの構造を構築する能力を簡易かつ迅速に診断することができる。また、プログラミング課題の内容を勘違いして作成されたプログラムを、プログラミング能力診断の対象から排除することができるので、プログラミング課題の内容を勘違いしてプログラムが作成されたことに起因する誤評価を防ぐことができる。
【図面の簡単な説明】
【0025】
【図1】本発明の実施形態に係るプログラミング能力診断装置(クライアント端末)が用いられるシステムのシステム構成を示す概念図である。
【図2】図1に示すサーバのハードウェア構成例を示すブロック図である。
【図3】クライアント端末のハードウェア構成例を示すブロック図である。
【図4】プログラミング課題に対する被験者の解答データをサーバからクライアント端末にダウンロードするまでのプロセスを示すフローチャートである。
【図5】トップメニュー画面の一例である。
【図6】課題登録画面の一例である。
【図7】登録設定ダイアログ画面の一例である。
【図8】課題URL発行画面の一例である。
【図9】発行設定ダイアログ画面の一例である。
【図10】課題出題者が操作するクライアント端末の表示部に表示される発行画面の一例である。
【図11】発行画面の一例である。
【図12】課題表示/編集エリアにまだ何も入力されていない様子を示している。
【図13】課題出題者が被験者に受けさせたい課題の内容(課題文)が表示されている様子を示す図である。
【図14】警告表示がなされている様子を示す図である。
【図15】エラー表示がなされている様子を示す図である。
【図16】課題出題者が被験者の解答を確認するための解答確認画面の一例である。
【図17】再生観察アプリがインストールされた後のクライアント端末のソフトウェア的な機能を示す機能ブロック図である。
【図18】クライアント端末において再生観察アプリを起動したときに、表示部に表示される起動画面を示す図である。
【図19】分析対象となるデータファイルが1個追加された様子を示す図である。
【図20】テスト通過プログラムの作成過程が再生されている様子を示す図である。
【図21】被験者によってビルドが1回行われている様子を示す図である。
【図22】再生欄に、プログラミング課題が表示されている様子を示す図である。
【図23】図21と比べて更に多くの時間が経過したときの様子を示す図である。
【図24】最後に生成された中間生成プログラムが表示されている様子を示す図である。
【図25】実時間ベースでの再生について説明するための図である。
【図26】プログラミング作成過程を分析するための図を表示する分析モードのうち、各パラメータ推移の様子を示す図である。
【図27】プログラミング作成過程を分析するための図を表示する分析モードのうち、関数ライフサイクルを示す図である。
【図28】プログラミング作成過程を分析するための図を表示する分析モードのうち、フローチャートを示す図である。
【図29】プログラミング作成過程を分析するための図を表示する分析モードのうち、フローチャートを示す図である。
【図30】二人の被験者の各パラメータ推移を比較している様子を示す図である。
【図31】横軸だけでなく、縦軸も正規化されている様子を示す図である。
【図32】それぞれ二人の被験者の関数ライフサイクルを比較している様子を示す図である。
【図33】それぞれ三人の被験者のフローチャートを比較している様子を示す図である。
【図34】それぞれ三人の被験者のコード重複を比較している様子を示す図である。
【図35】図26と異なり、パラメータ設定における横軸値のラジオボタンのクリック位置を、操作回数から時間に代えている様子を示す図である。
【図36】被験者が何も操作していない時間帯(待ち)が所定時間発生したときに、キャラクターの表情を変える表情モード設定画面の一例である。
【図37】解答DBに記憶されるデータ構成の例示図である。
【図38】提示されるプログラミング課題の具体例を示す例示図である。
【図39】提示されたプログラミング課題に応じて被験者が作成したC言語によるプログラムの例示図である。
【図40】サーバのCPUのデータ収集処理の手順を示すフローチャートである。
【図41】CPUの能力評価値算出の処理手順のフローチャートを示す。
【図42】サーバによって算出された複雑度の推移データの例示図である。
【図43】サーバによって算出された近似曲線の例示図である。
【図44】サーバによって抽出された有効区間の例示図である。
【図45】有効区間を補正する必要がある場合の、サーバによって作成された近似曲線の例示図である。
【図46】特徴的な4名の被験者A、B、C、Dの複雑度の推移データを示す例示図である。
【図47】図46と異なり正方向を逆転させている様子を示す図である。
【図48】診断レポート(1枚目)の一例を示す図である。
【図49】診断レポート(2枚目)の一例を示す図である。
【発明を実施するための形態】
【0026】
以下、本発明の実施の形態に係るプログラミング能力診断装置について、図面を参照しながら具体的に説明する。まずは、プログラミング能力診断装置が用いられるシステムの概要について説明する。
【0027】
[システム概要]
図1は、本発明の実施形態に係るプログラミング能力診断装置(図1ではクライアント端末2A)が用いられるシステムのシステム構成を示す概念図である。このシステムの利用形態について、具体例に説明する。
【0028】
第1の利用形態は、プログラミング能力診断装置としてのクライアント端末2Aと、サーバ1とを、システム運用企業が保有している利用形態である。システム運用企業としては、例えば人材派遣業を事業として行っている企業などが考えられる。サーバ1は、システム運用企業によって所定のデータセンター内に設置され、インターネット等の通信ネットワーク100を介して、システム運用企業内のクライアント端末2Aと接続される。また、サーバ1は、システム運用企業に登録(例えば人材派遣登録)している複数のプログラマが保有するクライアント端末2B(例えば家庭のPCなど)にも接続される。
【0029】
システム運用企業に在籍する人材評価担当者は、クライアント端末2Aを操作してサーバ1にアクセスし、被験者となるプログラマ(例えば人材派遣登録しているプログラマ)に受けさせたいプログラミング課題を登録し、そのプログラミング課題に対する解答を入力可能なリンク先のURLを取得する。そして、そのURLを、被験者に電子メールや電話などで別途連絡する。URLは、サーバ1内に存在するプログラミング課題(ファイル)の場所を指し示すものである。被験者は、自分の都合のよいとき、或いは予め決められた期限内に、自己のクライアント端末2Bを操作して、URLが示すリンク先(ウェブページ)にアクセスし、プログラミング課題に対する解答を入力する。入力された解答はサーバ1に送られ、サーバ1内の所定の記憶領域に記憶される。その後、人材評価担当者は、クライアント端末2Aを操作してサーバ1にアクセスし、被験者によって入力された解答の内容を確認し、その内容をクライアント端末2Aにダウンロードし、被験者のプログラミング能力を診断する。プログラミング能力の診断内容の詳細については、[プログラミング能力診断]にて後述する。
【0030】
第2の利用形態は、サーバ1のみを、システム運用企業が保有している利用形態である。プログラミング能力診断装置としてのクライアント端末2A、被験者が操作するクライアント端末2Bは、システム運用企業とシステム利用契約を締結したシステム利用企業が保有している。システム運用企業としては、プログラミング能力診断サービスを提供するSaaS(Software as a Service)企業、システム利用企業としては、プログラマを数多く抱えるソフトウェア会社などである。企業ではないが、プログラミング授業が数多くある情報系大学なども、システム利用者になり得る。
【0031】
システム運用企業に在籍するSaaS担当者は、サーバ1を所定のデータセンター内に設置し、システム利用企業のシステム利用契約を締結する。システム利用企業に在籍する人事担当者は、被験者となるプログラマ(例えば採用を検討しているプログラマ)に受けさせたいプログラミング課題を登録する。あとは、第1の利用形態と同様である。すなわち、被験者となるプログラマにURLが連絡され、被験者はクライアント端末2Bを操作して、URLが示すサーバ1内のリンク先にアクセスし、プログラミング課題に対する解答を入力する。その後、人事担当者は、クライアント端末2Aを操作してサーバ1にアクセスし、被験者によって入力された解答の内容を確認し、その内容をクライアント端末2Aにダウンロードし、被験者のプログラミング能力を診断する。
【0032】
このように、本実施形態では、上述した第1の利用形態においても第2の利用形態においても、被験者によって入力されたプログラミング課題に対する解答の内容を、通信ネットワーク100を介してサーバ1からクライアント端末2Aにダウンロードするようにしている。これにより、クライアント端末2A上で、被験者の解答内容を簡易かつ迅速に取得することができ、被験者のプログラミング能力を簡易かつ迅速に診断することができる。特に、被験者の人数が大勢になった場合には、より簡易に、かつ、より迅速に診断することができる。
【0033】
なお、プログラミング能力診断装置としてのクライアント端末2Aは、必ずしも図1に示すシステムに組み込まれる必要はない。プログラミング課題に対する被験者の各種解答データを、USBやDVDなどの記録媒体でクライアント端末2Aに移動させることによって、クライアント端末2A上でのプログラミング能力診断は可能になる。
【0034】
以下では、クライアント端末2Aにおいて被験者のプログラミング能力診断を行うにあたって、図1に示すシステムを利用する。そして、まず、プログラミング課題に対する被験者の解答データを、通信ネットワーク100を介してサーバ1からクライアント端末2Aにダウンロードするまでのプロセスについて、詳細に説明する([解答データの取得]参照)。その後、ダウンロードして取得した解答データを用いて、クライアント端末2A上で行われるプログラミング能力診断について、詳細に説明する(後述する[プログラミング能力診断]参照)。
【0035】
[解答データの取得]
図2は、図1に示すサーバ1のハードウェア構成例を示すブロック図である。なお、図1に示すシステムでは、サーバ1は1台としているが、複数台に分散させてもよい。また、マルチテナント(例えば上述した第2の利用形態において複数の企業がシステム利用企業になること)を考えた場合には、更に多くのクライアント端末2A、2Bがサーバ1に接続されることになる。
【0036】
図2に示すように、サーバ1は、各種プログラムに基づき数値計算や情報処理を行うとともに、ハードウェア各部の制御を行うCPU(Central Processing Unit)11と、起動プログラムや初期化プログラム等が格納されたROM(Read Only Memory)12と、CPU11が各種プログラムを実行する際のワークエリアとして機能するRAM(Random Access Memory)13と、外部の通信ネットワーク100と通信可能に接続される通信部16と、補助記憶手段として機能するHDD(Hard Disk Drive)17と、を有しており、これらの間の通信は、データバスやアドレスバスなどのバスを介して行われる。
【0037】
サーバ1のHDD17には、各種アプリケーションを実行するとともに、サーバ1全体を統合的に管理するOS(Operating System)がインストールされている(図示せず)。また、OS上で実行されるアプリケーション(アプリ)として、被験者に出題する課題を選択して設定するとともに、被験者の解答を確認するための課題設定・解答確認アプリ172と、被験者のスキルを定量的に評価する生産性・品質評価アプリ174と、クライアント端末2A,2Bのウェブブラウザアプリ272からの要求に応じて、HTML(Hyper Text Markup Language)文書やXML(Extensible Markup Language)文書、画像などの情報をクライアント端末2A,2Bに送信するウェブアプリ175がインストールされている。ウェブアプリ175のインストールによって、サーバ1はウェブサーバとして機能し得る。各アプリケーションは、アプリケーションプログラムがHDD17からRAM13にロード(展開)され、各アプリケーションプログラムに基づきCPU11によって実行される。
【0038】
このように、サーバ1は、ユーザによるクライアント端末2A,2Bの受付部24の操作によって、サーバ1から送信された画像などの情報を表示部25に表示させるユーザインタフェースを提供するために、OSやウェブアプリ175などを有する。
【0039】
さらに、サーバ1のHDD17は、被験者に出題する課題を登録する課題データベース(DBと略す。以下同様)176と、システム利用権限を有する課題出題者を登録するための出題者DB178と、クライアント端末2A,2Bに送信するHTML文書や画像などが格納される発行DB179と、被験者から取得した解答を格納する解答DB180と、を有している。
【0040】
より具体的に説明すると、課題DB176は、過去の課題(ソフトウェア資産)を容易に再利用することができるようにするために、課題出題者によって作成されたプログラミング課題の課題名や課題内容を登録(記憶)しておくDBである。出題者DB178は、課題出題者としてシステムの利用する権限があるか否かを確認するために、課題出題者のログインIDやパスワードを登録しておくDBである。発行DB179は、被験者がプログラミング課題に対する解答を入力するための画面を被験者のクライアント端末2Bに表示させるHTML文書や画像などを格納しておくDBである。それらのHTML文書や画像などは、後述するクライアント端末2Bのウェブブラウザアプリ272(図3)からの要求に応じて、被験者のクライアント端末2Bに送信される。解答DB180は、被験者から取得した解答、すなわち(例えば被験者がソースコードを1文字入力するごとに)クライアント端末2Bから送られてきたログデータ(被験者が作成したソースコード)を格納(記憶)しておくDBである。詳細は後述するが、そのログデータをサーバ1が受信したタイミングも解答DB180に格納される。
【0041】
なお、サーバ1のHDD17は、フラッシュメモリやUSB(Universal Serial Bus)メモリ(及びメモリコントローラ)、光ディスクドライブ等で代替することもできる。また、各アプリケーションプログラムは、予めHDD17に格納することもできるし、CDやDVD等の記録媒体からHDD17に格納することもできるし、通信ネットワーク100を介して外部のコンピュータからダウンロードされ、HDD17に格納することもできる。さらに、説明の便宜上、上述したアプリは別々に一のHDD17に格納されていることとするが、複数のHDD17に分散して格納することもできるし、また、複数のアプリが統合されたものが一のHDD17に格納することもできる。
【0042】
図3は、クライアント端末2のハードウェア構成例を示すブロック図である。なお、課題出題者が操作するクライアント端末2Aのハードウェア構成と、被験者が操作するクライアント端末2Bのハードウェア構成とは同様であるので、特に区別することなく、クライアント端末2のハードウェア構成として説明する。なお、プログラミング能力診断装置として機能するクライアント端末2Aの詳細については、図17に示す機能ブロック図を用いて別途後述する。
【0043】
図3に示すように、クライアント端末2は、CPU21と、ROM22と、RAM23と、マウスやキーボード等によりユーザの操作を受け付ける受付部24と、モニタ等の表示部25と、ネットワークカード等の通信部26とがバスを介して接続されている。これら各部が提供する機能は、基本的にサーバ1の対応する各部と同様である。また、クライアント端末2はHDD27を有しており、このHDD27には、受付部24及び表示部25による入出力機能や、各種アプリケーションを実行するための機能、および、表示部25においてGUIを利用するための機能などを提供するとともに、クライアント端末2全体を統合的に管理するOSがインストールされている(図示せず)。
【0044】
また、OS上で実行されるアプリケーション(アプリ)として、電子メールの送受信を行う電子メールアプリ271と、課題出題者が出題したプログラミング課題をウェブ上で閲覧するためのウェブブラウザアプリ272とがインストールされている。ウェブブラウザアプリ272のインストールによって、クライアント端末2はウェブクライアントとして機能し得る。これらの各アプリケーションは、アプリケーションプログラムがHDD27からRAM23にロード(展開)され、各アプリケーションプログラムに基づきCPU21によって実行される。なお、サーバ1のHDD17と同様に、クライアント端末2のHDD27も、フラッシュメモリやUSBメモリ(及びメモリコントローラ)、光ディスクドライブ等で代替することが可能である。
【0045】
図4は、図1に示すシステムを用いて、プログラミング課題に対する被験者の解答データを、通信ネットワーク100を介してサーバ1からクライアント端末2Aにダウンロードするまでのプロセスを示すフローチャートである。各プロセスの概要について説明すると、プログラミング課題を出題する出題者が、プログラミング課題をサーバ1に登録するために、サーバ1にログインするステップS1、その出題者が、被験者に受けさせたいプログラミング課題を作成し、サーバ1に登録するステップS2、その出題者が、被験者に受けさせたいプログラミング課題(ステップS2で登録したものでもよいし、過去に自分が登録したものでもよいし、他の出題者が過去に登録したものでもよい)を選択するステップS3、選択されたプログラミング課題に対する解答を入力するためのウェブサイトを示すURLを設定(発行)するステップS4、そのURLを電子メール等で知らされた被験者が、URLが示すウェブサイトにアクセスするステップS5、被験者のプログラミング課題に対する解答の入力を受け付けるステップS6、プログラミング課題を出題した出題者が、被験者の解答を確認するステップS7、そして、プログラミング能力を診断し、スキル評価を行うステップS8、という流れからなる。
【0046】
図4に示すように、まず、課題出題者のログインが行われる(ステップS1)。具体的には、課題出題者が、自己のクライアント端末2Aのウェブブラウザを立ち上げ、通信ネットワーク100を介してサーバ1に(所定のリンク先に)アクセスする。そして、クライアント端末2Aが、表示部25にログイン画面を表示させるためのHTML文書等の送信をサーバ1に要求すると、CPU11によって、これらのHTML文書等がクライアント端末2Aに送信される。
【0047】
課題出題者は、クライアント端末2Aの受付部24(マウスやキーボード等)の操作により、自己のログインIDとパスワードを入力する。そして、ログインIDとパスワードがサーバ1に送られ、それらの照合が行われた後、課題出題者のログインが完了する。ログインIDやパスワードの照合は、上述したように、CPU11がHDD17内の出題者DB178にアクセスすることによって行う。これにより、課題出題者にスキル診断システムの利用権限があることが確認される。なお、照合に失敗した場合には、ログインを拒否される。
【0048】
課題出題者のログインが完了すると、プログラミングスキル診断システムのトップメニューが表示される。具体的には、サーバ1のCPU11は、クライアント端末2Aの受付部24からの操作信号を受信して、課題出題者のログインを認識すると、クライアント端末2Aの表示部25にトップメニュー画面を表示させる。
【0049】
図5は、トップメニュー画面の一例である。図5に示すトップメニュー画面には、新規課題の登録や課題内容の編集を行うための課題登録ボタン61と、プログラミング課題を出題するためのURLを設定して発行するための課題URL発行ボタン62と、被験者の解答を確認するための解答確認ボタン63とが、上からこの順で配置されている。このように、トップメニュー画面の一画面上に、課題登録、URL発行、課題確認を行うためのボタンが配置されることで、課題出題者は、被験者に受けさせたいプログラミング課題を作成し、サーバ1に登録すること(図4のステップS2)、被験者に受けさせたいプログラミング課題を選択するとともに(図4のステップS3)、選択されたプログラミング課題に対する解答を入力するためのウェブサイトを示すURLを設定(発行)すること(図4のステップS4)、被験者の解答を確認すること(図4のステップS7)、という一連の作業を、容易かつ迅速に行うことができる。
【0050】
解答確認ボタン63の右方には、新着解答の件数を示す解答新着件数表示欄64が配置されている。これにより、課題出題者は、トップメニュー画面を視認すると同時に、被験者からの解答がサーバ1に届いているかどうかを確認することができる。
【0051】
次に、課題出題者は、図5に示すトップメニュー画面から課題の登録を行う(図4のステップS2)。具体的には、課題出題者によってトップメニュー画面の課題登録ボタン61がクリックされると、クライアント端末2Aの表示部25に課題登録画面が表示される。
【0052】
図6は、課題登録画面の一例である。図6に示す課題登録画面の上方には、既に課題出題者によって登録された課題の一覧が表示される。これにより、課題出題者は、被験者に受けさせることが可能な課題を一目で容易に確認することができる。なお、課題一覧中の「登録者」は、課題名で示されたプログラミング課題を過去に作成した者、すなわちサーバ1に課題名で示されたプログラミング課題を過去に登録した者である。また、「難易度」は、登録者によるコメントである。難易度が高いか低いかについては、登録者の私見により、一コメントとして表示される。また、課題出題者によって登録された課題が未だ存在しない場合には、空欄表示になる。
【0053】
図6に示す課題登録画面において、課題一覧表の下方には、新しい課題を登録するための新規登録ボタン617と、選択されている課題を編集目的で開くための開くボタン618とが配置され、これらのボタンの更に下方に、トップメニュー画面にリンクが張られた文字「TOP」619が表示されている。
【0054】
課題の登録手順としては、上述した新規登録ボタン617をクリックして新しく課題を登録するか、上述した開くボタン618をクリックして過去の課題を編集するか、の2種類がある。いずれの登録手順でも、登録設定ダイアログ画面が表示され、登録条件の設定に移る。
【0055】
図7は、登録設定ダイアログ画面の一例である。図7に示す登録設定ダイアログ画面は、開くボタン618をクリックしてダイアログ画面が表示された直後のイメージであり、新規登録ボタン617をクリックした場合には、ダイアログ画面は全て未設定状態(空欄表示)になる。このように、開くボタン618を新規登録ボタン617の下に並べて配置しておき、開くボタン618のクリックにより、過去の課題が自動的に読み込まれた登録設定ダイアログ画面が表示されるようにすることで、課題出題者は、過去の課題(過去の資産)を容易に再利用することができる。
【0056】
例えば、課題「英単語カウント」の派生課題を作りたい場合には、図6に示す課題一覧表において「英単語カウント」にカーソルをあわせ、開くボタン618のクリックによりこれを開く。そして、図7に示す登録設定ダイアログ画面上で内容をアレンジし、課題名テキストボックス6181上で別の課題名(「英単語カウント2」など)を入力し、登録ボタン6189をクリックすればよい。これにより、課題出題者は、過去の課題の派生課題を容易に作ることができる。
【0057】
図7に示す登録設定ダイアログ画面の上方には、課題名を新規入力できる課題名テキストボックス6181、CかJAVA(登録商標)などの言語を選択できる言語リストボックス(プルダウンメニュー)6182が設けられている。課題名テキストボックス6181を設けておけば、上述したように、容易に派生課題を作ることができる。また、言語リストボックス6182を設けておけば、課題出題者がC言語かJAVA(登録商標)言語かを自由に選択することができるとともに、将来的に、課題サポート言語(Rubyなど)が増えた場合に容易に追加することができる。
【0058】
言語リストボックス6182の下方には、プログラミング課題の内容を直接入力するための課題内容登録エリア6183が配置されている。文章のみの課題の場合には、テキスト形式で課題を作成することができるし、課題に図を入れたい場合には、PDF形式或いはJPEG形式で課題を作成することができる。本実施形態では、課題内容登録エリア6183の初期状態はテキストボックスとしている。したがって、課題出題者が課題文を登録するときには、この課題内容登録エリア6183に直接課題文を書いてもよいし、別の文書からコピー&ペーストしてもよい。
【0059】
課題内容登録エリア6183の下方には、自動単体テストのためのテストコードを直接入力し、登録するためのテストコード登録エリア6185が配置されている。自動単体テストとは、被験者が作成したプログラムについて、プログラミング課題を出題した出題者により設定された所望のプログラム出力が得られるか否かのテストのことであり、サーバ1を通じて被験者のクライアント端末2Bにおいて実行される。本来は、この自動単体テストは被験者がクライアント端末2Bにおいて実行するものであるが、図7に示す登録設定ダイアログ画面の最下方にテストボタン6187を設けることによって、課題出題者は、課題内容を登録する段階において、プログラミング課題に対する解答を自分で試作してみるとともに、試作したプログラムについて自動単体テストを実行してみることができる。自動単体テストを実行するためのテストボタン6187の詳細については、後述する。なお、内容のクリアボタン6186をクリックすれば、テストコード登録エリア6185に入力した内容が消去される。
【0060】
図7において、登録設定ダイアログ画面の下方に配置された登録ボタン6189は、課題内容登録エリア6183やテストコード登録エリア6185に入力した設定内容に従って、プログラミング課題を登録するためのボタンであり、キャンセルボタン6188は、課題内容登録エリア6183やテストコード登録エリア6185に入力した設定内容を破棄してダイアログを閉じるボタンである。前者の登録ボタン6189について具体的に説明すると、CPU11は、課題内容登録エリア6183やテストコード登録エリア6185に入力された設定内容を、HDD17の課題DB176に登録する。
【0061】
次に、課題出題者は、図5に示すトップメニュー画面に戻って、課題の選択を行う(図4のステップS3)。具体的には、課題出題者によってトップメニュー画面の課題URL発行ボタン62がクリックされると、クライアント端末2Aの表示部25に課題URL発行画面が表示される。
【0062】
図8は、課題URL発行画面の一例である。図8に示す課題URL発行画面の上方には、既に課題出題者によって登録されている課題の一覧が表示される。課題一覧は、図6に示す課題一覧と同じものである。したがって、課題一覧は、図6と図8で2箇所表示されることになり、両方の画面で課題出題者が記入したコメント(「難易度」など)は互いに反映させる必要がある。
【0063】
また、課題一覧の下方には、発行履歴一覧が表示されており、その表示項目は、左欄より、発行日621、課題名622、有効期限623、発行者624、目的625の順で並んでいる。発行日621、課題名622、有効期限623の項目は、システムによって自動的に表示される項目であり、発行者624、目的625の項目は、課題出題者が任意に記入するコメントである。特に、有効期限623について詳述すると、課題出題者が発行したURL(で示されたリンク先)の有効期限が過ぎたか否か(そのURLを用いて被験者が受験可能か否か)を示しており、有効期限が過ぎていない場合には、黒丸印がついている。仮に、黒丸印がついている課題を出題した場合には、今回の被験者だけでなく、既にその課題を出題されている被験者からも解答が送られてくる可能性があり、管理が煩雑になる(黒丸印がついていない課題については、解答画面へのアクセス有効期限が過ぎているために、今回の被験者以外の者から解答が送られてくることはない)。したがって、有効期限623の項目を設けることによって、課題発行管理の利便性を高めることができる。なお、URL(で示されたリンク先)の有効期限の詳細については、図9を用いて後述する。また、本明細書では、インターネット等の通信ネットワーク100上で、HTMLファイルや画像等のデータが保存される場所を示す識別子として、URLを用いているが、これはURI(Uniform Resource Identifier)と称することもできる。
【0064】
図8に示す課題URL発行画面から、課題URLを発行する手順としては2つある。1つは、登録されているプログラミング課題を選択して、新規発行ボタン627をクリックする方法であり、もう1つは、過去の発行履歴を選択して、修正/再発行ボタン629をクリックする方法である。これらのいずれの手順でも、後述する発行設定ダイアログ画面(図9参照)が表示部25に表示される。発行設定ダイアログが開いたときの各設定項目は、新規発行ボタン627がクリックされたときには、課題名のみがセットされて他は全て未設定状態で表示(空欄表示)される一方、修正/再発行ボタン629がクリックされたときには、過去に発行したときの条件がセットされた状態で表示される。これにより、過去に発行したURLを再利用する場合には、課題出題者が条件を再度入力する手間を省くことができる。
【0065】
図9は、発行設定ダイアログ画面の一例である。図9に示す発行設定ダイアログ画面の一番上には、現在登録されている課題を課題名ごとに選択できるリストボックス701が表示される。これにより、過去の発行履歴と全く同じ設定にしつつ、被験者に出題する課題だけを変更してURLを発行するような場合に、URL有効期限などを何度も設定する手間を省くことができる。
【0066】
リストボックス701の下には、発行するURL(で示されたリンク先)の有効期限を設定するために、テキストボックス等から構成されるURL有効期限入力欄702が表示される。URL有効期限入力欄702では、日時を指定する、発行からの期間を指定する、或いは、最終アクセスからの期間を指定する、という3種類の条件でURL(で示されたリンク先)の有効期限を設定することができる。これにより、仮にURLが漏洩した場合であっても、有効期限経過後のシステムの無断利用を防ぐことができる。また、URL(で示されたリンク先)の有効期限を設定することができれば、図8を用いて前述したように、有効期限が過ぎているリンク先のURLを一目で把握することができるので、課題発行管理の利便性を高めることができる。
【0067】
URL有効期限入力欄702の下には、課題解答時に被験者にパスワード入力を要求するかどうかを設定するパスワード入力欄703が表示され、パスワード入力欄703の下には、時間制限入力欄704が表示されている。なお、パスワードの入力回数のカウントや、解答時間の計測は、CPU11の内蔵タイマや外付けタイマ等を用いることによって実現することができる。
【0068】
時間制限入力欄704の下には、発行タイトル入力欄705とメッセージ入力エリア706、及び解答入力フィールド設定欄707が表示されている。これらは、被験者が操作するクライアント端末2Bの表示部25に表示させる画面をカスタマイズする設定欄・設定エリアである。特に、解答入力フィールド設定欄707は、被験者が自分の氏名を入力する場合に、入力可能な文字数を制限することを可能にするとともに、被験者が自分の携帯メールアドレスを入力する場合に、入力可能な文字数を制限することを可能にする欄である。
【0069】
図9に示す発行設定ダイアログ画面の一番下には、テストボタン708、キャンセルボタン709、発行ボタン710が横に並べて配置されている。テストボタン708は、設定内容に従って図10に示す発行画面を表示するボタンであり、課題出題者が、実際に被験者に表示される内容を確認するためのボタンである。このテストボタン708は、あくまで確認用の発行画面を表示するためのボタンであって、実際にプログラミング課題に対する解答を入力するためのURLは発行されない。すなわち、後述する発行ボタン710のように、図9に示す設定内容とプログラミング課題とが対応付けられて、発行DB179に格納されるわけではない。また、キャンセルボタン709は、設定内容を破棄して、発行設定ダイアログを閉じるためのボタンである。
【0070】
そして、発行ボタン710は、図9に示す設定内容とプログラミング課題とを対応付けて、発行DB179に格納するためのボタンである。具体的に説明すると、課題出題者によって発行ボタン710がクリックされると、発行ボタン710の操作信号を受信したCPU11は、課題DB176から被験者に受けさせたい課題(図9でいえば課題「英単語カウント」)をRAM13上にコピーして読み出す。また、その課題に対し、図9に示す設定内容を対応付けて、HDD17内の発行DB179に格納する。このように、テストボタン708と異なり、発行ボタン710をクリックすることによって、実際に課題と設定内容が対応付けられて、HDD17内の発行DB179に格納される。発行DB179に格納されるファイルは、後述する図10に示す発行画面を、表示部25に表示させるために、HTML文書やXML文書等で格納される。
【0071】
また、発行ボタン710は、図9に示す設定内容に従って、例えば図10に示す発行画面をクライアント端末2Aの表示部25に表示させるためのボタンでもある。具体的に説明すると、課題出題者によって発行ボタン710がクリックされると、図9に示す設定内容に従って、図10に示す発行画面が自動的に生成され、その発行画面がクライアント端末2Aの表示部25に表示される。
【0072】
図10は、課題出題者が操作するクライアント端末2Aの表示部25に表示される発行画面の一例である。図11は、図10に示す発行画面が、課題出題者のクライアント端末2Aにおける表示部25のブラウザ上に表示されている様子を示す。上述のようにして自動的に生成された図10の発行画面のURL(http://www.abc000・・・)、すなわち図11に示すURL1000は、課題出題者が被験者に受けさせたい課題、図9に示すURL有効期限入力欄702に入力された有効期限、図9に示すパスワード入力欄703に入力されたパスワードなどと対応付けられる。また、図10及び図11では、図9の発行タイトル入力欄705とメッセージ入力エリア706に入力した内容が表示されている。なお、この図10に示す発行画面は、後述するように、被験者が操作するクライアント端末2Bの表示部25に表示させる画面になる。
【0073】
次に、課題出題者が、図11に示す発行画面のURL1000をコピー&ペーストして、電子メールで被験者に送った後、電子メールを受信した被験者は、クライアント端末2Bを操作してそのURLにアクセスする(図4に示すステップS5)。具体的には、課題出題者のクライアント端末2A及び被験者のクライアント端末2Bにおいて、HDD27内の電子メールアプリ271が実行され、上述したURLが付された電子メールが、クライアント端末2Aからクライアント端末2Bへと送信される。
【0074】
被験者は、クライアント端末2Bのウェブブラウザアプリ272を実行し、課題出題者によって選択された課題に対する解答を入力可能なウェブページを取得するために、電子メールに付されたURLにアクセスする(電子メール上で、ハイパーリンクされたURLをクリックすることもできる)。
【0075】
サーバ1は、クライアント端末2Bのウェブブラウザアプリ272からの要求に応じて、発行DB179に格納されているHTML文書等をRAM13上にコピーして読み出して、通信部16を介して、それをクライアント端末2Bに送信する。これにより、課題出題者によって選択されたプログラミング課題に関する課題情報を、図11に示す発行画面を通じて被験者に伝える。
【0076】
次に、被験者は、クライアント端末2Bの表示部25に表示された、図11に示す発行画面を閲覧して、必要事項を入力した後、課題に対する解答入力を行う。すなわち、サーバ1側からみれば、課題に対する解答入力の受付が行われる(図4のステップS6)。
【0077】
図11に示す発行画面には、上から順に、URL1000、課題出題者が発行タイトル入力欄705(図9)に入力した内容801、パスワード入力欄802、課題出題者がメッセージ入力エリア706(図9)に入力した内容(符号省略)、解答者氏名入力欄803、携帯メールアドレス入力欄804、携帯メールアドレス再入力欄805、スタートボタン806が表示される。
【0078】
被験者は、パスワード入力欄802に、予め電子メール等で知らされているパスワード「test2009」を入力し、解答者氏名入力欄803及び携帯メールアドレス入力欄804に氏名とメールアドレスを入力した後に、スタートボタン806をクリックする。そうすると、クライアント端末2Bの表示部25にプログラミング画面(図12)が表示される。具体的には、サーバ1のウェブアプリ175は、クライアント端末2Bのウェブブラウザアプリ272からの要求に応じて、発行DB179から、表示部25にプログラミング画面を表示させるためのHTML文書等をRAM13上にコピーして読み出して、それをクライアント端末2Bに送信する。これにより、被験者にプログラミング環境を提供する。なお、図12は、課題表示/編集エリア901にまだ何も入力されていない様子を示している。
【0079】
図12に示すプログラミング画面中、課題表示/編集エリア901の「課題」タブをクリックすると、例えば図13に示すように、課題出題者が被験者に受けさせたい課題の内容(課題文)が表示される(図7に示す課題内容登録エリア6183参照)。上述したように、課題内容が省略されている場合(課題内容は口頭などで既に伝えている場合)には、「課題」タブをクリックしても空欄表示となる。
【0080】
図12又は図13において、課題表示/編集エリア901は、「課題」タブによって課題内容を表示するエリアであるとともに、「編集」タブによってソースコードの作成・編集を行わせるエリアである。プログラミングをしている最中に、課題表示とソースコード編集は随時切り替えることができる。これにより、被験者は、課題を忘れた場合であっても課題内容を適宜確認することができる。
【0081】
課題表示/編集エリア901の下に表示される出力エリア902は、被験者にとって標準出力(STDOUT)エリアになる。ここにはビルド結果やプログラムの出力結果などが表示される。例えば、図14に示すような警告表示がなされたり、図15に示すようなエラー表示がなされたりする。出力エリア902の下には、ビルドボタン903、実行ボタン904、テストボタン905、及び完了ボタン906が左から順に並んでいる。
【0082】
ビルドボタン903は、サーバ1において作成中プログラムのビルドを行う。具体的に説明すると、被験者が課題表示/編集エリア901に入力したソースコードは、順次サーバ1に送られる。例えば、JavaScriptを利用して非同期通信を行い、サーバ1とクライアント端末2Bの間でXMLデータのやり取りを行うAjax(Asynchronous JavaScript+XML)を用いることができる。これにより、クライアント端末2Bは、被験者のプログラミング過程データ(ログデータ)をサーバ1に非同期で送り続けることができる。
【0083】
なお、ログデータは、被験者がソースコードを1文字入力するごとに送られてもよいし、所定のブロック(例えば任意の関数)を完成させるごとに送られてもよい。本実施形態では、被験者がソースコードを1文字入力するごとに、ログデータ(それまで被験者が記述したソースコード)がサーバ1に送られるものとする。これにより、通信障害等で送信されたログデータが一部失われたとしても、サーバ1は、それ以降のログデータを受信することにより、ログデータを回復(欠落部分を補充)することができ、ひいてはビルド対象となるログデータの信頼性を高めることができる。また、Ajax以外にも、サーバ1がログデータを受信できる技術であれば、如何なる技術を採用してもよい。例えば、サーバ1との同期通信を行うDHTML(Dynamic Hyper Text Markup Language)を用いて、所定のタイミング(例えばリロードタイミング)でログデータをサーバ1に送ってもよい。その他、プラグインのインストールを前提に、より自由度の高いFlash(登録商標)を用いてもよい。
【0084】
サーバ1のCPU11は、クライアント端末2Bから送られてきたログデータを、通信部16を介して受信すると、解答した被験者と対応付けてHDD17内の解答DB180に順次格納する。このとき、CPU11の内蔵タイマ又は外付けタイマ、或いは時計機能等によって、通信部16においてログデータを受信したタイミングが解答DB180に格納される。このタイミングは、後述する[プログラミング能力診断]又は[定量的なスキル評価]に用いられる。
【0085】
このように、解答DB180にログデータが順次格納されている状態において、被験者がビルドボタン903をクリックすると、クライアント端末2BのCPU21は、通信部26を介してビルド実行命令をサーバ1に送信する。サーバ1のCPU11は、通信部16を介してビルド実行命令を受信すると、解答DB180から現在格納されているログデータ(それまで被験者が作成したソースコードに相当)を読み出して、ビルドを行う。ビルドについては、コンパイルとリンクを連動させて実行形式のファイルを自動生成する処理である。ビルドの過程で、文法エラーがあった場合等には、コンパイラのメッセージは出力エリア902に表示される。なお、本実施形態では、ビルドを行うタイミングで解答DB180からログデータを読み出すこととしたが、もしログデータの欠落があった場合には、ビルド結果の信頼性が低下する。そこで、例えばサーバ1は、ビルド実行命令を受けたタイミングで、クライアント端末2Bから再度ログデータを取り直すこともできる。これにより、ログデータの欠落がない状態でビルドできるので、ビルド結果の信頼性を高めることができる。
【0086】
実行ボタン904は、作成中のプログラムを実行するためのボタンであり、これをクリックすることによって、ビルドにより自動生成された実行形式のファイルが開かれる。プログラムからの標準出力は、出力エリア902に表示される。作成中のソースコードに変更があった状態で実行ボタン904がクリックされると、変更後のソースコードについて未だビルドが行われていないので、「ビルドを行いますか?」といった表示とともに、ビルドを許容するOKボタンが、例えばポップアップウィンドウにより自動的になされる。そして、被験者は、ビルドボタン903を直接クリックすることによって、或いは、実行ボタン904をクリックした後に、ポップアップウィンドウのOKボタンをクリックする等してビルドを許容することで、自分が記述したソースコードに、文法エラーがないか否か等を確認することができる。なお、「ビルドを行いますか?」といった表示をせず、実行ボタン904がクリックされた場合にビルドされていないとき、自動的(強制的)にビルドされ、その後、自動的に実行形式のファイルが開かれるようにしてもよい。
【0087】
ここで、文法エラー等がない場合であっても、課題出題者が意図した出力結果が得られない可能性がある。そこで、被験者は、テストボタン905を利用する。テストボタン905は、自動単体テストを実行するためのボタンであり、自動単体テストとは、課題に対する解答されたソースコードが論理的に正しいか否かを自動的にチェックするためのテストをいう。前述した図7に示すテストコード登録エリア6185には、main関数と、TestCaseという名前(この名前は一例であり、他の名前でもよい)の構造体(struct)が記述されている(一部抜粋)。被験者がテストボタン905をクリックすると、図15に示す課題表示/編集エリア901に記述されたソースコードに、図7に示すテストコード登録エリア6185を通じて課題出題者が登録したテストコードがマージされ、ビルドが行われる。その後、自動生成された実行形式のファイルが開かれ、出力結果が出力エリア902に表示される。このようにして、被験者は、課題出題者が意図した出力結果が得られるか否かを、課題提出前に確認することができる。
【0088】
換言すれば、サーバ1のHDD17には、コンパイラやリンカとしての機能を提供するプログラミングアプリケーション(図2では図示せず)がインストールされており、CPU11は、そのプログラミングアプリケーションを実行することによって、上述したソースコードとテストコードをマージしたもののビルドを行う。
【0089】
ソースコードとテストコードのマージ方法は、如何なる方法であってもよい。例えば、課題表示/編集エリア901に記述されたソースコードの中に、main関数に相当する記述があった場合には、その部分を削除したり、(テストコード中のmain関数が真のmain関数となるように)属性変更を行ったりするなど、必要に応じて編集を行った上で、ソースコードとテストコードをマージすればよい。ビルドが完了すると、CPU11は、得られた実行形式のファイルを実行し、出力結果を表示部25(図15に示すプログラミング画面の出力エリア902)に表示する。
【0090】
このように、被験者は、サーバ1のプログラミングアプリケーション機能の提供を受けることで、自己のクライアント端末2B上において、自動単体テストを実行することができる。すなわち、本実施形態では、被験者が操作するクライアント端末2Bは、プログラミング課題を出題された被験者がプログラミング課題を解決するプログラムを作成するプログラム作成装置の一例となる。また、このクライアント端末2Bにおいて、被験者によってプログラムが作成され、プログラミング課題を出題した出題者により設定された所望のプログラム出力が得られるか否かのテストとして、自動単体テストが実行される。換言すれば、サーバ1に登録されているテストコードと、被験者により作成されたソースコードとを組み合わせることによって生成された、テスト用プログラムの出力結果を得るためのテストとして、自動単体テストが実行される。
【0091】
なお、図7を用いて説明したテストボタン6187に関して補足すると、このボタンは、上述したように、課題出題者が課題内容を登録する段階において、プログラミング課題に対する解答を自分で試作してみるとともに、試作したプログラムについて自動単体テストを実行してみるためのボタンである。すなわち、課題出題者によってテストボタン6187がクリックされると、図12に示すプログラミング画面が、課題出題者のクライアント端末2Aの表示部25に表示される。そして、課題出題者は、プログラミング画面の課題表示/編集エリア901に、課題に解答するソースコードを試しに記述してみる。課題出題者は、プログラミングが終了すると、図12のプログラミング画面下方のテストボタン905をクリックする。そうすると、被験者が自動単体テストを行うのと同様に、課題表示/編集エリア901に記述されたソースコードに、図7に示すテストコード登録エリア6185を通じて登録されたテストコードがマージされ、ビルドが行われる。このようにして、課題出題者は、課題内容を登録する段階において(図7参照)、図7に示すテストボタン6187をクリックすることにより、試しに課題を解いてみることができる。つまり、自分が作成した模範ソースコードと模範テストコードによって、意図した出力結果が得られるか否かを試すことができる。
【0092】
図12に戻って、最後に、被験者が完了ボタン906をクリックすると、プログラミング課題の受験は終了する。ただし、テストボタン905による自動単体テストに合格していない場合は、「全てのテストケースを通過していません。終了しますか?」というメッセージが表示される。すなわち、受付部24から操作信号を受信したクライアント端末2BのCPU21は、その旨をサーバ1に知らせる受験完了信号を送信する一方で、サーバ1のCPU11は、その受験完了信号を受信すると、解答DB180にアクセスして、テストボタン905による自動単体テストの合否履歴を確認する。なお、ここでいう全てのテストケースとは、図7に示すテストコード登録エリア6185を通じて課題出題者が登録したテストコード(例えば、ある変数に第1の値を代入すると、出力結果として第2の値が出力される等)の全てのケースを意味する。そして、自動単体テストのテストケースで1つでも合格していないと判定した場合には、上述したメッセージを表示させるHTML文書を、クライアント端末2Bに送信する。これにより、課題出題者が作った自動単体テストで合格した後に、作成したプログラムを提出するよう被験者に促すことができる。
【0093】
このようにして、結果的にサーバ1の解答DB180には、課題出題者により設定された所望のプログラム出力が得られて自動単体テストを通過したプログラム(テスト通過プログラム)と、被験者がテスト通過プログラムを作成する過程で生成された複数のプログラム(中間生成プログラム)とが格納されることになる。本実施形態では、上述したAjax等の技術を用いて、被験者が受付部24を1回操作するごとに、クライアント端末2Bからサーバ1へデータ転送が行われる。なお、テスト通過プログラムについては1個であっても複数であってもよい。
【0094】
図12に戻って、完了ボタン906のクリックによって、被験者によるプログラミング課題の受験が終了すると、上述した図5に示すトップメニュー画面の解答新着件数表示欄64が1だけインクリメントされる。すなわち、サーバ1のCPU11は、クライアント端末2Bからの受験完了信号を受信すると、解答新着件数表示欄64に表示された数字に1を加算する。そうすると、課題出題者は、図5に示すトップメニュー画面の解答確認ボタン63をクリックすることにより、解答確認画面上で被験者の解答を確認することができる(図4に示すステップS7)。
【0095】
図16は、課題出題者が被験者の解答を確認するための解答確認画面の一例である。図16に示す解答確認画面には、トップメニュー画面に表示されていた解答新着件数表示欄64と同じく、解答新着件数表示欄631が表示されている。また、解答新着件数表示欄631の下には、被験者が解答した課題の一覧(結果一覧)が表示される。この結果一覧において、基準632、課題名633、解答日634は、システムによって必ず表示される項目である。また、基準632の欄については、後述する[定量的なスキル評価]に用いられる。
【0096】
結果一覧の下方には、チャート表示ボタン637、ダウンロードボタン638、課題情報ボタン639、発行情報ボタン640が表示されている。結果一覧では、これら4個のボタンのいずれによっても開かれていない新着解答データについては、太字で示されるようになっている。これにより、課題出題者は、まだ開いていない新着データを容易に把握することができる。
【0097】
チャート表示ボタン637は、後述する[定量的なスキルの評価]の評価結果を生産性・品質チャートで表示するためのボタンである。ダウンロードボタン638は、解答DB180から被験者の解答を読み出してダウンロードするためのボタンである。具体的には、課題出題者のクライアント端末2Aの表示部25上で、ダウンロードボタン638がクリックされると、サーバ1のCPU11は、解答DB180に格納された被験者の解答(上述したテスト通過プログラムと中間生成プログラム)を読み出して、クライアント端末2Aに対して送信する。その結果、課題出題者のクライアント端末2Aは、テスト通過プログラムと中間生成プログラムをダウンロードし、読み込むことができる。なお、ダウンロードの対象となるのは、図16に示す解答確認画面において、カーソル等によって現在選択されているカレントデータである(図16では、No.3の解答者Qが作成した解答データ)。また、ここでは中間生成プログラム自体をダウンロードしているが、その中間生成プログラムを復元可能なプログラム構成情報をダウンロードするようにしてもよい。具体例を挙げると、“i”と入力された状態のソースコードからなる中間生成プログラム、“in”と入力された状態のソースコードからなる中間生成プログラム、“int”と入力された状態のソースコードからなる中間生成プログラムをダウンロードすることもできるし、或いは、“i”と入力された状態のソースコード、“n”と入力された状態のソースコード、“t”と入力された状態のソースコードからなるプログラム構成情報をダウンロードすることもできる。このプログラム構成情報があれば、“i”と入力された状態のソースコードからなる中間生成プログラムも、“in”と入力された状態のソースコードからなる中間生成プログラムも、“int”と入力された状態のソースコードからなる中間生成プログラムも、復元することができる。例えば、“i”と入力された状態のソースコードと、“n”と入力された状態のソースコードとを組み合わせれば、“in”と入力された状態のソースコードからなる中間生成プログラムを復元することができる。要は、プログラム構成情報は、中間生成プログラムを復元可能な情報であれば、如何なる情報であってもよい。この趣旨に照らせば、中間生成プログラム自体も、プログラム構成情報となり得る。
【0098】
以上説明したように、プログラミング能力診断装置としてのクライアント端末2Aにおいて被験者のプログラミング能力診断を行うにあたって、プログラミング課題に対する被験者の解答データを、通信ネットワーク100を介してサーバ1からクライアント端末2Aにダウンロードすることができる。
【0099】
次に、ダウンロードして取得した解答データ(テスト通過プログラムと中間生成プログラム)を用いて、クライアント端末2A上で行われるプログラミング能力診断について、具体的に説明する。
【0100】
[プログラミング能力診断]
まず、課題出題者は、図16に示す画面の下方にハイパーリンクされた「再生観察アプリケーションのダウンロードはこちら」の文字641をクリックし、インストーラファイルをダウンロードし、自己のクライアント端末2Aにインストールする。具体的には、サーバ1のHDD17には、ソフトウェアプログラムの再生観察アプリ(図示せず)も格納されており、サーバ1のCPU11は、クライアント端末2Aのウェブブラウザアプリ272の要求に従って、再生観察アプリのインストーラファイルを送信する。クライアント端末2AのCPU21は、受信したインストーラファイルを実行し、その結果生成されたファイルをHDD27に格納する。これにより、クライアント端末2Aに再生観察アプリがインストールされる。なお、本実施形態では、再生観察アプリは、通信ネットワーク100を介してダウンロードされることとしたが、USBやDVDなどの記憶媒体を使ってクライアント端末2Aにインストールすることもできる。
【0101】
図17は、再生観察アプリがインストールされた後のクライアント端末2Aのソフトウェア的な機能を示す機能ブロック図である。本実施形態では、このクライアント端末2Aが、被験者のプログラミング能力を診断するプログラミング能力診断装置の一例となる。
【0102】
図17に示すように、クライアント端末2Aは、制御部20と、受付部24と、表示部25と、通信部26と、記憶部27とを有するとともに、再生部31と、可視化図生成部32と、タイミング解析部33と、検索部34と、コード重複率解析部35とを有している。受付部24、表示部25、通信部26、記憶部27は、それぞれ図3に示す受付部24、表示部25、通信部26、HDD27によってソフトウェア的に実現される。
【0103】
特に、記憶部27は、サーバ1からダウンロードした、複数の関数モジュールから構成されるテスト通過プログラムと、複数の中間生成プログラムを復元可能なプログラム構成情報とを記憶する機能を有する。再生部31は、プログラム構成情報により復元される複数の中間生成プログラムに基づいて、テスト通過プログラムの作成過程を再生する機能を有する。可視化図生成部32は、テスト通過プログラムに基づいて、一の関数モジュール若しくは複数の関数モジュール各々の処理手順又は一の関数モジュール若しくは複数の関数モジュール間の構造が可視化された図を生成する機能を有する。制御部20は、再生部31により再生されるテスト通過プログラムの作成過程と、可視化図生成部32により生成された図とを表示部25に表示させる機能を有する。
【0104】
また、タイミング解析部33は、複数の中間生成プログラムに基づいて、一の関数モジュール又は複数の関数モジュール各々が生成されたタイミングを解析する機能を有する。検索部34は、一の関数モジュール又は複数の関数モジュール各々について、タイミング解析部33によって解析されたタイミングよりも前に、被験者による関数モジュールの記述があるか否かを、複数の中間生成プログラムを用いて検索する機能を有する。コード重複率解析部35は、一の関数モジュール内又は複数の関数モジュール間でコードの重複度合いを示すコード重複率を解析する機能を有する。
【0105】
また、制御部20は、タイミング解析部33の解析結果、検索部34の検索結果、コード重複率解析部35の解析結果を、表示部25に表示させる機能を有する。加えて、制御部20は、表示部25においてユーザの操作を受け付ける受付部24からの操作信号に基づいて、タイミング解析部33の解析結果、検索部34の検索結果、コード重複率解析部35の解析結果を、選択的に表示部25に表示させる機能(いわゆる選択切替表示機能)を有する。
【0106】
再生部31と、可視化図生成部32と、タイミング解析部33と、検索部34と、コード重複率解析部35と、制御部20との各部の機能は、図3に示すCPU21、ROM22、RAM23、及び、記憶部27に格納される再生観察アプリのソフトウェア等により機能的に実現される。以下、図18〜図40に示す画面例に基づいて、本実施形態に係るプログラミング能力診断方法の詳細について説明する。
【0107】
図18は、クライアント端末2Aにおいて再生観察アプリを起動したときに、表示部25に表示される起動画面の一例を示す図である。なお、図18に示す起動画面は、大きく横に3つの領域に分かれており、左欄には、画面モード1001、対象データファイル1002、CSV変換1003が表示され、中欄には、再生欄1004、出力欄1005が表示され、右欄には、経過時間1006、再生モード1007が表示されている。
【0108】
画面モード1001は、テスト通過プログラムの作成過程を再生する「再生モード」と、可視化図生成部32により生成された図など、プログラミング作成過程を分析するための図を表示する「分析モード」とを切り替えるためのものであって、図18ではラジオボタンによって構成されている。プログラミング能力診断を行う者は、このラジオボタンのクリック位置を所望の位置にするだけで、再生モードと分析モードを切り替えることができる。
【0109】
対象データファイル1002は、参照ボタン1002aによって指定された参照フォルダに存在するファイルであって、分析対象とするために、追加ボタン1002bによってファイル選択画面(図示せず)を表示させ、所望のファイルを追加することができる(追加した様子は後述する)。
【0110】
CSV変換1003は、後述する各パラメータ推移で用いるデータを、EXCEL(登録商標)等の汎用ソフトウェアで分析できるようにCSV形式で出力する機能である。どのファイルのどのデータを出力するかは、設定ボタン1003bによってデータ選択画面(図示せず)を表示させ、所望のデータを設定し、変換ボタン1003cをクリックすることにより、参照ボタン1003aによって指定された参照フォルダへCSV変換されたCSVファイルを出力する。これにより、プログラミング能力診断を行う者は、例えばEXCEL(登録商標)等のCSVファイルを扱うことが可能なソフトウェアを用いて、所望の分析を行うことができる。
【0111】
再生欄1004は、テスト通過プログラムの作成過程を再生するための欄であり、出力欄1005は、被験者によってコンパイルされた結果や自動単体テストが実行された結果を表示するための欄である(再生・表示している様子は後述する)。
【0112】
経過時間1006は、被験者がテスト経過プログラムを作成する過程において実際に経過した時間であり、再生モード1007は、ラジオボタン1007aのクリック位置を切り替えることによって、実時間ベースでの再生と、操作ベースでの再生を切り替えることができるようになっている。すなわち、被験者がテスト経過プログラムを作成する過程において時間の経過に応じて再生する実時間ベースでの再生と、被験者がテスト経過プログラムを作成する過程において操作する回数に応じて再生する操作ベースでの再生とを切り替えることができるようになっている。
【0113】
例えば、実時間ベースでの再生の場合には、1秒経過後、2秒経過後、3秒経過後の中間生成プログラムが、それぞれ再生欄1004に順次表示される。一方、操作ベースでの再生の場合には、1回目の操作後(例えばキーボードのiを押下した後)、2回目の操作後(例えばキーボードのnを押下した後)、3回目の操作後(例えばキーボードをtを押下した後)の中間生成プログラム(すなわち、“i”と入力された状態のソースコード→“in”と入力された状態のソースコード→“int”と入力された状態のソースコード)が、それぞれ再生欄1004に順次表示される。
【0114】
速度調整バー1007bを操作することによって、再生欄1004で再生されるスピードを調節することができる。すなわち、速度調整バー1007bを「速い」の方(上方)へ移動させることで、いわゆる早送り再生が可能となり、速度調整バー1007bを「遅い」の方(下方)へ移動させることで、いわゆるスロー再生が可能となる。最も下方へ移動させた場合には、等速再生が可能になる。このように、速度調整バー1007bを移動させるだけで、所望の速度でテスト通過プログラムの作成過程を再生することができる。
【0115】
次に、プログラミング能力診断を行う者は、再生観察アプリを起動した後、図18に示す追加ボタン1002bをクリックして、ファイル選択画面(図示せず)を表示させ、参照ボタン1002aによって指定された参照フォルダ内に存在するファイルを選択することによって、分析対象となるデータファイルを追加する。このようにして、再生部31は、記憶部27に記憶されたテスト通過プログラム及び中間生成プログラムのうち、分析対象となるものを対象ファイルとして読み込む。
【0116】
図19は、分析対象となるデータファイルが1個追加された様子を示す図である。図19では、「英単語カウント」のプログラミング課題に対してAさんが作成した対象ファイル(「英単語カウント_A」で示す)が追加されている。なお、Aさんが作成した対象ファイルを追加することで、削除ボタン1002dが有効化されている。
【0117】
また、追加ボタン1002bの下方には、「自動追加」機能を有効化するか否かのチェックボックス1002cが設けられており、このチェックボックス1002cにチェックを入れることにより、再生観察アプリを起動した際、自動的に、参照ボタン1002aによって指定された参照フォルダに存在するファイルが対象ファイルとして読み込まれる。また、対象ファイルとして自動追加するファイル数は所望の数に制限することができる。図19では、チェックボックス1002cの右側に示すように、1個までに制限されている。
【0118】
次に、プログラミング能力診断を行う者は、図19の右上に示す経過時間1006の下に配置された再生ボタン1006aをクリックする。そうすると、テスト通過プログラムの作成過程の再生が開始される。
【0119】
図20は、テスト通過プログラムの作成過程が再生されている様子を示す図である。なお、図20では、再生ボタン1006aの右側に配置された一時停止ボタン1006bをクリックした状態になっている。また、一時停止ボタン1006bの右側に配置された停止ボタン1006cをクリックすると、再生欄1004はクリアされる。
【0120】
図20に示すように、再生欄1004には、12行のソースコードが記述されており、これは、経過時間1006を見ると、プログラミング課題に対する解答を開始してから1分47秒後のソースコードであることが分かる。つまり、被験者は、1分47秒の間に12行のソースコードを記述したことが分かる。また、経過時間1006の下方には、操作回数1008aとして180回、文字数1008bとして206文字(コピー&ペースト等を考慮すれば、操作回数よりも文字数の方が多くなる場合はある)、行数として16行(ここでは空欄行もカウントされている)、課題確認時間1008dとして18秒(課題確認時間については図22を用いて後述する)、ビルド回数1008eとして0回、実行回数1008fとして0回、自動テスト回数1008gとして0回が表示されている。
【0121】
ビルド回数1008eは、上述した被験者がテスト通過プログラムを作成する過程で、図12に示すビルドボタン903をクリックした回数を示し、実行回数1008fは、被験者がテスト通過プログラムを作成する過程で、図12に示す実行ボタン904をクリックした回数を示し、自動テスト回数1008gは、被験者がテスト通過プログラムを作成する過程で、図12に示すテストボタン905をクリックした回数を示している。
【0122】
なお、自動テスト回数1008gの下に表示されたサムネイルグラフ1009は、画面モード1001において分析モードを選択したときに表示されるグラフ(詳細は後述する)のサムネイルである。特に、操作回数又は再生時間を横軸にもつサムネイルグラフ1009の中には、重なるようにして、サムネイル用再生位置バー1009aが表示されており、全体のうちどの程度まで再生が済んだかが分かるようになっている。
【0123】
また、図20の下方には、再生位置バー1010が表示されており、全体のうちどの程度まで再生が済んだかが表示されるようになっている。プログラミング能力診断を行う者は、この再生位置バー1010をクリックして、左右に移動させることによって、所望の操作回数(実時間ベースでの再生の場合には所望の経過時間)における中間生成プログラム(ソースコード)を視認することができる。
【0124】
ここで、再生位置バー1010とサムネイル用再生位置バー1009aは連動表示される。すなわち、再生位置バー1010を左右に移動させると、それに追随してサムネイル用再生位置バー1009aも移動する。このように、テスト通過プログラムの作成過程を再生するときに、操作回数(操作ベースでの再生のとき)又は再生時間(実時間ベースでの再生のとき)の経過状況を示す再生位置バー1010と、プログラミング作成過程を分析するための複数のパラメータ(詳細は後述)を表示するサムネイルグラフ1009に重なるようにして配置され、操作回数又は再生時間の経過状況を示すサムネイル用再生位置バー1009aとを、制御部20によって表示部25に連動表示させている。これにより、サムネイルグラフ1009中のパラメータを視認しながら再生位置バー1010を移動させ、再生欄1004に、所望の中間生成プログラムを迅速に表示させることができる。
【0125】
例えば、サムネイルグラフ1009中に、操作回数のパラメータが急激に増加していた箇所があった場合、プログラミング能力診断を行う者は、被験者がどのような操作を行ったか知りたいことがある。このような場合には、サムネイル用再生位置バー1009aがサムネイルグラフ1009上でその箇所にくるように、再生位置バー1010を移動させればよい。これにより、サムネイルグラフ1009上で操作回数のパラメータが急激に増加していたところで、被験者がどのような操作を行っていたかを迅速に把握することができる。なお、サムネイルグラフ1009上にどのようなパラメータを表示させるかは、グラフ設定1009bをクリックして、パラメータ選択画面(図示せず)を表示させ、所望のパラメータを選択すればよい。なお、ここでは再生位置バー1010のみを移動操作可能としているが、例えば、サムネイル用再生位置バー1009aのみ、或いは、再生位置バー1010及びサムネイル用再生位置バー1009aの双方を、移動操作可能としてもよい。
【0126】
図21は、被験者によってビルドが1回行われている様子を示す図である。図21では、クライアント端末2Bの表示部25において、図12に示す出力エリア902に表示された内容が、クライアント端末2Aの表示部25において、図21に示す出力欄1005にも表示されている。なお、ビルドが1回行われたことに伴って、ビルド回数1008eが1だけインクリメントされている。
【0127】
図22は、再生欄1004に、プログラミング課題が表示されている様子を示す図である。具体的には、図22によれば、被験者のAさんは、経過時間1006が2分7秒の時点で、プログラミング課題を見ていたことになる。ということは、実際にAさんがクライアント端末2Bにおいてプログラミングをしている最中に、2分7秒経過した時点で、図13に示すようにプログラミング課題を見ていたことが分かる。そして、プログラミング課題を見ていた時間は、上述した課題確認時間1008dとして計測されている。このように、本実施形態に係るプログラミング能力診断装置としてのクライアント端末2Aは、複数の中間生成プログラムに基づいて、被験者がテスト通過プログラムの作成過程でプログラミング課題を視認していた時間を、課題確認時間として計測する計測機能を有している。
【0128】
図23は、図21と比べて更に多くの時間が経過したときの様子を示す図である。経過時間1006は30分27秒を示しており、操作回数1008aは1018回を示している。また、再生位置バー1010は、図21よりも右に移動している。また、ビルド回数1008e及び出力欄1005に示されているように、ビルドは3回行われている。
【0129】
特に、図23では、図21と異なり、再生欄1004にスクロールバー1004aが現れている。中間生成プログラムの行数が増えてくると、自動的にスクロールバー1004aが表示される。プログラミング能力診断を行う者は、スクロールバー1004aを上下に移動させることによって、再生欄1004に、中間生成プログラムの所望箇所を表示させることができる。
【0130】
図24は、最後に生成された中間生成プログラムが表示されている様子を示す図である。図24に示すように、再生位置バー1010は最も右の位置にきており、経過時間1006は1時間27分39秒、操作回数1008aは2717回、文字数1008bは2126文字、行数は122行、課題確認時間1008dは1173秒、ビルド回数1008eは35回、実行回数16回、自動テスト回数は0回となっている。また、操作回数1008aの2717回は、サムネイルグラフ1009の横軸右端の数値2717と一致している。
【0131】
図18〜図24は、再生モード1007のうち、操作ベースでの再生について説明した。上述したように、再生モード1007におけるラジオボタン1007aのクリック位置を切り替えることによって、実時間ベースでの再生と、操作ベースでの再生を切り替えることができる。図25は、実時間ベースでの再生について説明するための図である。図25では、図24と同様に、最後に生成された中間生成プログラムが表示されている様子を示しており、経過時間1006が示す1時間27分39秒(=5259秒)と、サムネイルグラフ1009の横軸右端が示す数値5259とが一致している。
【0132】
以上が画面モード1001のうち再生観察モードについての説明である。次に、画面モード1001のうち分析モードについて説明する。図26は、プログラミング作成過程を分析するための図を表示する分析モードのうち、各パラメータ推移の様子を示す図である。図26では、左欄の画面モード1001において、ラジオボタンのクリック位置が分析モードになっている。
【0133】
図26の中央には、プログラミング作成過程を分析するための図が表示される分析欄1011が設けられている。この分析欄1011には、右欄におけるパラメータ設定1014の設定内容(チェックボックスのチェック状態)が反映される(なお、縦軸のスケールの関係で、又は、線の濃さの関係で、一部の線が見え難くなっている)。図26の右欄には、上から順に、グラフ個数1012、表示内容1013、パラメータ設定1014が表示されている。グラフ個数1012は、1011を分割表示するためのものであるが、図26では縦1×横1に設定され、分割されていない(分割されている様子については後述する)。
【0134】
表示内容1013では、ラジオボタンによって、各パラメータ推移、関数ライフサイクル、フローチャート、コードの重複を選択することができるようになっている。図26では、各パラメータ推移が選択されている。各パラメータ推移で用いるパラメータ設定1014では、正規化1015、横軸値1016、基本項目1017、オプション1018を設定することができるようになっている。正規化1015と横軸値1016の詳細については後述する(後述する図30及び図31と、図35参照)。
【0135】
基本項目1017としては、操作回数、総文字数、総行数、実コード文字数、実コード行数(空欄行を除いた実際のコード行数)、実コード語数(スペース文字を除いた実際のコード語数)、コメント文字数、コメント行数、課題確認時間、課題確認回数、ビルド回数、実行回数、自動テスト(自動単体テスト)回数、ビルドエラー数、ビルドワーニング(警告)数、自動テストエラー数といった各々のパラメータを、分析欄1011に表示させるか否かをチェックボックスにより選択できるようになっている。これらのパラメータは、特にこれらに限定されるものではなく、必要に応じて増やしたり減らしたりすることができる。
【0136】
また、ビルド回数、実行回数、自動テスト回数については、いずれも回数自体が少なく操作回数等と同じグラフに表示させると見えにくくなるため、別途オプション1018として、ビルドタイミング、実行タイミング、自動テストタイミングを、基本項目1017のパラメータが示すグラフ中に四角印で表示させるようにしている。例えば、分析欄1011中、四角印1018aは、ビルドタイミングを示し、四角印1018bは、実行タイミングを示している。このように、基本項目1017のパラメータ推移が表示されたグラフ中に、ビルドタイミングや実行タイミングを四角印で表示させることによって、ビルドタイミングや実行タイミングを視認しやすくなる。
【0137】
例えば、ビルドや実行をあまりに早いタイミングで繰り返す被験者は、頭の中で見通しが立てられないので試行錯誤している可能性がある。したがって、早い段階でビルドタイミングや実行タイミングを繰り返す被験者よりも、遅い段階でビルドタイミングや実行タイミングを繰り返す被験者の方が、プログラミング能力が優れていると考えられる。また、ビルドタイミングや実行タイミングの回数に着目すれば、回数の多い被験者よりも回数の少ない被験者の方が、プログラミング能力が優れていると考えられる。後者の方が、しっかり考えながらプログラミングを行っていると思われるからである。
【0138】
図27は、プログラミング作成過程を分析するための図を表示する分析モードのうち、関数ライフサイクルを示す図である。図27の右欄に示すように、表示内容1013のラジオボタンのクリック位置は、関数ライフサイクルの位置にある。なお、関数ライフサイクルとは、ソースコード中に関数モジュールの各々が生成され消去されるまでの、関数の生存期間を示すものであり(一般的には、プログラミング課題の題意把握ミスなどがない限り、関数モジュールは最後まで消去されることはない)、上述のとおりタイミング解析部33の解析結果に基づいて自動的に作図される。また、関数とは、引数と呼ばれるデータ(入力データ)を受け取って、予め規定された処理を実行して結果を返す命令群を意味し、一般的に、プログラムの構成要素となる。本実施形態では、入力データとして数字を扱うこととしているが、例えば、入力データとして文字が入力され、処理結果としてその文字が画面に表示されるような関数を考えることもできる。なお、横軸は、操作回数を示す(横軸値1016のラジオボタンのクリック位置は、操作回数の位置にある)。
【0139】
図27に示す関数ライフサイクルによれば、Aさんは、プログラム中に、“IsWordEnd”1021、“IsSmallAlpha”1022、“IsBigAlpha”1023、“IsAlNum”1024、“CountWord”1025、“main”1026の合計6個の関数モジュールを作っていることが分かる。特に、一番下の“main”1026は、プログラムの骨格となる基本関数(一般に、各サブルーチンを呼び出す基本関数)であり、これが早いタイミングでプログラム中に作られている。したがって、Aさんは、最初にmain関数という基本構造を作り、その後、main関数の中で個々の関数モジュールをサブルーチン化したプログラムを作っていることが分かる。
【0140】
また、図27に示す関数ライフサイクルによれば、全ての関数モジュールが、操作回数で半分よりも手前のタイミング(図27でいえば左半分のタイミング)で作られている。関数モジュールは、いわばプログラムの部品であるため、Aさんは、プログラムにどのような部品が必要になるかを早いタイミングで見通せている、すなわち構成を見通す力を有していることが分かる。
【0141】
ここで、図27に示す関数ライフサイクルの作図は、予め規定された定義に基づいて、その定義に当てはまる記述を関数として認識すればよい。代表的な方法が、コンパイラ等による構文解析である。ここではC言語を用いて記述されたソースコードの構文解析について説明する。C言語における関数は、「“関数型指定子”+“関数名”+“(”+“引数”+“)”+“{”+“関数本文”+“}”」で定義することができる。ここでいう関数型指定子は、“int”や“void”などである。可視化図生成部32やタイミング解析部33が関数モジュールを認識するときには、このような定義に当てはまる記述を検索し、見つかった場合にはその記述を関数として認識する。一部でも、この定義に当てはまらない記述については、関数として認識しない。本実施形態では、全ての中間生成プログラムに対して構文解析を試みている。そのため、上述した6個の関数モジュールの各々において、構文解析が成功した中間生成プログラムのうち、最も操作回数の少ない中間生成プログラムが生成されたタイミングが、その関数モジュールの生成タイミングとして認識される。例えば、“IsWordEnd”1021についていえば、タイミング1021aで生成された中間生成プログラムで構文解析が成功し、ソースコード中に関数モジュール“IsWordEnd”1021が存在することが認識されている。以下同様に、“IsSmallAlpha”1022、“IsBigAlpha”1023、“IsAlNum”1024、“CountWord”1025、“main”1026のそれぞれについて、タイミング1022a、1023a、1024a、1025a、1026aで生成された中間生成プログラムにおいて構文解析が成功し、ソースコード中に関数モジュール“IsSmallAlpha”1022、“IsBigAlpha”1023、“IsAlNum”1024、“CountWord”1025、“main”1026が存在することが認識されている。
【0142】
このように、タイミング解析部33の解析結果に基づけば、ソースコード中に関数モジュールがどのタイミングで生成されたかを認識することができる。しかしながら、ここでいうタイミングとは、あくまでタイミング解析部33による“解析が成功した”タイミングを意味し、実際にAさんが関数モジュールの必要性に気づき、ソースコード中に関数モジュールを“記述した”タイミングを意味するものではない。
【0143】
そこで、本実施形態では、検索部34により、プログラム中で被験者が関数モジュールを記述し始めたタイミングを検索するようにしている。具体的には、タイミング解析部33によって解析されたタイミングよりも前に、被験者による関数モジュールの記述があるか否かを、複数の中間生成プログラムを用いて検索するようにしている。図27でいえば、“IsWordEnd”1021のタイミング1021aの左側にヒゲ1021bが突き出している。これは、検索部34の検索結果により、タイミング1021aよりも前のタイミングで、被験者による関数モジュールの記述があったことを示している。このように、被験者が関数モジュールを記述した直後のタイミングを知ることによって、被験者が関数モジュールの必要性に気づいた時期など、被験者の思考過程を把握することができ、ひいてはプログラミング能力診断に役立てることができる。なお、図27では、被験者が作成したプログラムは複数の関数モジュールから構成されているが、一の関数モジュールから構成される場合もある。
【0144】
図28は、プログラミング作成過程を分析するための図を表示する分析モードのうち、フローチャートを示す図である。右欄の表示内容1013のラジオボタンのクリック位置は、フローチャートの位置になっている。このフローチャートは、可視化図生成部32によって、テスト通過プログラムに基づいて、複数の関数モジュール各々の処理手順が可視化された図を示す。
【0145】
図28によれば、図27を用いて上述したように、Aさんが作成したプログラムには、“IsWordEnd”1021、“IsSmallAlpha”1022、“IsBigAlpha”1023、“IsAlNum”1024、“CountWord”1025、“main”1026の合計6個の関数モジュールが作られていることが分かる。また、最も右側の“main”1026の処理手順内には、3個のサブルーチン1026bが組み込まれていることが分かる。同様に、“IsWordEnd”1021や“CountWord”1025にも、一又は複数のサブルーチンが組み込まれている。このように、図28に示すフローチャートを確認すれば、被験者が関数モジュールをサブルーチン化している様子を一見して把握することができる。
【0146】
また、図28によれば、最も左側の“CountWord”1025の処理手順内には、入れ子状態の処理手順1025bが組み込まれていることが分かる。同様に、“IsAlNum”1024の処理手順内にも、入れ子状態の処理手順1024bが組み込まれている。ただ、入れ子状態の処理手順1025bは、入れ子状態の処理手順1024bと比べても分かるように、分岐やループを多用されており、複雑なアルゴリズムになっている。したがって、分岐やループが少なくてシンプルなアルゴリズムを実現できているか、という診断基準においては、Aさんは良い評価にならないことになる。なお、シンプルなアルゴリズムかどうかは、Aさんの処理手順だけを見ても分からないことが多い。そのため、複数の被験者の処理手順を見比べ(後述する図33等参照)、相対的な評価(どちらのアルゴリズムがシンプルか)をすることによって、より的確な能力診断を行うことができる。
【0147】
なお、本実施形態では、複数の関数モジュール各々の処理手順が可視化された図として、フローチャートを考えたが、本発明はこれに限られず、記号の近くに説明を入れたHCPチャートなど、プログラムの目的を階層構造で表現した設計図を用いることも可能である。また、可視化図生成部32は、複数の関数モジュール各々の処理手順が可視化された図ではなく、複数の関数モジュール間の構造が可視化された図を生成するようにしてもよい。例えば、クラス図など、システムの構造を記述する構造図や、DFD(データフローダイアグラム)など、関数と関数との間のデータの流れを示す図である。また、複数の関数モジュール各々の処理手順と、複数の関数モジュール間の構造との両方を可視化するような図を生成してもよい。さらに、図28では、複数の関数モジュールが示されているが、一の関数モジュールが示される場合もある。この場合、一の関数モジュールの処理手順が可視化された図や、一の関数モジュールの構造が可視化された図が生成されることになる。
【0148】
図29は、プログラミング作成過程を分析するための図を表示する分析モードのうち、コードの重複を示す図である。右欄の表示内容1013のラジオボタンのクリック位置は、コードの重複の位置になっている。コードの重複率は、複数の関数モジュール間でコードの重複度合いを示すものであり、コード重複率解析部35によって解析される。コード重複率の低いプログラムを作成した被験者は、無駄が少なく効率的なプログラム構造を構築できる力が優れていることになる。
【0149】
図29に示すコード重複率1030は、0%になっており、全く重複していない。すなわち、ソースコードを記述する際、例えばコピー&ペースト等を全く使用していないことが推測される(図34を用いて後述する例では、コード重複率が50%近くになっている)。したがって、Aさんは、無駄が少なく効率的なプログラム構造を構築できているか、という意味においては、優れたプログラマであることが分かる。また、コード重複率が低いと、仕様変更が発生した場合であっても変更箇所が少なくなるので、この意味において、Aさんのプログラムはメンテナンス性に優れているといえる。なお、コード重複率を解析する技術としては、如何なる技術を採用しても構わない。例えば、主にソースコードのコピー&ペーストを行うことにより生成される、ソースコード中の重複したコード列を検索することにより、コード重複率を解析することができる。具体的には、ソースコード(テスト通過プログラム)を、プログラミング言語の字句規則に従ってトークンに分割するとともに、型や変数、定数に属するトークンは、同一のトークンに置き換える。この置き換えによって、例えば変数名だけが異なるコード列の組を、重複したコード列として検出できるようになる。なお、図29では、複数の関数モジュール間でコードの重複度合いが示されているが、一の関数モジュール内のコードの重複度合いが示されるようにしてもよい。
【0150】
以上、図26〜図29を用いて説明したように、ユーザは、受付部24を通じて、表示内容1013のラジオボタンのクリック位置を変更するだけで、表示部25に各図を選択的に表示させることができる。したがって、プログラムの構造を構築する能力を、様々な視点から簡易かつ迅速に診断することができる。
【0151】
図30は、二人の被験者の各パラメータ推移を比較している様子を示す図である。図30において、上側は、上述したAさんのパラメータ推移1031aを示しており、下側は、新たに追加したBさん(左欄の対象データファイル1002参照)のパラメータ推移1031bを示している。このような比較表示は、右欄のグラフ個数1012において、縦2個×横1個と調整することによって実現することができる。なお、図30は、右欄のグラフ個数1012において、縦2個×横1個と調整した例であるが、縦1個×横2個と調整することによって、横に2個のグラフを並べることも可能である。
【0152】
ここで、図30では、比較を容易にするために、パラメータ設定1014の正規化1015の機能を使用している。具体的には、正規化1015のチェックボックスにおいて横軸の欄にチェックを入れている。これにより、Aさんのパラメータ推移1031aの横軸右端1031cの値が100になるとともに、Bさんのパラメータ推移1031bの横軸右端1031dの値も100になり、正規化される。なお、図31は、図30と異なり、横軸だけでなく縦軸も正規化されている例を示す。具体的には、Aさんのパラメータ推移1031aの縦軸上端1031eの値が100になるとともに、Bさんのパラメータ推移1031bの縦軸上端1031fの値が100になっている。
【0153】
このように、本実施形態に係るプログラミング能力診断装置(クライアント端末2A)は、プログラミング作成過程を分析するための図において横軸又は縦軸を正規化する機能を有している。この正規化機能によって、相対的な比較をし易くすることができる。特に、グラフ各軸の“絶対値”よりも、“グラフ形状”を見たいときに便利である。例えば、文字数の推移を見るときに、「何文字書いたか、何分で書いたか」を視覚化したいときには、正規化機能を使わないグラフの方が便利である一方、「前半と後半とで、どちらが文字数の伸びが激しいか」を視覚化したいときには、正規化機能を使ったグラフの方が便利である。
【0154】
図32は、二人の被験者の関数ライフサイクルを比較している様子を示す図である。図32の下側に示す、Bさんの関数ライフサイクルにおいて、“CheckWord”1032のタイミング1032aの左側にヒゲ1032bが突き出している。これは、上述したように、検索部34の検索結果により、タイミング1032aよりも前のタイミングで、被験者による関数モジュール“CheckWord”1032の記述があったことを示している。図32において、Aさんの関数ライフサイクル(上側)と、Bさんの関数ライフサイクル(下側)とを比較すると、プログラムに必要な関数モジュールが早いタイミングで全て揃っているAさんの方が、プログラムの構造を見通す力が高いといえる。一方、関数モジュールの個数自体が少ないBさんの方が(Aさんは6個、Bさんは3個)、アルゴリズムをシンプル化する力が高いといえる。プログラミング能力を診断する者は、図32に示す関数ライフサイクルのみで評価を決定する必要はなく、フローチャートやコードの重複などを参照しつつ、総合的な評価を下すようにすればよい。また、シンプルなアルゴリズムを構築するプログラマが欲しい場合には、Bさんを高評価にすればよいし、プログラム構造を見通す力の高いプログラマが欲しい場合には、Aさんを高評価にすればよい。
【0155】
図33及び図34は、それぞれ三人の被験者のフローチャート及びコード重複を比較している様子を示す図である。図33に示すように、三人の被験者のフローチャートを縦に並べて表示させると、アルゴリズムが相対的にどの程度シンプルであるかを一見して把握することができる。関数モジュールが3個のBさん、関数モジュールが4個のDさんと比べて、関数モジュールが9個のEさんのフローチャートは、非常に複雑である。このように複雑なフローチャートになる原因の一つとしては、ソースコードを記述する際にコピー&ペーストを多用している可能性がある。そこで、Bさん、Dさん、Eさんのコード重複を比較すると、図34に示すように、それぞれ0%、0%、48%となっている。つまり、Eさんは、半分近くをコピー&ペーストしている可能性があることが分かる。あとは、各パラメータ推移を示すグラフにおいて、総文字数の推移を確認し、急激に文字数が増加している箇所などが発見されれば、コピー&ペーストをしている可能性が高まる。
【0156】
図35は、図26と異なり、パラメータ設定1014における横軸値1016のラジオボタンのクリック位置を、操作回数から時間に代えている様子を示す図である。すなわち、図35では、図26と異なり経過時間を横軸にとっており(横軸右端の値が経過時間5259秒となっている)、時間経過に対する各パラメータ推移を一見して把握することができる。これにより、例えば操作回数1041に着目したとき、ソースコードを記述する際に何も操作をしていない時間帯(例えば区間1041a)がどれくらいあるか、といったことを把握することができる。
【0157】
図36は、被験者が何も操作していない時間帯(待ち)が所定時間発生したときに、キャラクターの表情を変える表情モード設定画面1051の一例である。図36に示す表示モード設定画面1051は、経過時間1006の右側に配置されたキャラクターボタン1006dをクリックすることによって、ポップアップウィンドウとして中央に現れる。表情モード設定画面1051によれば、0.5秒以内で連続操作されているときには、キャラクターの表情が好調の表情になり、待ち時間が10秒発生した場合には、キャラクターの表情が悩みの表情になり、待ち時間が30秒発生した場合には、キャラクターの表情が睡眠の表情になる。このように、本実施形態に係るプログラミング能力診断装置(クライアント端末2A)は、受付部24を通じた被験者の操作間隔に基づいて、表示部25に表示されるキャラクターの表情を変更する機能を有する。
【0158】
以上、図17〜図36を用いて説明したように、クライアント端末2Aで行われるプログラミング能力診断によれば、プログラミング課題に対する解決能力、特にプログラムの構造を構築する能力を簡易かつ迅速に診断することができるとともに、プログラミング課題の内容を勘違いして作成されたことによるプログラムの誤評価を防ぐことができる。
【0159】
ただし、これらは定性的な診断の側面が強いため、プログラミング能力診断を行う者によって診断結果にバラツキが生じる可能性がある。ある程度のバラツキは許容するにしても、誰が診断を行う場合も同じ結果が出るような、何らかの客観的な指標があることが好ましい。例えば、読みやすさを追求してコメントが多く書かれたソースコードが、必ずしも品質の悪いソースコードとは限らない。かといって、一課題に対し、あまりに多くの時間が掛かったのでは生産性の観点から好ましいとはいえない。そこで、以下、被験者のプログラミング能力を定量的な評価について説明する。
【0160】
[定量的なスキル評価]
本実施形態では、被験者のプログラミング能力を定量的に評価するために、生産性・品質評価アプリ174(図2参照)を用いる。すなわち、CPU11は、生産性・品質評価アプリ174を実行するとともに、解答DB180から上述したログデータやタイミングを読み出して、定量的なスキル評価を行う。
【0161】
サーバ1の解答DB180には、ソースコードの時系列の推移情報となる基本情報と、被験者が文法エラーチェックを行った時刻、発生した文法エラーの種類、発生した文法エラーの数、被験者が論理エラーチェックを行った時刻、発生した論理エラーの種類、発生した論理エラーの数等の補正情報とが記憶される。なお、図15を用いて上述したように、ビルドボタン903やテストボタン905をクリックした時刻、その結果、出力された文法エラーの種類や数などが記憶される。
【0162】
図37は、解答DB180に記憶されるデータ構成の例示図である。図37(a)は、入力情報テーブルのデータ構成の例示図である。基本情報であるソースコードの時系列の推移情報は、被験者のプログラミング作業における特定のタイミングにてソースコードが復元可能なフォーマットで記憶される。復元可能であればフォーマットは特に問わない。例えば図37(a)では、入力されたテキストデータ等を一文字ずつ入力時刻及び削除時刻とともに記憶している。入力情報テーブルを先頭から解析することにより、任意のタイミングでのソースコードを復元することができる。入力情報には、テキストデータだけではなく、改行、タブ、スペース、各種制御コード等を含めてもよい。また別の記憶方法として、一文字ずつの入力時刻と、各入力時刻における全ソースコードとを対応付けて記憶してもよい。この場合、データ容量は比較的大きくなるものの、任意のタイミングにおけるソースコードの復元アルゴリズムは単純となる。
【0163】
いずれの方法であっても、文字が入力されたタイミング毎に推移情報を記憶しているので、被験者のプログラミング作業における任意のタイミングでのソースコードを復元することができる。実際には必ずしも全てのタイミングでソースコードを復元する必要はないが、後述する複雑度の時系列推移データからの近似曲線の算出において、所定の精度を維持することが可能な程度のサンプリング数は必要となる。例えば、予め定めたキー入力の数の単位、リターンキーを操作したタイミング又は予め定めた特定の文字が入力されたタイミング等、予め定めた条件に合致した所定のタイミングにて中間生成プログラムとしてのソースコードを取得するようにしてもよい。
【0164】
図37(b)は、文法エラーテーブルのデータ構成の例示図であり、図37(c)は、論理エラーテーブルのデータ構成の例示図である。補正情報である文法エラーチェックに関する情報、論理エラーチェックに関わる情報は、例えば図37(b)、(c)に示すように、それぞれ文法エラーテーブル、論理エラーテーブルに記憶される。文法エラーの種類又は論理エラーの種類に対応付けて文法チェック実行時刻又は論理チェック実行時刻も記憶している。別途カウンタを用いて、文法エラー、論理エラーそれぞれの発生個数の累計値をカウントすることもできる。これらの各種テーブルは、解答DB180に格納することができる。なお、上述したように、文法エラーチェックの実行時刻は、ビルドボタン903又は実行ボタン904(図15)がクリックされたタイミングを認識することで記憶可能であるし、また、論理エラーチェックの実行時刻は、テストボタン905(図15)がクリックされたタイミングを認識することで記憶可能である。
【0165】
サーバ1のCPU11は、ソースコードの時系列の推移情報に基づいて、複雑度の推移を時系列に演算した複雑度推移データを算出する。ここで「複雑度」とは、単に分岐が多い、階層が多い等の構造的複雑さを示す概念のみならず、ソースコード全体として無駄な論理構造、無駄なサブルーチン等を含むか否か等の評価も含む構造化されたソースコードであるか否かを評価する指標値を意味する概念である。一般にプログラム作成開始当初は、複雑度は0(ゼロ)であり、コーディングが進むごとに上昇する。そして、プログラムの完成時期には特定の値に収束する。
【0166】
「複雑度」の概念について、以下詳述する。本実施形態では、作成されたプログラムを完全にテストするのに必要なテストケース数(テストパターン数)、及び作成されたプログラムを変更、保守等するのに要する工数と相関のある定量値を、そのプログラムの複雑度と呼んでいる。テストケース数とプログラム変更、保守等に要する工数との間にも相互に相関があるので、概念としてどちらかに代表させてもよい。説明を簡単にするため、テストケース数のみを用いる場合について説明する。
【0167】
図38は、提示されるプログラミング課題の具体例を示す例示図である。なお、ここでは上述したプログラミング課題とは内容が異なる例を示している。また、図39は、提示されたプログラミング課題に応じて被験者が作成したC言語によるプログラムの例示図である。複雑度の算出には、プログラム中に現れる様々な定量値を用いることができる。最も一般的な複雑度は、プログラム中の分岐の数である。単純な数え方としては、図39に示すプログラムには、if文が6個(13、20、21、34、36、38行目)、while文が1個(33行目)存在するので、合計7個の分岐が存在する。一般に分岐の数は、他の条件が全て同じであれば、多ければ多いほど完全なテストをするためのテストケースが多くなることから、分岐数7は複雑度を示す定量値として用いることができる。
【0168】
同じく分岐に着目する場合でも、20行目のif文のように、1つのif文の中に2つの判定条件を含む場合には、このif文は分岐を2つ含むという数え方もある。また9行目のreturn文に含まれる判定条件も暗黙の分岐と考え、4つの分岐と数える場合もある。斯かる考え方で分岐数を数えた場合、図39に示すプログラム中に存在する分岐は、9行目に4個、13行目に1個、20行目に2個、21行目に1個、22行目に1個、26行目に1個、33行目に1個、34行目に1個、36行目に2個、38行目に2個、それぞれ存在し、総分岐数は16個となる。
【0169】
また、テストケース数と相関のある定量値として、各言語仕様で定義されている様々な型の変数の数を用いてもよい。例えば図39に示すプログラムには、5個のローカル変数が宣言されている(18、19、30、31、32行目)ので、ローカル変数の数に着目すれば図39のプログラムの複雑度は5であると考えられる。これも、グローバル変数を加えてもよいし、引数も一種の変数とみなして加えてもよい。
【0170】
また、複雑度としてインタフェース数を用いてもよい。例えば図39に示すプログラムには、引数を1つ持つ関数が4個(7、11、24、28行目)、引数を2つ持つ関数が1個(16行目)含まれている。引数の数がインタフェース数であると考えた場合、このプログラムのインタフェース数として定量値6を得ることができる。インタフェース数は、どのような単位で外部とのインタフェースを考えるかにも依存する。例えばクラスにおけるパブリック関数の数、ファイル単位での外部公開関数の数等をインタフェース数としてもよい。
【0171】
同じ理由で、ネストレベルが採用される場合もある。例えば図39に示すプログラムには、33行目のwhile文の中に34行目のif文があり、さらにその中に36行目のif文がある。つまり分岐が3段階の入れ子になっており、プログラム全体での最大ネストレベルとして定量値3が得られる。さらに、単に最大ネストレベルを用いるのではなく、例えば分岐の中にある分岐は悪影響が強い等の考え方で、各定量値にネストレベルに応じた重み付け係数を乗じた値として複雑度を算出してもよい。
【0172】
他にも、例えば状態の数等の様々な定量値が採用されているが、一般にテストケース数、保守又は変更に要する工数と相関のある定量値であれば、複雑度として用いることができる。また、複雑度の計算精度を上げる目的で、複数の定量値を組み合わせてもよい。例えば、分岐数をB、変数の数をV、インタフェース数をI、ネストレベルをNとして、f(B、V、I、N)のように所定の重み付けを付して計算してもよい。計算方法は、プログラム全体で一括して計算してもよいし、関数等の単位ごとに個別に計算したものを全体として再計算してもよい。どの定量値を用い、どのように計算するかは、要求される計算精度や複雑度の算出目的に応じて決定すれば足りる。
【0173】
また、複雑度を示す定量値は、使用するプログラミング言語の仕様を考慮して決定される場合もある。例えば図39に示すプログラムはC言語で記述されているが、C++、JAVA(登録商標)等のようにクラスの概念を有する言語である場合、クラス構造の複雑度を評価する定量値を考慮してもよい。また、直接ソースコードから複雑度を算出することに限定されるものではなく、中間コード、フローチャート等の設計図から計算してもよい。
【0174】
逆に、テストケース数、保守又は変更に要する工数との相関の無いパラメータは、複雑度を示す定量値として用いることはできない。例えば、ソースコードの単純な文字数、行数等は、事後メンテナンスを容易にするために丁寧にコメントを付したソースコードであるほど複雑度が高く評価されると考えられ、少なくとも単独では複雑度を示す指標として用いることは不適当である。また図39のプログラムでは、比較的長い変数名(30、31、32行目)を使用しているが、このような長さ(トークンの長さ)はテストケース数とは全く関係なく、保守又は変更に要する工数の点でも一概に長い(短い)方が良いとは言えないので、少なくとも単独では複雑度として用いることはできない。ファンクションポイントの数、画面数等も、単独で複雑度として用いるには不適当である。一般に、単にソフトウェア規模を表すような定量値は、単独で複雑度として用いるには不適当である(ただし、複雑度を算出する場合に、本来の複雑度を表す定量値と共に計算される場合は除く)。
【0175】
さらに、特定のコーディング規約に沿っているか否かを示す定量値等は、そもそも複雑度と無関係である場合が多く、少なくとも単独では複雑度として用いることはない。ただし、コーディング規約自体に複雑度を下げる効果が認められる場合に限り、用いる場合も生じうる。
【0176】
また、サーバ1のCPU11は、複雑度の時系列の推移データに基づいて、被験者の能力評価値を算出する。能力評価値は、複雑度数値が低い状態で推移した被験者であればあるほど、また短時間に完了した被験者であればあるほど、能力が高いと評価する値とする。すなわち、より短時間によりシンプルな解を見つけた被験者ほど能力が高いと評価する値に設定する。
【0177】
能力評価値は、品質能力に関する評価値と生産性能力に関する評価値とを独立して算出
することができる。例えば、複雑度は元来品質を示す指標であり、被験者Aと被験者Bとが同程度の所要時間であり、Aの複雑度がBの複雑度よりも低く推移した場合、Aの品質能力はBの品質能力よりも高いと評価することができる。またAの複雑度とBの複雑度とは同程度で推移しているが、Aの方がBよりも短期間に完了した場合は、Aの方がBよりも生産性が高いと評価することができる。
【0178】
さらに補正情報として記憶されている、被験者が文法エラーを発生させた時刻、エラー
の種類、文法エラーの数の累計値、論理エラーを発生させた時刻、エラーの種類、論理エ
ラーの数の累計値等々を使用して、評価者は、得られた評価値に被験者が実際に発生させ
たエラーという観点からの補正を加えることもできる。
【0179】
以下、被験者にプログラミング課題を提示(出題)し、被験者のプログラミング作業から能力評価のためのデータを収集するまでの処理手順を説明する。図40は、サーバ1のCPU11のデータ収集処理の手順を示すフローチャートである。
【0180】
図40において、サーバ1のCPU11は、クライアント端末2Bの表示部25に、図11を用いて前述したように、プログラミング課題の課題名を表示させる(ステップS11)。そして、クライアント端末2Bから、プログラミング開始を示唆するスタートボタン806(図11参照)の操作信号を受信すると、タイマによる計時を開始し(ステップS12)、文字入力を受け付けたか否かを判断する(ステップS13)。なお、文字入力とは、テキストデータの入力に限定されるものではなく、削除、改行、タブ、カーソル移動、コピー&ペースト、検索操作等の編集操作に関連する制御コードの入力も含む。
【0181】
CPU11が、文字入力を受け付けていないと判断した場合(ステップS13:NO)、CPU11は、文字入力の待ち状態となる。CPU11が、文字入力を受け付けたと判断した場合(ステップS13:YES)、CPU11は、被験者のプログラミング作業の任意のタイミングでのソースコードを復元することができるフォーマットで解答DB180に記憶する(ステップS14)。なお、全ての基本情報を記憶してもよいし、評価値の算出精度を維持することができる範囲で間引いて記憶してもよい。
【0182】
CPU11は、被験者から文法エラーチェックの開始指示を受け付けたか否か(すなわち、図15に示すプログラミング画面において、ビルドボタン903がクリックされたか否か)を判断し(ステップS15)、CPU11が、開始指示を受け付けていないと判断した場合(ステップS15:NO)、CPU11は、開始指示の待ち状態となる。CPU11が、開始指示を受け付けたと判断した場合(ステップS15:YES)、CPU11は、被験者が開始指示の受け付け時点で作成していたソースコードに対して文法エラーチェックを実行し、文法エラーチェックの開始指示を受け付けた時刻を解答DB180に記憶して(ステップS16)、文法エラーが存在するか否かを判断する(ステップS17)。なお、文法エラーが存在するか否かは、コンパイラ言語である場合には、市販のコンパイラがコンパイル結果として出力する文字列に基づいて判断すればよい。また同時に実行可能モジュールを生成してもよい。さらに、解答DB180に文法エラーチェックの開始指示を受け付けた時刻を記憶することに限定されるものではなく、例えば文法エラーチェックの完了時刻であってもよい。
【0183】
CPU11が、文法エラーが存在すると判断した場合(ステップS17:YES)、CPU11は、存在する文法エラーの種類及び数を、解答DB180に追加して記憶し(ステップS18)、処理をステップS13へ戻して、上述した処理を繰り返す。なお、フローには示していないが、文法エラーが存在しない場合であっても、文法エラーが存在しない旨を示す情報は、文法エラーチェックの完了時刻に対応付けて解答DB180に記憶される。
【0184】
CPU11が、文法エラーが存在しないと判断した場合(ステップS17:NO)、CPU11は、ステップS18をスキップして、被験者から論理エラーチェックの開始指示を受け付けたか否か(すなわち、図15に示すプログラミング画面において、テストボタン905がクリックされたか否か)を判断する(ステップS19)。CPU11が、開始指示を受け付けていないと判断した場合(ステップS19:NO)、CPU11は、開始指示の待ち状態となる。CPU11が、開始指示を受け付けたと判断した場合(ステップS19:YES)、CPU11は、被験者が開始指示の受け付け時点で作成していたプログラムに対して、テストケースに従った自動単体テストを実行し、論理エラーチェックの開始指示を受け付けた時刻を解答DB180に記憶して(ステップS20)、論理エラーが存在するか否かを判断する(ステップS21)。なお、論理エラーが存在するか否かは、テストケースの入力に対して、想定されている正しい出力を得ることができたか否かに基づいて判断すればよい。
【0185】
CPU11が、論理エラーが存在しないと判断した場合(ステップS21:NO)、CPU11は、プログラムが完成したと判断して処理を終了する。CPU11が、論理エラーが存在すると判断した場合(ステップS21:YES)、CPU11は、存在する論理エラーの種類及び数を、解答DB180に追加して記憶し(ステップS22)、処理をステップS23へ戻して、上述した処理を繰り返す。なお、フローには示していないが、論理エラーが存在しない場合であっても、論理エラーが存在しない旨を示す情報は、論理エラーチェックの完了時刻に対応付けて解答DB180に記憶される。また、被験者が、ソースコード整形等を行う意思を有する場合に備えて、処理を終了するか、さらにプログラミング作業を継続するかの判断を被験者に任せてもよい。
【0186】
以上のように図40に示すフローチャートには、文法エラー及び論理エラーが除去される除去過程が含まれている。該除去過程は外部仕様の同一性を保証する上で重要である。プログラミング課題が同一であっても、それだけでは作成されたプログラムの外部仕様が同一であることは保証されない。例えば被験者Aのプログラムにはバグが残存し、被験者Bのプログラムにはバグが存在しない場合、これは外部仕様に相違があるのと等価であり、その相違は複雑度に影響する。この状態で被験者Aと被験者Bとの複雑度推移を比較しても、その差異が外部仕様の差異によるのか被験者の能力の差異によるのか判別できない。図40に示すフローチャートでは、文法エラー及び論理エラーが除去される除去過程が含まれているので、このような懸念はない。
【0187】
以上、定量的なスキル評価のためのデータ収集プロセスを説明した。なお、図40では説明の便宜上、ビルドによって文法エラーを検出し、自動単体テストによって論理エラーを検出することとしたが、ビルドによって両者を検出してもよいし、自動単体テストによって両者を検出してもよい。以下、サーバ1が収集したデータに基づいて能力評価値を算出する処理手順を説明する。図41は、CPU11の能力評価値算出の処理手順のフローチャートを示す。
【0188】
まずCPU11は、解答DB180に記憶されているソースコードの時系列の推移情報を用いて、プログラミング作業の過程におけるソースコードを順次復元しながら複雑度を時系列に算出し、複雑度の時系列推移データを作成する(ステップS31)。
【0189】
複雑度は、ソースコードを入力として算出される。簡便な算出方法として、例えばMcCabeの複雑度における判定条件(複合条件も含む)の数に1を加えた値である基本パス数を算出の基礎として用いてもよい。基本パス数が増大するほど、複雑度も増大していると考えることができる。
【0190】
より評価精度を上げる必要がある場合、上述した複雑度の算出の基礎に、変数の種類及び数、関数等の手続きの数、モジュール間インタフェースの数、ソースコードの規模(例えば語数)等のソースコードの複雑さに関連するパラメータを加え、所定の重み付けを行って演算してもよい。また算出の基礎としてMcCabe以外の指標を用いることも可能である。
【0191】
複雑度の算出に用いる指標、パラメータは、要求される評価精度に応じて決定すればよい。例えば初心者に近いプログラマと、企業において定常的に高難易度モジュールを担当している優秀なプログラマとの差異を検出するのであれば、複雑度の差が非常に大きいと考えられることから、単にMcCabe指標を適用するだけで能力の差異を検出することができる。一方、被験者Aと被験者Bとの能力の差異が非常に小さい場合(例えば2倍程度の場合)は、より多面的な指標、パラメータ等を用いて複雑度の算出精度を上げればよい。
【0192】
図42は、サーバ1によって算出された複雑度の推移データの例示図である。図42に示すように、タイマによる計時を開始してからのサンプリング経過時間ごとの複雑度91が算出されている。図42では、複雑度91の算出に、上記McCabe指標に加えてプログラムの語数も併用している。
【0193】
図41に戻って、CPU11は、被験者の姿勢による影響を除去するため、得られた複雑度推移データから能力評価に使用する有効区間を抽出する。「被験者の姿勢による影響」とは、例えば、被験者Aは充分に自動単体テスト、ソース整形等を行い、プログラミング作業を完了したのに対し、被験者Bはコーディング中に偶然論理エラーチェックが存在しないと判断され、そのままプログラミング作業を完了した、といった場合に発生する。この例では、たとえ被験者Aと被験者Bとの所要時間、最終複雑度が同じであったとしても、当然ながら評価値としては被験者Aの方が高く算出されなければならない。このような場合の評価値を正確に算出するために複雑度推移データから有効区間を抽出する。
【0194】
有効区間を抽出するために、CPU11は、得られた複雑度の推移データに対して近似曲線を作成する(ステップS32)。近似曲線の作成方法としては、例えば二次曲線による最小二乗近似を組み合わせてもよいし、あらかじめ複数の曲線パターンを解答DB180に記憶しておき、パターンマッチングにより最も近似する曲線パターンで近似してもよい。
【0195】
なお、近似曲線は、原理的には数点のサンプリング点からでも作成することができるが、精度を確保する上では数十点以上のサンプリング点が存在することが望ましい。サンプリング点を決定する方法としては、所定時間毎にサンプリング点を設ける方法、所定個数の文字入力があったタイミングをサンプリング点とする方法等、特に限定されるものではない。また、サンプリング点における代表値の決定方法としては、上述した各所定時間又は各所定個数内の複雑度の平均値を求める方法等を用いることができる。
【0196】
図43は、サーバ1によって算出された近似曲線の例示図である。図43では、所要時間を100分割し、それぞれの区間の複雑度91の平均値を代表値として近似曲線101を作成している。また近似方法としては、被験者が作成したソースコードの最終複雑度と所要時間から曲線の縦横比を決定した後に、あらかじめ解答DB180に記憶されている約2000通りの曲線とのパターンマッチングを行っている。解答DB180に記憶されている曲線パターン群は、処理を簡便にするために、複雑度が一定時間0で推移した後に単調増加に転じ、ある複雑度で収束するパターンに統一している。なお、ここではパターンマッチングを行うこととしているが、加重移動平均など他の方法を用いることとしてもよい。
【0197】
図41に戻って、近似曲線101が得られた時点で、CPU11は有効区間を抽出する(ステップS33)。図44は、サーバ1によって抽出された有効区間の例示図である。有効区間112は、処理を簡便にするために、複雑度が0から単調増加に転じた点を起点とし、単調増加が終了した点を終点としている。有効区間112は、初期設計区間111やテスト区間113を含まない純粋なプログラミング作業部分とみなすことができる。ここで、初期設計区間111やテスト区間113を全て除外するのも精度上問題があるとの考え方もあるので、初期設計区間111やテスト区間113を所定の重み付けで考慮して有効区間112を抽出してもよい。
【0198】
図45は、有効区間112を補正する必要がある場合の、サーバ1によって作成された近似曲線101の例示図である。抽出される有効区間112としては、図44では全体の一部分として抽出されている。しかし、図45に示すように有効区間112は拡大された有効区間112’として抽出するべき場合もある。
【0199】
図45に示すようなケースとしては、被験者がプログラミング中に試しに論理エラーチェックをした場合に、偶然にも論理エラーが検出されなかったケース、被験者がテストを軽視する姿勢であるケース等が想定される。斯かる場合、被験者は本来もっと所要時間がかかったものと解釈することができ、有効区間112を拡大して能力評価することが妥当である。
【0200】
図41に戻って、最後にCPU11は、抽出された有効区間112に対して所定の演算を行い、能力評価値を算出する(ステップS34)。能力評価値の簡便な算出方法としては、例えば有効区間112の近似曲線101に対して積分値を求める方法がある。すなわち、時間軸と近似曲線101で囲まれた面積を求める方法である。斯かる面積は、被験者がプログラミング作業中に取り組んだ複雑度の総量であると考えられる。面積がより小さい被験者は、プログラミング課題を、より短時間に、よりシンプルに解決したことになるので、面積が小さいほど能力が高いと評価することができる。したがって、積分値(面積)がそのまま評価値となる。
【0201】
上記積分値(面積)は、絶対値を算出するのではなく、別途基準となる評価値を設けておき、基準となる評価値との比率で算出しても良い。例えば既知の被験者Aに特定のプログラミング課題を解いてもらい、被験者Aのデータを課題情報記憶部132に記憶しておく。そして、以後の未知の被験者に同じプログラミング課題を解いてもらう場合、記憶してある「被験者Aのデータ」との比率で能力評価値を算出できる。このように既知の人物の能力との比率で算出する方法は、開発現場にとって評価値の意味合いを直感的に理解しやすいというメリットがある。
【0202】
また積分値(面積)の算出に当たって、近似曲線101を使用するのではなく、複雑度の生データを使用してもよい。例えば複雑度の推移データの区間平均値を加算する方法であってもよい。この場合、意味的には積分であっても、演算としては単なる加算となり、演算処理負荷を軽減することができる。さらに近似曲線101を用いた場合でも、曲線が充分に単純である場合は、有効区間112の時間幅と特定位置の複雑度データと所定の係数とを用いて、単なる乗算で評価値を算出してもよい。
【0203】
また別の側面からの能力評価として、上記有効区間112において、あるサンプリング点の複雑度が直前のサンプリング点の複雑度よりも小さくなった回数を計数して評価値としてもよい。複雑度は、プログラミング作業が順調に進んでいるうちは単調に増加するが、被験者が設計の誤りに気付いた場合、文法エラーや論理エラー等による修正作業が発生した場合等には、一時的に複雑度が下がる場合がある。計数した回数が多い人ほど初期の設計の見通しが甘く、試行錯誤の度合が高いと判断することができる。
【0204】
有効区間112の抽出された位置、大きさ等から被験者の傾向を示す評価値も得ることができる。例えば抽出された有効区間112が複雑度の全推移データの中で極端に前半に位置していた場合は、プログラミング課題をよく読まずに取り掛かる傾向が強いと判断することができる。仕様をよく理解せずにプログラミングを開始するのは、品質に悪影響を与えやすい開発姿勢である。
【0205】
逆に、抽出された有効区間112が複雑度の全推移データの中で極端に後半に位置していた場合は、よく動作チェックを行わずに完了したと判断することができる。そのような姿勢は、当然ながら品質に悪影響を与える。また、全体の所要時間が非常に長いにもかかわらず、抽出された有効区間112が極端に狭い場合は、仕様理解や動作チェックにあまりに時間をかけすぎた可能性があり、生産性改善の余地が大きいと判断することができる。有効区間112の位置の偏りや全体に占める比率を定量化することは容易である。
【0206】
能力評価値は、被験者の品質能力と生産性能力とに独立に算出することも可能である。これは複雑度の推移データ自体が、縦軸に品質に関連の深い複雑度をとり、横軸に生産性に関連の深い時間をとって作成されているからである。
【0207】
図46は、特徴的な4名の被験者A、B、C、Dの複雑度の推移データを示す例示図である。図46において、被験者Aは短時間に高い複雑度に到達したグラフとなっている。手は速いがコードは乱雑な傾向の被験者であり、生産性能力は高いが品質能力が低いパターンを有している。以下同様に、被験者Bは生産性能力も品質能力も低く、被験者Cは生産性能力も品質能力も高く、被験者Dは、生産性能力は低いが品質能力は高い、と解釈することができる。
【0208】
品質や生産性に関する特性は容易に定量化することができる。最も簡便な定量化方法は、曲線を包含する矩形を描き、矩形の面積と縦横比とを得る方法である。面積と縦横比とに基づいて、図46に示す4パターンのどこに位置するかを定量的に算出することができる。位置算出の結果は図31のプロット(黒丸)で示されている。矩形を求めるに当たっては、複雑度の推移データ全体を用いても良いが、有効区間112の抽出を考慮した方が評価精度は高い。
【0209】
このように、複雑度の推移データを用いることで、近似曲線の作成、有効区間の抽出等を実行することにより、被験者の能力評価値のみならず特性にまで踏み込んだ定量値を算出することができる。上述した例の他にも、複雑度に基づいて算出され、プログラミング能力を評価するに値する評価指標であれば、評価値として用いることができる。
【0210】
最後にCPU11は、解答DB180に記憶されている補正情報(被験者のエラーチェックタイミング、発生したエラーの情報等)を、一覧表又はグラフの形式にて評価者に提示する。提示するフォーマットは、その被験者が、いつエラーチェックを行い、そのときにどんなエラーが発生したのかが評価者にわかれば、どのようなフォーマットでも構わない。また提示方法は、課題出題者のクライアント端末2Aの表示部25(或いはサーバ1の表示部15)に表示してもよいし、印刷してもよいし、後に他のソフトウェアや他のコンピュータで閲覧されることを想定して所定の形式で記憶又は送信しても構わない。
【0211】
図41のフローチャートでは、能力評価値の算出にあたって補正情報(被験者のエラーチェックタイミング、発生したエラーの情報等)を使用していない。使用しない理由は、サーバ1を企業における入社試験等に利用する場合、30分〜2時間程度で完了するプログラミング課題であることが望まれるが、そのような短時間で被験者が発生させるエラーは偶発性が強く(従って再現性が低く)、能力評価値のパラメータとしては不適当なためである。
【0212】
ただし、あまりにも極端なエラー状況であった場合、例えば文法エラーチェックも論理エラーチェックも1回で通過させるような優秀な被験者、逆にあまりにも大量のエラーを出しながらプログラミングを行う被験者等がいた場合は、能力評価値に加えてエラー情報も考慮すべきである。このような理由から、補正情報は能力評価値の算出には用いないが、評価者に提示はしている。
【0213】
しかし、被験者の時間的制約が緩い場合、例えば企業における教育研修で統計的に有意な期間(例えば数日等)が許される場合はこの限りではなく、補正情報を能力評価値の算出に用いてもよい。
【0214】
なお、ここでは能力評価のため被験者にC言語プログラミングの作業をさせる場合について説明したが、C言語プログラミング作業は1つの例であり、ここでの能力評価値算出の本質ではない。作業内容としては、被験者によって作成されるテスト通過プログラム及び中間生成プログラムから複雑度を算出可能であれば、どのような作業であってもよい。
【0215】
以上説明した[定量的なスキル評価法]によれば、被験者が作成したソースコードの中間生成プログラム(ログデータ)をクライアント端末2Bから所定タイミングで取得し、そのタイミングと中間生成プログラムの複雑度に基づいて、被験者のスキルを定量的に評価できるので、被験者のプログラミングスキルを容易に客観的に評価することができる。
【0216】
具体的に説明すると、課題出題者が視認し得る図16に戻って、チャート表示ボタン637をクリックすれば、例えば図47に示す生産性・品質チャート6371の表示画面が、クライアント端末2Aの表示部25に現れる。この図47に示すチャート表示画面は、図46に示す例示図によって示される画面に相当するものであり、被験者のプログラミングにおける生産性能力や品質能力を相対的に図示している。横軸は、品質能力(図46では品質と表記)を示し、縦軸は生産性能力(図46では生産性と表記)を示している。また、図47では、図46と異なり正方向を逆転させている。すなわち、図47では、横軸の品質能力についていえば、左方向に行くほど品質能力が高くなり、縦軸の生産性能力についていえば、下方向に行くほど生産性能力が高くなる。また、図47では、被験者2(四角枠で囲まれた2で示す)、被験者3(四角枠で囲まれた3で示す)、被験者5(四角枠で囲まれた5で示す)、被験者6(四角枠で囲まれた6で示す)の能力評価を行っているが、これは、図16に示す解答確認画面において、課題出題者がNo.2、No.3、No.5、No.6を選択したからである。
【0217】
図47に示すように、被験者3の生産性、品質は、ともに2.0である。また、被験者6の生産性、品質は、ともに5.0である。これは、被験者3が被験者6と比べて生産性が2.5倍高く、品質が約2.5倍良いことを意味する(つまり、生産性・品質チャート6371の左下にいくほど能力が高いように配置される)。したがって、仮に、被験者6が既存の社員で、被験者2,3,5が採用試験の応募者である場合には、被験者3は既存のある社員(被験者6)よりも数倍能力が高いため採用する、といった適切な判断を下すことができる。このように、被験者のスキルを相対的に判断するためには、生産性・品質チャートで基準となるデータが必要になるため、図16に示す基準632の項目を設けている。そして、図47に示す生産性・品質チャート6371で、被験者6(基準となる者)を示す四角枠内に色を着けることによって、課題出題者は被験者のスキルを容易に相対判断することができる。
【0218】
また、図47では、基準となる者の位置を自由に変更することができるように、基準位置調整ボックスが表示されている。詳細には、生産性能力基準位置調整ボックス6372、このボックス内の数値を増減させるスピンボタン6373、品質能力基準位置調整ボックス6374、このボックス内の数値を増減させるスピンボタン6375が表示されている。変更ピッチは、0.1刻みである。また、基準位置のデフォルトは、(5.0,5.0)である。基準位置を変更する場合には、課題出題者は、スピンボタン6373やスピンボタン6375をクリックすればよい。
【0219】
さらに、図47では、生産性・品質チャート6371に面積一定線6377を描画するか否かを選択するためのチェックボックス6376が設けられている。生産性・品質チャート6371内に描画された面積一定線6373は、生産性能力値×品質能力値が一定になるように一本又は複数本描画される。これにより、各被験者のスキルを、基準となる被験者6と比べて、総合的に優れているか劣っているかを相対判断することができる。なお、閉じるボタン6378がクリックされると、図47に示す画面は閉じられる。
【0220】
以上、図37〜図47を用いて説明した生産性・品質チャートは、図26に示すパラメータ設定1014にチェックボックスを設け(図26では図示せず)、分析欄1011に表示させることができる。具体的には、テスト通過プログラムと中間生成プログラムをクライアント端末2Aにダウンロードする際、これを一緒にダウンロードし、記憶部27に記憶させておけばよい。
【0221】
また、本実施形態に係るプログラミング能力診断装置(クライアント端末2A)の機能として、診断レポート出力機能がある。図48は、診断レポート(1枚目)の一例であり、図49は、診断レポート(2枚目)の一例である。図48及び図49に示すレポートには、図37〜図47を用いて説明した生産性・品質チャートを縮小した縮小版生産性・品質チャート1071と、図26〜図35を用いて説明したプログラミング作成過程を分析するための各図を縮小した図(縮小版複雑度推移グラフ1072、縮小版コード重複図1073、縮小版関数ライフサイクル図1074、縮小版フローチャート1075)とが印刷されている。また、各図の近辺には、コメント欄が印刷されており、プログラミング能力診断を行う者は、コメントを記入した上でレポート出力可能となっている。
【0222】
このように、診断レポート出力機能を設けることで、被験者に対し、定性的かつ定量的な診断結果を提供することができる。なお、この診断レポート出力機能は、クライアント端末2Aの制御部20が、縮小版生産性・品質チャート1071などを記憶部27から読み出して、プリンタ等から構成される印刷部(図17では図示せず)に印刷信号を送信することによって実現することができる。この印刷部は、クライアント端末2Aに(USBなどで)外部接続されるプリンタ等であってもよい。或いは、診断レポート出力機能として、Excel(登録商標)形式でデータ出力するようにしてもよい。
【0223】
[実施形態の主な効果]
以上説明したように、本発明の第1実施形態に係るプログラミング能力診断装置(クライアント端末2A)によれば、複数の関数モジュール各々の処理手順(図28に示すフローチャートなど)又は複数の関数モジュール間の構造が可視化された図(例えばクラス図など)を視認することによって、自身がプログラミングに熟知していなくても、また、被験者が大勢いた場合であっても、プログラムの構造を構築する能力を簡易かつ迅速に診断することができる。
【0224】
また、図12のテストボタン905を用いることによって、プログラミング課題の内容を勘違いして作成されたプログラムは、プログラミング能力診断の対象から排除することができるので、プログラミング課題の内容を勘違いしてプログラムが作成されたことに起因する誤評価を防ぐことができる。
【0225】
また、タイミング解析部33の機能により、複数の関数モジュールの各々が生成されたタイミングを知ることができ、ひいてはプログラムの構造を頭の中で如何に早く構築することができるか、といった能力を診断することができる。また、検索部34の機能によれば、関数モジュールが被験者によって記述されたタイミングを把握することができる。また、コード重複率解析部35の機能により、プログラムの構造を効率的に構築できているか、といった能力を診断することができる。
【0226】
さらに、プログラミング能力診断を行う者は、受付部24を操作して、可視化図生成部32により生成された図と、タイミング解析部33の解析結果と、コード重複率解析部35の解析結果とを、表示部25において選択的に切り替えることができるので、プログラムの構造を構築する能力を様々な視点から簡易かつ迅速に診断することができる。
【符号の説明】
【0227】
1 サーバ
2A,2B クライアント端末
20 制御部
24 受付部
25 表示部
26 通信部
27 記憶部
31 再生部
32 可視化図生成部
33 タイミング解析部
34 検索部
35 コード重複率解析部

【特許請求の範囲】
【請求項1】
プログラミング課題を出題された被験者が当該プログラミング課題を解決するプログラムを作成するプログラム作成装置において、当該被験者によって当該プログラムが作成され、当該プログラミング課題を出題した出題者により設定された所望のプログラム出力が得られるか否かのテストが実行された後、一の処理モジュール又は複数の処理モジュールから構成され、当該所望のプログラム出力が得られて当該テストを通過したテスト通過プログラムと、前記被験者が当該テスト通過プログラムを作成する過程で生成された複数の中間生成プログラムを復元可能なプログラム構成情報と、を読み込んで、前記被験者のプログラミング能力を診断するプログラミング能力診断装置であって、
前記テスト通過プログラムと前記プログラム構成情報とを記憶する記憶部と、
前記プログラム構成情報により復元される前記複数の中間生成プログラムに基づいて、前記テスト通過プログラムの作成過程を再生する再生部と、
前記テスト通過プログラムに基づいて、前記一の処理モジュール若しくは前記複数の処理モジュール各々の処理手順又は前記一の処理モジュール若しくは前記複数の処理モジュール間の構造が可視化された図を生成する可視化図生成部と、
前記再生部により再生される前記テスト通過プログラムの作成過程と、前記可視化図生成部により生成された図とを表示部に表示させる制御部と、を備えることを特徴とするプログラミング能力診断装置。
【請求項2】
前記プログラム構成情報により復元される前記複数の中間生成プログラムに基づいて、前記一の処理モジュール又は前記複数の処理モジュール各々が生成されたタイミングを解析するタイミング解析部を備え、
前記制御部は、前記タイミング解析部の解析結果を前記表示部に表示させることを特徴とする請求項1記載のプログラミング能力診断装置。
【請求項3】
前記一の処理モジュール又は前記複数の処理モジュール各々について、前記タイミング解析部によって解析されたタイミングよりも前に、前記被験者による当該処理モジュールの記述があるか否かを、前記プログラム構成情報により復元される前記複数の中間生成プログラムを用いて検索する検索部を備え、
前記制御部は、前記検索部の検索結果を前記表示部に表示させることを特徴とする請求項2記載のプログラミング能力診断装置。
【請求項4】
前記一の処理モジュール内又は前記複数の処理モジュール間でコードの重複度合いを示すコード重複率を解析するコード重複率解析部を備え、
前記制御部は、前記コード重複率解析部の解析結果を前記表示部に表示させることを特徴とする請求項1から3のいずれか記載のプログラミング能力診断装置。
【請求項5】
前記表示部においてユーザの操作を受け付ける受付部を備え、
前記制御部は、前記受付部からの操作信号に基づいて、前記可視化図生成部により生成された図と、前記タイミング解析部の解析結果と、前記コード重複率解析部の解析結果とを選択的に前記表示部に表示させる請求項4記載のプログラミング能力診断装置。
【請求項6】
プログラミング課題を出題された被験者が当該プログラミング課題を解決するプログラムを作成するプログラム作成装置において、当該被験者によって当該プログラムが作成され、当該プログラミング課題を出題した出題者により設定された所望のプログラム出力が得られるか否かのテストが実行された後、一の処理モジュール又は複数の処理モジュールから構成され、当該所望のプログラム出力が得られて当該テストを通過したテスト通過プログラムと、前記被験者が当該テスト通過プログラムを作成する過程で生成された複数の中間生成プログラムを復元可能なプログラム構成情報と、を読み込んで、前記被験者のプログラミング能力を診断するプログラミング能力診断方法であって、
前記テスト通過プログラムと前記プログラム構成情報とを記憶する記憶ステップと、
前記プログラム構成情報により復元される前記複数の中間生成プログラムに基づいて、前記テスト通過プログラムの作成過程を再生する再生ステップと、
前記テスト通過プログラムに基づいて、前記一の処理モジュール若しくは前記複数の処理モジュール各々の処理手順又は前記一の処理モジュール若しくは前記複数の処理モジュール間の構造が可視化された図を生成する可視化図生成ステップと、
前記再生ステップにより再生される前記テスト通過プログラムの作成過程と、前記可視化図生成ステップにより生成された図とを表示部に表示させるステップと、を含むことを特徴とするプログラミング能力診断方法。
【請求項7】
プログラミング課題を出題された被験者が当該プログラミング課題を解決するプログラムを作成するプログラム作成装置において、当該被験者によって当該プログラムが作成され、当該プログラミング課題を出題した出題者により設定された所望のプログラム出力が得られるか否かのテストが実行された後、一の処理モジュール又は複数の処理モジュールから構成され、当該所望のプログラム出力が得られて当該テストを通過したテスト通過プログラムと、前記被験者が当該テスト通過プログラムを作成する過程で生成された複数の中間生成プログラムを復元可能なプログラム構成情報と、を読み込んで、前記被験者のプログラミング能力を診断するプログラミング能力診断装置として、コンピュータを機能させるためのコンピュータプログラムであって、
前記テスト通過プログラムと前記プログラム構成情報とを記憶する記憶部と、
前記プログラム構成情報により復元される前記複数の中間生成プログラムに基づいて、前記テスト通過プログラムの作成過程を再生する再生部と、
前記テスト通過プログラムに基づいて、前記一の処理モジュール若しくは前記複数の処理モジュール各々の処理手順又は前記一の処理モジュール若しくは前記複数の処理モジュール間の構造が可視化された図を生成する可視化図生成部と、
前記再生部により再生される前記テスト通過プログラムの作成過程と、前記可視化図生成部により生成された図とを表示部に表示させる制御部と、を備えるプログラミング能力診断装置として、コンピュータを機能させるためのコンピュータプログラム。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate

【図10】
image rotate

【図11】
image rotate

【図12】
image rotate

【図13】
image rotate

【図14】
image rotate

【図15】
image rotate

【図16】
image rotate

【図17】
image rotate

【図18】
image rotate

【図19】
image rotate

【図20】
image rotate

【図21】
image rotate

【図22】
image rotate

【図23】
image rotate

【図24】
image rotate

【図25】
image rotate

【図26】
image rotate

【図27】
image rotate

【図28】
image rotate

【図29】
image rotate

【図30】
image rotate

【図31】
image rotate

【図32】
image rotate

【図33】
image rotate

【図34】
image rotate

【図35】
image rotate

【図36】
image rotate

【図37】
image rotate

【図38】
image rotate

【図39】
image rotate

【図40】
image rotate

【図41】
image rotate

【図42】
image rotate

【図43】
image rotate

【図44】
image rotate

【図45】
image rotate

【図46】
image rotate

【図47】
image rotate

【図48】
image rotate

【図49】
image rotate


【公開番号】特開2011−8554(P2011−8554A)
【公開日】平成23年1月13日(2011.1.13)
【国際特許分類】
【出願番号】特願2009−151714(P2009−151714)
【出願日】平成21年6月26日(2009.6.26)
【出願人】(000129253)株式会社キーエンス (681)
【Fターム(参考)】