(57)【要約】【課題】  プログラミング課題に対する解決能力を簡易かつ迅速に診断することができるとともに、プログラミング課題の内容を勘違いして作成されたことによるプログラムの誤評価を防ぐ。【解決手段】  クライアント端末２Ｂにおいて、所望のプログラム出力が得られるか否かのテストが実行された後、テスト通過プログラムと、被験者がテスト通過プログラムを作成する過程で生成された複数の中間生成プログラムを復元可能なプログラム構成情報とを読み込んで、被験者のプログラミング能力を診断するプログラミング能力診断装置（クライアント端末２Ａ）であって、テスト通過プログラムの作成過程を再生するとともに、一の処理モジュール若しくは複数の処理モジュール各々の処理手順又は一の処理モジュール若しくは複数の処理モジュール間の構造が可視化された図を生成し、テスト通過プログラムの作成過程と、生成された図とを表示部２５に表示させる。【選択図】          図１７
2011008554.tif 000002
【特許請求の範囲】
【請求項１】
プログラミング課題を出題された被験者が当該プログラミング課題を解決するプログラムを作成するプログラム作成装置において、当該被験者によって当該プログラムが作成され、当該プログラミング課題を出題した出題者により設定された所望のプログラム出力が得られるか否かのテストが実行された後、一の処理モジュール又は複数の処理モジュールから構成され、当該所望のプログラム出力が得られて当該テストを通過したテスト通過プログラムと、前記被験者が当該テスト通過プログラムを作成する過程で生成された複数の中間生成プログラムを復元可能なプログラム構成情報と、を読み込んで、前記被験者のプログラミング能力を診断するプログラミング能力診断装置であって、
前記テスト通過プログラムと前記プログラム構成情報とを記憶する記憶部と、
前記プログラム構成情報により復元される前記複数の中間生成プログラムに基づいて、前記テスト通過プログラムの作成過程を再生する再生部と、
前記テスト通過プログラムに基づいて、前記一の処理モジュール若しくは前記複数の処理モジュール各々の処理手順又は前記一の処理モジュール若しくは前記複数の処理モジュール間の構造が可視化された図を生成する可視化図生成部と、
前記再生部により再生される前記テスト通過プログラムの作成過程と、前記可視化図生成部により生成された図とを表示部に表示させる制御部と、を備えることを特徴とするプログラミング能力診断装置。
【請求項２】
前記プログラム構成情報により復元される前記複数の中間生成プログラムに基づいて、前記一の処理モジュール又は前記複数の処理モジュール各々が生成されたタイミングを解析するタイミング解析部を備え、
前記制御部は、前記タイミング解析部の解析結果を前記表示部に表示させることを特徴とする請求項１記載のプログラミング能力診断装置。
【請求項３】
前記一の処理モジュール又は前記複数の処理モジュール各々について、前記タイミング解析部によって解析されたタイミングよりも前に、前記被験者による当該処理モジュールの記述があるか否かを、前記プログラム構成情報により復元される前記複数の中間生成プログラムを用いて検索する検索部を備え、
前記制御部は、前記検索部の検索結果を前記表示部に表示させることを特徴とする請求項２記載のプログラミング能力診断装置。
【請求項４】
前記一の処理モジュール内又は前記複数の処理モジュール間でコードの重複度合いを示すコード重複率を解析するコード重複率解析部を備え、
前記制御部は、前記コード重複率解析部の解析結果を前記表示部に表示させることを特徴とする請求項１から３のいずれか記載のプログラミング能力診断装置。
【請求項５】
前記表示部においてユーザの操作を受け付ける受付部を備え、
前記制御部は、前記受付部からの操作信号に基づいて、前記可視化図生成部により生成された図と、前記タイミング解析部の解析結果と、前記コード重複率解析部の解析結果とを選択的に前記表示部に表示させる請求項４記載のプログラミング能力診断装置。
【請求項６】
プログラミング課題を出題された被験者が当該プログラミング課題を解決するプログラムを作成するプログラム作成装置において、当該被験者によって当該プログラムが作成され、当該プログラミング課題を出題した出題者により設定された所望のプログラム出力が得られるか否かのテストが実行された後、一の処理モジュール又は複数の処理モジュールから構成され、当該所望のプログラム出力が得られて当該テストを通過したテスト通過プログラムと、前記被験者が当該テスト通過プログラムを作成する過程で生成された複数の中間生成プログラムを復元可能なプログラム構成情報と、を読み込んで、前記被験者のプログラミング能力を診断するプログラミング能力診断方法であって、
前記テスト通過プログラムと前記プログラム構成情報とを記憶する記憶ステップと、
前記プログラム構成情報により復元される前記複数の中間生成プログラムに基づいて、前記テスト通過プログラムの作成過程を再生する再生ステップと、
前記テスト通過プログラムに基づいて、前記一の処理モジュール若しくは前記複数の処理モジュール各々の処理手順又は前記一の処理モジュール若しくは前記複数の処理モジュール間の構造が可視化された図を生成する可視化図生成ステップと、
前記再生ステップにより再生される前記テスト通過プログラムの作成過程と、前記可視化図生成ステップにより生成された図とを表示部に表示させるステップと、を含むことを特徴とするプログラミング能力診断方法。
【請求項７】
プログラミング課題を出題された被験者が当該プログラミング課題を解決するプログラムを作成するプログラム作成装置において、当該被験者によって当該プログラムが作成され、当該プログラミング課題を出題した出題者により設定された所望のプログラム出力が得られるか否かのテストが実行された後、一の処理モジュール又は複数の処理モジュールから構成され、当該所望のプログラム出力が得られて当該テストを通過したテスト通過プログラムと、前記被験者が当該テスト通過プログラムを作成する過程で生成された複数の中間生成プログラムを復元可能なプログラム構成情報と、を読み込んで、前記被験者のプログラミング能力を診断するプログラミング能力診断装置として、コンピュータを機能させるためのコンピュータプログラムであって、
前記テスト通過プログラムと前記プログラム構成情報とを記憶する記憶部と、
前記プログラム構成情報により復元される前記複数の中間生成プログラムに基づいて、前記テスト通過プログラムの作成過程を再生する再生部と、
前記テスト通過プログラムに基づいて、前記一の処理モジュール若しくは前記複数の処理モジュール各々の処理手順又は前記一の処理モジュール若しくは前記複数の処理モジュール間の構造が可視化された図を生成する可視化図生成部と、
前記再生部により再生される前記テスト通過プログラムの作成過程と、前記可視化図生成部により生成された図とを表示部に表示させる制御部と、を備えるプログラミング能力診断装置として、コンピュータを機能させるためのコンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、被験者にプログラミング課題を出題し、被験者からそのプログラミング課題に対する解答を取得し、課題解決能力を診断するプログラミング能力診断装置及びプログラミング能力診断方法、並びにコンピュータプログラムに関する。
【背景技術】
【０００２】
ＩＴ系企業では、プログラマの考課や育成を目的として、様々なスキル診断が行われている。例えば、プログラマを採用する際、小規模なプログラミング課題を与え、プログラマが作成した解答（コーディング）の巧拙によって採用の要否を決定する場合がある。また、社員の昇進試験において、業務と関連する何らかのプログラミング課題を与え、そのプログラミング課題に対する解答の出来不出来によって、昇進の認否を決定する場合もある。これらの場合、評価者は、プログラマが作成したプログラムを見て、プログラミング能力の有無を適切に評価することが求められる。しかし、一般的にプログラミング能力を適切に評価することは容易ではない。
【０００３】
例えば、二人の被験者にプログラミング課題を出題し、作成された２つのプログラムを見比べた場合、ともに模範解答に近いプログラムであったとしても、片方の被験者は１０分でコーディングし、他方の被験者は３０分でコーディングしていたときには、当然プログラミング能力に差があり、前者の評価を高くすべきである。また、片方の被験者はプログラミングの作業過程で間違いが多く、デバッグ回数が頻繁にあったのに対し、他方の被験者はデバッグ回数がほとんどなかったときにも、当然プログラミング能力に差があり、今度は後者の評価を高くすべきである。しかし、従来の評価方法は、作成されたプログラムを見比べるだけの評価方法であることが多く、このような評価方法ではプログラミング能力を適切に評価することが難しかった。
【０００４】
そこで、プログラムが作成される過程に着目し、プログラミング過程の再生、プログラミング過程で経過した時間の計測、プログラミング過程におけるコンパイル回数のカウントなどを行う技術として、例えば特許文献１に開示されたプログラミング教育支援システムがある。具体的には、プログラミング課題の解答（コーディング）過程をリアルタイムに把握してデータベース化し、記録したデータに基づいて解答過程（プログラミング過程）を再現したり、プログラミングの経過時間を計測したり、その経過時間に対する入力文字数やコンパイルタイミングのグラフによる視覚化を行ったりすることで、各学習者（被験者）の思考過程や理解不足の箇所を把握し、ひいてはプログラミング習熟度を把握できるようになっている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００６−２２７２１８号公報（段落［０００７］等）
【発明の概要】
【発明が解決しようとする課題】
【０００６】
一般に、ある程度規模の大きなプログラムを作成する場合には、バグ修正のしやすさ、メンテナンス効率等の観点から、論理構造がシンプルかつ明確なプログラムが好ましい。例えば、個々の関数モジュールを単に先頭から順番に羅列していくプログラムよりも、main関数などの基本構造の中で個々の関数モジュールをサブルーチン化したプログラムの方が、設計思想としては好ましい。しかし、従来のプログラミング教育支援システムのように、プログラミング経過時間に対する入力文字数やコンパイルタイミングのグラフによる視覚化を行っただけでは、論理構造が簡易かつ明確かどうか、といったプログラムの構造を構築する能力を評価することは困難である。
【０００７】
この点、被験者によって作成されたプログラム全体を見れば、ある程度の論理構造を把握することはできるとも考えられる。しかし、社内の人事担当者などプログラミングに詳しくない者がプログラムの論理構造を把握することは困難である。また、たとえ評価者がプログラミングに詳しい者であったとしても、例えば数十〜数百行のプログラム全体の論理構造を把握するためにはそれなりに時間が掛かる。特に、プログラマの採用試験やプログラマの人材派遣などを考えた場合、数十人、数百人といったプログラマのプログラミング能力を評価しなければならない場合も少なくないが、その際、全員分のプログラム全体に目を通す作業は、非常に煩雑かつ時間の掛かる作業である。
【０００８】
更に、上述したプログラミング教育支援システムでは、プログラミング課題の内容を勘違いして作成されたプログラムでないかどうかまでは判別できない。例えば、行数が少なくて一見すると論理構造がシンプルに見えるプログラムが作成された場合において、被験者自身のコンパイルにより文法エラーは除かれていたとしても、それがプログラミング課題の内容を勘違いして作られたものであるときには、低評価にすべきである。しかし、上述したプログラミング教育支援システムでは、被験者がプログラミング課題の内容を正しく把握していることを前提にしているので、プログラミング課題の内容を勘違いしているにも拘わらず、シンプルな論理構造のプログラムが作成された場合、誤って高評価になる可能性は否定できない。
【０００９】
このように、従来の評価方法では、被験者のプログラミング能力、特にプログラムの構造を構築する能力を診断することは困難であった。また、被験者の人数が大勢になった場合に、プログラミングに熟知した者が相当な時間を掛けなければ、被験者全員のプログラム構造構築能力を簡易かつ迅速に診断することは困難であった。さらに、プログラミング課題の内容を勘違いして作成されたことによるプログラムの誤評価を防ぐことが困難であった。
【００１０】
本発明は、以上の点に鑑みてなされたものであり、その目的は、プログラミング課題に対する解決能力、特にプログラムの構造を構築する能力を簡易かつ迅速に診断することができるとともに、プログラミング課題の内容を勘違いして作成されたことによるプログラムの誤評価を防ぐプログラミング能力診断装置及びプログラミング能力診断方法、並びにコンピュータプログラムを提供することにある。
【課題を解決するための手段】
【００１１】
第１の発明に係るプログラミング能力診断装置は、プログラミング課題を出題された被験者がプログラミング課題を解決するプログラムを作成するプログラム作成装置において、被験者によってプログラムが作成され、プログラミング課題を出題した出題者により設定された所望のプログラム出力が得られるか否かのテストが実行された後、一の処理モジュール又は複数の処理モジュールから構成され、所望のプログラム出力が得られてテストを通過したテスト通過プログラムと、被験者がテスト通過プログラムを作成する過程で生成された複数の中間生成プログラムを復元可能なプログラム構成情報と、を読み込んで、被験者のプログラミング能力を診断するものであって、テスト通過プログラムとプログラム構成情報とを記憶する記憶部と、プログラム構成情報により復元される複数の中間生成プログラムに基づいて、上述したテスト通過プログラムの作成過程を再生する再生部と、テスト通過プログラムに基づいて、一の処理モジュール若しくは複数の処理モジュール各々の処理手順又は一の処理モジュール若しくは複数の処理モジュール間の構造が可視化された図を生成する可視化図生成部と、再生部により再生される上述したテスト通過プログラムの作成過程と、可視化図生成部により生成された図とを表示部に表示させる制御部と、を備える。
【００１２】
このような構成によれば、プログラミング能力診断の対象となるプログラムは、プログラミング課題を出題した出題者により設定された所望のプログラミング出力が得られるテスト通過プログラムになる。また、テスト通過プログラムに基づいて、一の処理モジュール若しくは複数の処理モジュール各々の処理手順又は一の処理モジュール若しくは複数の処理モジュール間の構造が可視化された図が生成される。そして、その可視化された図とテスト通過プログラムの作成過程とが表示部に表示される。したがって、プログラミング課題の内容を勘違いして作成されたプログラムは、プログラミング能力診断の対象から排除されるので、プログラミング課題の内容を勘違いして作成されたことによるプログラムの誤評価を防ぐことができる。また、プログラミング能力診断を行う者は、表示部を通じて、一の処理モジュール若しくは複数の処理モジュール各々の処理手順又は一の処理モジュール若しくは複数の処理モジュール間の構造が可視化された図を視認することによって、自身がプログラミングに熟知していなくても、プログラムの構造を構築する能力を簡易に診断することができる。また、被験者が大勢いた場合であっても、この図を視認することで、明らかにプログラミング能力の劣る被験者を排除して、残りの被験者については必要に応じて再生部により再生されるテスト通過プログラムの作成過程を視認することができるので、プログラムの構造を構築する能力を効率的かつ迅速に診断することができる。なお、本明細書でいう「処理モジュール」とは、何らかの作業工程を一つの処理としてまとめたものをいい、プログラムの一般的な構成要素となる関数モジュールだけでなく、例えば、プログラム中で意味や内容がまとまっている作業を一つの手続きとしてまとめたサブルーチン、複数の処理を一つにまとめたプロシージャ、プログラムの部分プログラムとして機能するサブプログラムなど、如何なる種類・名称のものであってもよい。また、本明細書でいう「プログラム構成情報」は、被験者がテスト通過プログラムを作成する過程で生成された複数の中間生成プログラムを復元可能な情報であれば如何なる情報であってもよい。
【００１３】
第２の発明に係るプログラミング能力診断装置では、上述したプログラム構成情報により復元される複数の中間生成プログラムに基づいて、一の処理モジュール又は複数の処理モジュール各々が生成されたタイミングを解析するタイミング解析部を備え、制御部は、タイミング解析部の解析結果を前記表示部に表示させる。
【００１４】
このような構成によれば、プログラミング能力診断を行う者は、一の処理モジュール又は複数の処理モジュール各々が生成されたタイミングを知ることで、プログラムの構造を頭の中で如何に早く構築することができるか、といった能力を診断することができる。例えば、プログラムを完成させるために必要な処理モジュールが、早いタイミングで全部揃った被験者は、プログラム構造を見通す力が優れていることが分かる。逆に、なかなか必要な処理モジュールが生成されなかった被験者は、このような力が劣っていることが分かる。
【００１５】
第３の発明に係るプログラミング能力診断装置では、一の処理モジュール又は複数の処理モジュール各々について、タイミング解析部によって解析されたタイミングよりも前に、被験者による処理モジュールの記述があるか否かを、プログラム構成情報により復元される複数の中間生成プログラムを用いて検索する検索部を備え、制御部は、検索部の検索結果を表示部に表示させる。
【００１６】
このような構成によれば、処理モジュールが被験者によって記述されたタイミングを把握することができる。すなわち、上述したタイミング解析部により、一の処理モジュール又は複数の処理モジュール各々が生成されたタイミングを解析することは可能であるが、これは、あくまでタイミング解析部により解析が成功したタイミングである。例えば、被験者が処理モジュールをソースコード中に記述した直後のタイミングは、まだ処理モジュールが完成していないため、上述したタイミング解析部による解析は成功せず、タイミング解析部のみでは知ることができない。そのため、プログラム構成情報により復元される複数の中間生成プログラムを用いて、プログラム中に被験者による処理モジュールの記述があるか否かを検索することによって、被験者が処理モジュールを記述した直後のタイミングまで知ることができ、ひいては被験者が処理モジュールの必要性に気づいた時期など、被験者の思考過程を把握することができる。
【００１７】
第４の発明に係るプログラミング能力診断装置では、一の処理モジュール内又は複数の処理モジュール間でコードの重複度合いを示すコード重複率を解析するコード重複率解析部を備え、制御部は、コード重複率解析部の解析結果を表示部に表示させる。
【００１８】
このような構成によれば、プログラミング能力診断を行う者は、プログラムの構造を効率的に構築できているか、といった能力を診断することができる。例えば、コード重複率の低いプログラムを作成した被験者は、無駄が少なく効率的なプログラム構造を構築できる力が優れていることが分かる。逆に、コード重複率の高いプログラムを作成した被験者は、このような力が劣っていることが分かる。また、コード重複率が高いプログラムは、コード重複に起因して仕様変更時に変更箇所が多くなりがちである。したがって、コード重複率の低いプログラムは、仕様変更が発生した際のメンテナンス性に優れていることになる。
【００１９】
第５の発明に係るプログラミング能力診断装置では、表示部においてユーザの操作を受け付ける受付部を備え、制御部は、受付部からの操作信号に基づいて、可視化図生成部により生成された図と、タイミング解析部の解析結果と、コード重複率解析部の解析結果とを選択的に表示部に表示させる。
【００２０】
このような構成によれば、プログラミング能力診断を行う者は、例えばマウス等からなる受付部を操作して、可視化図生成部により生成された図と、タイミング解析部の解析結果と、コード重複率解析部の解析結果とを、表示部において選択的に切り替えることができるので、プログラムの構造を構築する能力を様々な視点から簡易かつ迅速に診断することができる。
【００２１】
第６の発明に係るプログラミング能力診断方法では、プログラミング課題を出題された被験者がプログラミング課題を解決するプログラムを作成するプログラム作成装置において、被験者によってプログラムが作成され、プログラミング課題を出題した出題者により設定された所望のプログラム出力が得られるか否かのテストが実行された後、一の処理モジュール又は複数の処理モジュールから構成され、所望のプログラム出力が得られてテストを通過したテスト通過プログラムと、被験者がテスト通過プログラムを作成する過程で生成された複数の中間生成プログラムを復元可能なプログラム構成情報と、を読み込んで、被験者のプログラミング能力を診断するプログラミング能力診断方法であって、テスト通過プログラムとプログラム構成情報とを記憶する記憶ステップと、プログラム構成情報により復元される複数の中間生成プログラムに基づいて、テスト通過プログラムの作成過程を再生する再生ステップと、テスト通過プログラムに基づいて、一の処理モジュール若しくは複数の処理モジュール各々の処理手順又は一の処理モジュール若しくは複数の処理モジュール間の構造が可視化された図を生成する可視化図生成ステップと、再生ステップにより再生されるテスト通過プログラムの作成過程と、可視化図生成ステップにより生成された図とを、表示部に表示させるステップと、を含む。
【００２２】
第７の発明に係るコンピュータプログラムでは、プログラミング課題を出題された被験者がプログラミング課題を解決するプログラムを作成するプログラム作成装置において、被験者によってプログラムが作成され、プログラミング課題を出題した出題者により設定された所望のプログラム出力が得られるか否かのテストが実行された後、一の処理モジュール又は複数の処理モジュールから構成され、所望のプログラム出力が得られてテストを通過したテスト通過プログラムと、被験者がテスト通過プログラムを作成する過程で生成された複数の中間生成プログラムを復元可能なプログラム構成情報と、を読み込んで、被験者のプログラミング能力を診断するプログラミング能力診断装置として、コンピュータを機能させるためのコンピュータプログラムであって、テスト通過プログラムとプログラム構成情報とを記憶する記憶部と、プログラム構成情報により復元される複数の中間生成プログラムに基づいて、テスト通過プログラムの作成過程を再生する再生部と、テスト通過プログラムに基づいて、一の処理モジュール若しくは複数の処理モジュール各々の処理手順又は一の処理モジュール若しくは複数の処理モジュール間の構造が可視化された図を生成する可視化図生成部と、再生部により再生されるテスト通過プログラムの作成過程と、可視化図生成部により生成された図を表示部に表示させる制御部と、を備えるプログラミング能力診断装置として、コンピュータを機能させる。
【００２３】
このような構成からなるプログラミング能力診断方法及びコンピュータプログラムによれば、上述した第１の発明に係るプログラミング能力診断装置と同様に、プログラムの構造を構築する能力を簡易かつ迅速に診断することができるとともに、プログラミング課題の内容を勘違いして作成されたことによるプログラムの誤評価を防ぐことができる。
【発明の効果】
【００２４】
以上説明したように、本発明によれば、プログラミング能力診断を行う者は、一の処理モジュール若しくは複数の処理モジュール各々の処理手順又は一の処理モジュール若しくは複数の処理モジュール間の構造が可視化された図を視認することによって、自身がプログラミングに熟知していなくても、また、被験者が大勢いる場合であっても、プログラムの構造を構築する能力を簡易かつ迅速に診断することができる。また、プログラミング課題の内容を勘違いして作成されたプログラムを、プログラミング能力診断の対象から排除することができるので、プログラミング課題の内容を勘違いしてプログラムが作成されたことに起因する誤評価を防ぐことができる。
【図面の簡単な説明】
【００２５】
【図１】本発明の実施形態に係るプログラミング能力診断装置（クライアント端末）が用いられるシステムのシステム構成を示す概念図である。
【図２】図１に示すサーバのハードウェア構成例を示すブロック図である。
【図３】クライアント端末のハードウェア構成例を示すブロック図である。
【図４】プログラミング課題に対する被験者の解答データをサーバからクライアント端末にダウンロードするまでのプロセスを示すフローチャートである。
【図５】トップメニュー画面の一例である。
【図６】課題登録画面の一例である。
【図７】登録設定ダイアログ画面の一例である。
【図８】課題ＵＲＬ発行画面の一例である。
【図９】発行設定ダイアログ画面の一例である。
【図１０】課題出題者が操作するクライアント端末の表示部に表示される発行画面の一例である。
【図１１】発行画面の一例である。
【図１２】課題表示／編集エリアにまだ何も入力されていない様子を示している。
【図１３】課題出題者が被験者に受けさせたい課題の内容（課題文）が表示されている様子を示す図である。
【図１４】警告表示がなされている様子を示す図である。
【図１５】エラー表示がなされている様子を示す図である。
【図１６】課題出題者が被験者の解答を確認するための解答確認画面の一例である。
【図１７】再生観察アプリがインストールされた後のクライアント端末のソフトウェア的な機能を示す機能ブロック図である。
【図１８】クライアント端末において再生観察アプリを起動したときに、表示部に表示される起動画面を示す図である。
【図１９】分析対象となるデータファイルが１個追加された様子を示す図である。
【図２０】テスト通過プログラムの作成過程が再生されている様子を示す図である。
【図２１】被験者によってビルドが１回行われている様子を示す図である。
【図２２】再生欄に、プログラミング課題が表示されている様子を示す図である。
【図２３】図２１と比べて更に多くの時間が経過したときの様子を示す図である。
【図２４】最後に生成された中間生成プログラムが表示されている様子を示す図である。
【図２５】実時間ベースでの再生について説明するための図である。
【図２６】プログラミング作成過程を分析するための図を表示する分析モードのうち、各パラメータ推移の様子を示す図である。
【図２７】プログラミング作成過程を分析するための図を表示する分析モードのうち、関数ライフサイクルを示す図である。
【図２８】プログラミング作成過程を分析するための図を表示する分析モードのうち、フローチャートを示す図である。
【図２９】プログラミング作成過程を分析するための図を表示する分析モードのうち、フローチャートを示す図である。
【図３０】二人の被験者の各パラメータ推移を比較している様子を示す図である。
【図３１】横軸だけでなく、縦軸も正規化されている様子を示す図である。
【図３２】それぞれ二人の被験者の関数ライフサイクルを比較している様子を示す図である。
【図３３】それぞれ三人の被験者のフローチャートを比較している様子を示す図である。
【図３４】それぞれ三人の被験者のコード重複を比較している様子を示す図である。
【図３５】図２６と異なり、パラメータ設定における横軸値のラジオボタンのクリック位置を、操作回数から時間に代えている様子を示す図である。
【図３６】被験者が何も操作していない時間帯（待ち）が所定時間発生したときに、キャラクターの表情を変える表情モード設定画面の一例である。
【図３７】解答ＤＢに記憶されるデータ構成の例示図である。
【図３８】提示されるプログラミング課題の具体例を示す例示図である。
【図３９】提示されたプログラミング課題に応じて被験者が作成したＣ言語によるプログラムの例示図である。
【図４０】サーバのＣＰＵのデータ収集処理の手順を示すフローチャートである。
【図４１】ＣＰＵの能力評価値算出の処理手順のフローチャートを示す。
【図４２】サーバによって算出された複雑度の推移データの例示図である。
【図４３】サーバによって算出された近似曲線の例示図である。
【図４４】サーバによって抽出された有効区間の例示図である。
【図４５】有効区間を補正する必要がある場合の、サーバによって作成された近似曲線の例示図である。
【図４６】特徴的な４名の被験者Ａ、Ｂ、Ｃ、Ｄの複雑度の推移データを示す例示図である。
【図４７】図４６と異なり正方向を逆転させている様子を示す図である。
【図４８】診断レポート（１枚目）の一例を示す図である。
【図４９】診断レポート（２枚目）の一例を示す図である。
【発明を実施するための形態】
【００２６】
以下、本発明の実施の形態に係るプログラミング能力診断装置について、図面を参照しながら具体的に説明する。まずは、プログラミング能力診断装置が用いられるシステムの概要について説明する。
【００２７】
［システム概要］
図１は、本発明の実施形態に係るプログラミング能力診断装置（図１ではクライアント端末２Ａ）が用いられるシステムのシステム構成を示す概念図である。このシステムの利用形態について、具体例に説明する。
【００２８】
第１の利用形態は、プログラミング能力診断装置としてのクライアント端末２Ａと、サーバ１とを、システム運用企業が保有している利用形態である。システム運用企業としては、例えば人材派遣業を事業として行っている企業などが考えられる。サーバ１は、システム運用企業によって所定のデータセンター内に設置され、インターネット等の通信ネットワーク１００を介して、システム運用企業内のクライアント端末２Ａと接続される。また、サーバ１は、システム運用企業に登録（例えば人材派遣登録）している複数のプログラマが保有するクライアント端末２Ｂ（例えば家庭のＰＣなど）にも接続される。
【００２９】
システム運用企業に在籍する人材評価担当者は、クライアント端末２Ａを操作してサーバ１にアクセスし、被験者となるプログラマ（例えば人材派遣登録しているプログラマ）に受けさせたいプログラミング課題を登録し、そのプログラミング課題に対する解答を入力可能なリンク先のＵＲＬを取得する。そして、そのＵＲＬを、被験者に電子メールや電話などで別途連絡する。ＵＲＬは、サーバ１内に存在するプログラミング課題（ファイル）の場所を指し示すものである。被験者は、自分の都合のよいとき、或いは予め決められた期限内に、自己のクライアント端末２Ｂを操作して、ＵＲＬが示すリンク先（ウェブページ）にアクセスし、プログラミング課題に対する解答を入力する。入力された解答はサーバ１に送られ、サーバ１内の所定の記憶領域に記憶される。その後、人材評価担当者は、クライアント端末２Ａを操作してサーバ１にアクセスし、被験者によって入力された解答の内容を確認し、その内容をクライアント端末２Ａにダウンロードし、被験者のプログラミング能力を診断する。プログラミング能力の診断内容の詳細については、［プログラミング能力診断］にて後述する。
【００３０】
第２の利用形態は、サーバ１のみを、システム運用企業が保有している利用形態である。プログラミング能力診断装置としてのクライアント端末２Ａ、被験者が操作するクライアント端末２Ｂは、システム運用企業とシステム利用契約を締結したシステム利用企業が保有している。システム運用企業としては、プログラミング能力診断サービスを提供するＳａａＳ（Software as a Service）企業、システム利用企業としては、プログラマを数多く抱えるソフトウェア会社などである。企業ではないが、プログラミング授業が数多くある情報系大学なども、システム利用者になり得る。
【００３１】
システム運用企業に在籍するＳａａＳ担当者は、サーバ１を所定のデータセンター内に設置し、システム利用企業のシステム利用契約を締結する。システム利用企業に在籍する人事担当者は、被験者となるプログラマ（例えば採用を検討しているプログラマ）に受けさせたいプログラミング課題を登録する。あとは、第１の利用形態と同様である。すなわち、被験者となるプログラマにＵＲＬが連絡され、被験者はクライアント端末２Ｂを操作して、ＵＲＬが示すサーバ１内のリンク先にアクセスし、プログラミング課題に対する解答を入力する。その後、人事担当者は、クライアント端末２Ａを操作してサーバ１にアクセスし、被験者によって入力された解答の内容を確認し、その内容をクライアント端末２Ａにダウンロードし、被験者のプログラミング能力を診断する。
【００３２】
このように、本実施形態では、上述した第１の利用形態においても第２の利用形態においても、被験者によって入力されたプログラミング課題に対する解答の内容を、通信ネットワーク１００を介してサーバ１からクライアント端末２Ａにダウンロードするようにしている。これにより、クライアント端末２Ａ上で、被験者の解答内容を簡易かつ迅速に取得することができ、被験者のプログラミング能力を簡易かつ迅速に診断することができる。特に、被験者の人数が大勢になった場合には、より簡易に、かつ、より迅速に診断することができる。
【００３３】
なお、プログラミング能力診断装置としてのクライアント端末２Ａは、必ずしも図１に示すシステムに組み込まれる必要はない。プログラミング課題に対する被験者の各種解答データを、ＵＳＢやＤＶＤなどの記録媒体でクライアント端末２Ａに移動させることによって、クライアント端末２Ａ上でのプログラミング能力診断は可能になる。
【００３４】
以下では、クライアント端末２Ａにおいて被験者のプログラミング能力診断を行うにあたって、図１に示すシステムを利用する。そして、まず、プログラミング課題に対する被験者の解答データを、通信ネットワーク１００を介してサーバ１からクライアント端末２Ａにダウンロードするまでのプロセスについて、詳細に説明する（［解答データの取得］参照）。その後、ダウンロードして取得した解答データを用いて、クライアント端末２Ａ上で行われるプログラミング能力診断について、詳細に説明する（後述する［プログラミング能力診断］参照）。
【００３５】
［解答データの取得］
図２は、図１に示すサーバ１のハードウェア構成例を示すブロック図である。なお、図１に示すシステムでは、サーバ１は１台としているが、複数台に分散させてもよい。また、マルチテナント（例えば上述した第２の利用形態において複数の企業がシステム利用企業になること）を考えた場合には、更に多くのクライアント端末２Ａ、２Ｂがサーバ１に接続されることになる。
【００３６】
図２に示すように、サーバ１は、各種プログラムに基づき数値計算や情報処理を行うとともに、ハードウェア各部の制御を行うＣＰＵ（Central Processing Unit）１１と、起動プログラムや初期化プログラム等が格納されたＲＯＭ（Read Only Memory）１２と、ＣＰＵ１１が各種プログラムを実行する際のワークエリアとして機能するＲＡＭ（Random Access Memory）１３と、外部の通信ネットワーク１００と通信可能に接続される通信部１６と、補助記憶手段として機能するＨＤＤ（Hard Disk Drive）１７と、を有しており、これらの間の通信は、データバスやアドレスバスなどのバスを介して行われる。
【００３７】
サーバ１のＨＤＤ１７には、各種アプリケーションを実行するとともに、サーバ１全体を統合的に管理するＯＳ（Operating System）がインストールされている（図示せず）。また、ＯＳ上で実行されるアプリケーション（アプリ）として、被験者に出題する課題を選択して設定するとともに、被験者の解答を確認するための課題設定・解答確認アプリ１７２と、被験者のスキルを定量的に評価する生産性・品質評価アプリ１７４と、クライアント端末２Ａ，２Ｂのウェブブラウザアプリ２７２からの要求に応じて、ＨＴＭＬ（Hyper Text Markup Language）文書やＸＭＬ（Extensible Markup Language）文書、画像などの情報をクライアント端末２Ａ，２Ｂに送信するウェブアプリ１７５がインストールされている。ウェブアプリ１７５のインストールによって、サーバ１はウェブサーバとして機能し得る。各アプリケーションは、アプリケーションプログラムがＨＤＤ１７からＲＡＭ１３にロード（展開）され、各アプリケーションプログラムに基づきＣＰＵ１１によって実行される。
【００３８】
このように、サーバ１は、ユーザによるクライアント端末２Ａ，２Ｂの受付部２４の操作によって、サーバ１から送信された画像などの情報を表示部２５に表示させるユーザインタフェースを提供するために、ＯＳやウェブアプリ１７５などを有する。
【００３９】
さらに、サーバ１のＨＤＤ１７は、被験者に出題する課題を登録する課題データベース（ＤＢと略す。以下同様）１７６と、システム利用権限を有する課題出題者を登録するための出題者ＤＢ１７８と、クライアント端末２Ａ，２Ｂに送信するＨＴＭＬ文書や画像などが格納される発行ＤＢ１７９と、被験者から取得した解答を格納する解答ＤＢ１８０と、を有している。
【００４０】
より具体的に説明すると、課題ＤＢ１７６は、過去の課題（ソフトウェア資産）を容易に再利用することができるようにするために、課題出題者によって作成されたプログラミング課題の課題名や課題内容を登録（記憶）しておくＤＢである。出題者ＤＢ１７８は、課題出題者としてシステムの利用する権限があるか否かを確認するために、課題出題者のログインＩＤやパスワードを登録しておくＤＢである。発行ＤＢ１７９は、被験者がプログラミング課題に対する解答を入力するための画面を被験者のクライアント端末２Ｂに表示させるＨＴＭＬ文書や画像などを格納しておくＤＢである。それらのＨＴＭＬ文書や画像などは、後述するクライアント端末２Ｂのウェブブラウザアプリ２７２（図３）からの要求に応じて、被験者のクライアント端末２Ｂに送信される。解答ＤＢ１８０は、被験者から取得した解答、すなわち（例えば被験者がソースコードを１文字入力するごとに）クライアント端末２Ｂから送られてきたログデータ（被験者が作成したソースコード）を格納（記憶）しておくＤＢである。詳細は後述するが、そのログデータをサーバ１が受信したタイミングも解答ＤＢ１８０に格納される。
【００４１】
なお、サーバ１のＨＤＤ１７は、フラッシュメモリやＵＳＢ（Universal Serial Bus）メモリ（及びメモリコントローラ）、光ディスクドライブ等で代替することもできる。また、各アプリケーションプログラムは、予めＨＤＤ１７に格納することもできるし、ＣＤやＤＶＤ等の記録媒体からＨＤＤ１７に格納することもできるし、通信ネットワーク１００を介して外部のコンピュータからダウンロードされ、ＨＤＤ１７に格納することもできる。さらに、説明の便宜上、上述したアプリは別々に一のＨＤＤ１７に格納されていることとするが、複数のＨＤＤ１７に分散して格納することもできるし、また、複数のアプリが統合されたものが一のＨＤＤ１７に格納することもできる。
【００４２】
図３は、クライアント端末２のハードウェア構成例を示すブロック図である。なお、課題出題者が操作するクライアント端末２Ａのハードウェア構成と、被験者が操作するクライアント端末２Ｂのハードウェア構成とは同様であるので、特に区別することなく、クライアント端末２のハードウェア構成として説明する。なお、プログラミング能力診断装置として機能するクライアント端末２Ａの詳細については、図１７に示す機能ブロック図を用いて別途後述する。
【００４３】
図３に示すように、クライアント端末２は、ＣＰＵ２１と、ＲＯＭ２２と、ＲＡＭ２３と、マウスやキーボード等によりユーザの操作を受け付ける受付部２４と、モニタ等の表示部２５と、ネットワークカード等の通信部２６とがバスを介して接続されている。これら各部が提供する機能は、基本的にサーバ１の対応する各部と同様である。また、クライアント端末２はＨＤＤ２７を有しており、このＨＤＤ２７には、受付部２４及び表示部２５による入出力機能や、各種アプリケーションを実行するための機能、および、表示部２５においてＧＵＩを利用するための機能などを提供するとともに、クライアント端末２全体を統合的に管理するＯＳがインストールされている（図示せず）。
【００４４】
また、ＯＳ上で実行されるアプリケーション（アプリ）として、電子メールの送受信を行う電子メールアプリ２７１と、課題出題者が出題したプログラミング課題をウェブ上で閲覧するためのウェブブラウザアプリ２７２とがインストールされている。ウェブブラウザアプリ２７２のインストールによって、クライアント端末２はウェブクライアントとして機能し得る。これらの各アプリケーションは、アプリケーションプログラムがＨＤＤ２７からＲＡＭ２３にロード（展開）され、各アプリケーションプログラムに基づきＣＰＵ２１によって実行される。なお、サーバ１のＨＤＤ１７と同様に、クライアント端末２のＨＤＤ２７も、フラッシュメモリやＵＳＢメモリ（及びメモリコントローラ）、光ディスクドライブ等で代替することが可能である。
【００４５】
図４は、図１に示すシステムを用いて、プログラミング課題に対する被験者の解答データを、通信ネットワーク１００を介してサーバ１からクライアント端末２Ａにダウンロードするまでのプロセスを示すフローチャートである。各プロセスの概要について説明すると、プログラミング課題を出題する出題者が、プログラミング課題をサーバ１に登録するために、サーバ１にログインするステップＳ１、その出題者が、被験者に受けさせたいプログラミング課題を作成し、サーバ１に登録するステップＳ２、その出題者が、被験者に受けさせたいプログラミング課題（ステップＳ２で登録したものでもよいし、過去に自分が登録したものでもよいし、他の出題者が過去に登録したものでもよい）を選択するステップＳ３、選択されたプログラミング課題に対する解答を入力するためのウェブサイトを示すＵＲＬを設定（発行）するステップＳ４、そのＵＲＬを電子メール等で知らされた被験者が、ＵＲＬが示すウェブサイトにアクセスするステップＳ５、被験者のプログラミング課題に対する解答の入力を受け付けるステップＳ６、プログラミング課題を出題した出題者が、被験者の解答を確認するステップＳ７、そして、プログラミング能力を診断し、スキル評価を行うステップＳ８、という流れからなる。
【００４６】
図４に示すように、まず、課題出題者のログインが行われる（ステップＳ１）。具体的には、課題出題者が、自己のクライアント端末２Ａのウェブブラウザを立ち上げ、通信ネットワーク１００を介してサーバ１に（所定のリンク先に）アクセスする。そして、クライアント端末２Ａが、表示部２５にログイン画面を表示させるためのＨＴＭＬ文書等の送信をサーバ１に要求すると、ＣＰＵ１１によって、これらのＨＴＭＬ文書等がクライアント端末２Ａに送信される。
【００４７】
課題出題者は、クライアント端末２Ａの受付部２４（マウスやキーボード等）の操作により、自己のログインＩＤとパスワードを入力する。そして、ログインＩＤとパスワードがサーバ１に送られ、それらの照合が行われた後、課題出題者のログインが完了する。ログインＩＤやパスワードの照合は、上述したように、ＣＰＵ１１がＨＤＤ１７内の出題者ＤＢ１７８にアクセスすることによって行う。これにより、課題出題者にスキル診断システムの利用権限があることが確認される。なお、照合に失敗した場合には、ログインを拒否される。
【００４８】
課題出題者のログインが完了すると、プログラミングスキル診断システムのトップメニューが表示される。具体的には、サーバ１のＣＰＵ１１は、クライアント端末２Ａの受付部２４からの操作信号を受信して、課題出題者のログインを認識すると、クライアント端末２Ａの表示部２５にトップメニュー画面を表示させる。
【００４９】
図５は、トップメニュー画面の一例である。図５に示すトップメニュー画面には、新規課題の登録や課題内容の編集を行うための課題登録ボタン６１と、プログラミング課題を出題するためのＵＲＬを設定して発行するための課題ＵＲＬ発行ボタン６２と、被験者の解答を確認するための解答確認ボタン６３とが、上からこの順で配置されている。このように、トップメニュー画面の一画面上に、課題登録、ＵＲＬ発行、課題確認を行うためのボタンが配置されることで、課題出題者は、被験者に受けさせたいプログラミング課題を作成し、サーバ１に登録すること（図４のステップＳ２）、被験者に受けさせたいプログラミング課題を選択するとともに（図４のステップＳ３）、選択されたプログラミング課題に対する解答を入力するためのウェブサイトを示すＵＲＬを設定（発行）すること（図４のステップＳ４）、被験者の解答を確認すること（図４のステップＳ７）、という一連の作業を、容易かつ迅速に行うことができる。
【００５０】
解答確認ボタン６３の右方には、新着解答の件数を示す解答新着件数表示欄６４が配置されている。これにより、課題出題者は、トップメニュー画面を視認すると同時に、被験者からの解答がサーバ１に届いているかどうかを確認することができる。
【００５１】
次に、課題出題者は、図５に示すトップメニュー画面から課題の登録を行う（図４のステップＳ２）。具体的には、課題出題者によってトップメニュー画面の課題登録ボタン６１がクリックされると、クライアント端末２Ａの表示部２５に課題登録画面が表示される。
【００５２】
図６は、課題登録画面の一例である。図６に示す課題登録画面の上方には、既に課題出題者によって登録された課題の一覧が表示される。これにより、課題出題者は、被験者に受けさせることが可能な課題を一目で容易に確認することができる。なお、課題一覧中の「登録者」は、課題名で示されたプログラミング課題を過去に作成した者、すなわちサーバ１に課題名で示されたプログラミング課題を過去に登録した者である。また、「難易度」は、登録者によるコメントである。難易度が高いか低いかについては、登録者の私見により、一コメントとして表示される。また、課題出題者によって登録された課題が未だ存在しない場合には、空欄表示になる。
【００５３】
図６に示す課題登録画面において、課題一覧表の下方には、新しい課題を登録するための新規登録ボタン６１７と、選択されている課題を編集目的で開くための開くボタン６１８とが配置され、これらのボタンの更に下方に、トップメニュー画面にリンクが張られた文字「ＴＯＰ」６１９が表示されている。
【００５４】
課題の登録手順としては、上述した新規登録ボタン６１７をクリックして新しく課題を登録するか、上述した開くボタン６１８をクリックして過去の課題を編集するか、の２種類がある。いずれの登録手順でも、登録設定ダイアログ画面が表示され、登録条件の設定に移る。
【００５５】
図７は、登録設定ダイアログ画面の一例である。図７に示す登録設定ダイアログ画面は、開くボタン６１８をクリックしてダイアログ画面が表示された直後のイメージであり、新規登録ボタン６１７をクリックした場合には、ダイアログ画面は全て未設定状態（空欄表示）になる。このように、開くボタン６１８を新規登録ボタン６１７の下に並べて配置しておき、開くボタン６１８のクリックにより、過去の課題が自動的に読み込まれた登録設定ダイアログ画面が表示されるようにすることで、課題出題者は、過去の課題（過去の資産）を容易に再利用することができる。
【００５６】
例えば、課題「英単語カウント」の派生課題を作りたい場合には、図６に示す課題一覧表において「英単語カウント」にカーソルをあわせ、開くボタン６１８のクリックによりこれを開く。そして、図７に示す登録設定ダイアログ画面上で内容をアレンジし、課題名テキストボックス６１８１上で別の課題名（「英単語カウント２」など）を入力し、登録ボタン６１８９をクリックすればよい。これにより、課題出題者は、過去の課題の派生課題を容易に作ることができる。
【００５７】
図７に示す登録設定ダイアログ画面の上方には、課題名を新規入力できる課題名テキストボックス６１８１、ＣかＪＡＶＡ（登録商標）などの言語を選択できる言語リストボックス（プルダウンメニュー）６１８２が設けられている。課題名テキストボックス６１８１を設けておけば、上述したように、容易に派生課題を作ることができる。また、言語リストボックス６１８２を設けておけば、課題出題者がＣ言語かＪＡＶＡ（登録商標）言語かを自由に選択することができるとともに、将来的に、課題サポート言語（Ｒｕｂｙなど）が増えた場合に容易に追加することができる。
【００５８】
言語リストボックス６１８２の下方には、プログラミング課題の内容を直接入力するための課題内容登録エリア６１８３が配置されている。文章のみの課題の場合には、テキスト形式で課題を作成することができるし、課題に図を入れたい場合には、ＰＤＦ形式或いはＪＰＥＧ形式で課題を作成することができる。本実施形態では、課題内容登録エリア６１８３の初期状態はテキストボックスとしている。したがって、課題出題者が課題文を登録するときには、この課題内容登録エリア６１８３に直接課題文を書いてもよいし、別の文書からコピー＆ペーストしてもよい。
【００５９】
課題内容登録エリア６１８３の下方には、自動単体テストのためのテストコードを直接入力し、登録するためのテストコード登録エリア６１８５が配置されている。自動単体テストとは、被験者が作成したプログラムについて、プログラミング課題を出題した出題者により設定された所望のプログラム出力が得られるか否かのテストのことであり、サーバ１を通じて被験者のクライアント端末２Ｂにおいて実行される。本来は、この自動単体テストは被験者がクライアント端末２Ｂにおいて実行するものであるが、図７に示す登録設定ダイアログ画面の最下方にテストボタン６１８７を設けることによって、課題出題者は、課題内容を登録する段階において、プログラミング課題に対する解答を自分で試作してみるとともに、試作したプログラムについて自動単体テストを実行してみることができる。自動単体テストを実行するためのテストボタン６１８７の詳細については、後述する。なお、内容のクリアボタン６１８６をクリックすれば、テストコード登録エリア６１８５に入力した内容が消去される。
【００６０】
図７において、登録設定ダイアログ画面の下方に配置された登録ボタン６１８９は、課題内容登録エリア６１８３やテストコード登録エリア６１８５に入力した設定内容に従って、プログラミング課題を登録するためのボタンであり、キャンセルボタン６１８８は、課題内容登録エリア６１８３やテストコード登録エリア６１８５に入力した設定内容を破棄してダイアログを閉じるボタンである。前者の登録ボタン６１８９について具体的に説明すると、ＣＰＵ１１は、課題内容登録エリア６１８３やテストコード登録エリア６１８５に入力された設定内容を、ＨＤＤ１７の課題ＤＢ１７６に登録する。
【００６１】
次に、課題出題者は、図５に示すトップメニュー画面に戻って、課題の選択を行う（図４のステップＳ３）。具体的には、課題出題者によってトップメニュー画面の課題ＵＲＬ発行ボタン６２がクリックされると、クライアント端末２Ａの表示部２５に課題ＵＲＬ発行画面が表示される。
【００６２】
図８は、課題ＵＲＬ発行画面の一例である。図８に示す課題ＵＲＬ発行画面の上方には、既に課題出題者によって登録されている課題の一覧が表示される。課題一覧は、図６に示す課題一覧と同じものである。したがって、課題一覧は、図６と図８で２箇所表示されることになり、両方の画面で課題出題者が記入したコメント（「難易度」など）は互いに反映させる必要がある。
【００６３】
また、課題一覧の下方には、発行履歴一覧が表示されており、その表示項目は、左欄より、発行日６２１、課題名６２２、有効期限６２３、発行者６２４、目的６２５の順で並んでいる。発行日６２１、課題名６２２、有効期限６２３の項目は、システムによって自動的に表示される項目であり、発行者６２４、目的６２５の項目は、課題出題者が任意に記入するコメントである。特に、有効期限６２３について詳述すると、課題出題者が発行したＵＲＬ（で示されたリンク先）の有効期限が過ぎたか否か（そのＵＲＬを用いて被験者が受験可能か否か）を示しており、有効期限が過ぎていない場合には、黒丸印がついている。仮に、黒丸印がついている課題を出題した場合には、今回の被験者だけでなく、既にその課題を出題されている被験者からも解答が送られてくる可能性があり、管理が煩雑になる（黒丸印がついていない課題については、解答画面へのアクセス有効期限が過ぎているために、今回の被験者以外の者から解答が送られてくることはない）。したがって、有効期限６２３の項目を設けることによって、課題発行管理の利便性を高めることができる。なお、ＵＲＬ（で示されたリンク先）の有効期限の詳細については、図９を用いて後述する。また、本明細書では、インターネット等の通信ネットワーク１００上で、ＨＴＭＬファイルや画像等のデータが保存される場所を示す識別子として、ＵＲＬを用いているが、これはＵＲＩ（Uniform Resource Identifier）と称することもできる。
【００６４】
図８に示す課題ＵＲＬ発行画面から、課題ＵＲＬを発行する手順としては２つある。１つは、登録されているプログラミング課題を選択して、新規発行ボタン６２７をクリックする方法であり、もう１つは、過去の発行履歴を選択して、修正／再発行ボタン６２９をクリックする方法である。これらのいずれの手順でも、後述する発行設定ダイアログ画面（図９参照）が表示部２５に表示される。発行設定ダイアログが開いたときの各設定項目は、新規発行ボタン６２７がクリックされたときには、課題名のみがセットされて他は全て未設定状態で表示（空欄表示）される一方、修正／再発行ボタン６２９がクリックされたときには、過去に発行したときの条件がセットされた状態で表示される。これにより、過去に発行したＵＲＬを再利用する場合には、課題出題者が条件を再度入力する手間を省くことができる。
【００６５】
図９は、発行設定ダイアログ画面の一例である。図９に示す発行設定ダイアログ画面の一番上には、現在登録されている課題を課題名ごとに選択できるリストボックス７０１が表示される。これにより、過去の発行履歴と全く同じ設定にしつつ、被験者に出題する課題だけを変更してＵＲＬを発行するような場合に、ＵＲＬ有効期限などを何度も設定する手間を省くことができる。
【００６６】
リストボックス７０１の下には、発行するＵＲＬ（で示されたリンク先）の有効期限を設定するために、テキストボックス等から構成されるＵＲＬ有効期限入力欄７０２が表示される。ＵＲＬ有効期限入力欄７０２では、日時を指定する、発行からの期間を指定する、或いは、最終アクセスからの期間を指定する、という３種類の条件でＵＲＬ（で示されたリンク先）の有効期限を設定することができる。これにより、仮にＵＲＬが漏洩した場合であっても、有効期限経過後のシステムの無断利用を防ぐことができる。また、ＵＲＬ（で示されたリンク先）の有効期限を設定することができれば、図８を用いて前述したように、有効期限が過ぎているリンク先のＵＲＬを一目で把握することができるので、課題発行管理の利便性を高めることができる。
【００６７】
ＵＲＬ有効期限入力欄７０２の下には、課題解答時に被験者にパスワード入力を要求するかどうかを設定するパスワード入力欄７０３が表示され、パスワード入力欄７０３の下には、時間制限入力欄７０４が表示されている。なお、パスワードの入力回数のカウントや、解答時間の計測は、ＣＰＵ１１の内蔵タイマや外付けタイマ等を用いることによって実現することができる。
【００６８】
時間制限入力欄７０４の下には、発行タイトル入力欄７０５とメッセージ入力エリア７０６、及び解答入力フィールド設定欄７０７が表示されている。これらは、被験者が操作するクライアント端末２Ｂの表示部２５に表示させる画面をカスタマイズする設定欄・設定エリアである。特に、解答入力フィールド設定欄７０７は、被験者が自分の氏名を入力する場合に、入力可能な文字数を制限することを可能にするとともに、被験者が自分の携帯メールアドレスを入力する場合に、入力可能な文字数を制限することを可能にする欄である。
【００６９】
図９に示す発行設定ダイアログ画面の一番下には、テストボタン７０８、キャンセルボタン７０９、発行ボタン７１０が横に並べて配置されている。テストボタン７０８は、設定内容に従って図１０に示す発行画面を表示するボタンであり、課題出題者が、実際に被験者に表示される内容を確認するためのボタンである。このテストボタン７０８は、あくまで確認用の発行画面を表示するためのボタンであって、実際にプログラミング課題に対する解答を入力するためのＵＲＬは発行されない。すなわち、後述する発行ボタン７１０のように、図９に示す設定内容とプログラミング課題とが対応付けられて、発行ＤＢ１７９に格納されるわけではない。また、キャンセルボタン７０９は、設定内容を破棄して、発行設定ダイアログを閉じるためのボタンである。
【００７０】
そして、発行ボタン７１０は、図９に示す設定内容とプログラミング課題とを対応付けて、発行ＤＢ１７９に格納するためのボタンである。具体的に説明すると、課題出題者によって発行ボタン７１０がクリックされると、発行ボタン７１０の操作信号を受信したＣＰＵ１１は、課題ＤＢ１７６から被験者に受けさせたい課題（図９でいえば課題「英単語カウント」）をＲＡＭ１３上にコピーして読み出す。また、その課題に対し、図９に示す設定内容を対応付けて、ＨＤＤ１７内の発行ＤＢ１７９に格納する。このように、テストボタン７０８と異なり、発行ボタン７１０をクリックすることによって、実際に課題と設定内容が対応付けられて、ＨＤＤ１７内の発行ＤＢ１７９に格納される。発行ＤＢ１７９に格納されるファイルは、後述する図１０に示す発行画面を、表示部２５に表示させるために、ＨＴＭＬ文書やＸＭＬ文書等で格納される。
【００７１】
また、発行ボタン７１０は、図９に示す設定内容に従って、例えば図１０に示す発行画面をクライアント端末２Ａの表示部２５に表示させるためのボタンでもある。具体的に説明すると、課題出題者によって発行ボタン７１０がクリックされると、図９に示す設定内容に従って、図１０に示す発行画面が自動的に生成され、その発行画面がクライアント端末２Ａの表示部２５に表示される。
【００７２】
図１０は、課題出題者が操作するクライアント端末２Ａの表示部２５に表示される発行画面の一例である。図１１は、図１０に示す発行画面が、課題出題者のクライアント端末２Ａにおける表示部２５のブラウザ上に表示されている様子を示す。上述のようにして自動的に生成された図１０の発行画面のＵＲＬ（http://www.abc000・・・）、すなわち図１１に示すＵＲＬ１０００は、課題出題者が被験者に受けさせたい課題、図９に示すＵＲＬ有効期限入力欄７０２に入力された有効期限、図９に示すパスワード入力欄７０３に入力されたパスワードなどと対応付けられる。また、図１０及び図１１では、図９の発行タイトル入力欄７０５とメッセージ入力エリア７０６に入力した内容が表示されている。なお、この図１０に示す発行画面は、後述するように、被験者が操作するクライアント端末２Ｂの表示部２５に表示させる画面になる。
【００７３】
次に、課題出題者が、図１１に示す発行画面のＵＲＬ１０００をコピー＆ペーストして、電子メールで被験者に送った後、電子メールを受信した被験者は、クライアント端末２Ｂを操作してそのＵＲＬにアクセスする（図４に示すステップＳ５）。具体的には、課題出題者のクライアント端末２Ａ及び被験者のクライアント端末２Ｂにおいて、ＨＤＤ２７内の電子メールアプリ２７１が実行され、上述したＵＲＬが付された電子メールが、クライアント端末２Ａからクライアント端末２Ｂへと送信される。
【００７４】
被験者は、クライアント端末２Ｂのウェブブラウザアプリ２７２を実行し、課題出題者によって選択された課題に対する解答を入力可能なウェブページを取得するために、電子メールに付されたＵＲＬにアクセスする（電子メール上で、ハイパーリンクされたＵＲＬをクリックすることもできる）。
【００７５】
サーバ１は、クライアント端末２Ｂのウェブブラウザアプリ２７２からの要求に応じて、発行ＤＢ１７９に格納されているＨＴＭＬ文書等をＲＡＭ１３上にコピーして読み出して、通信部１６を介して、それをクライアント端末２Ｂに送信する。これにより、課題出題者によって選択されたプログラミング課題に関する課題情報を、図１１に示す発行画面を通じて被験者に伝える。
【００７６】
次に、被験者は、クライアント端末２Ｂの表示部２５に表示された、図１１に示す発行画面を閲覧して、必要事項を入力した後、課題に対する解答入力を行う。すなわち、サーバ１側からみれば、課題に対する解答入力の受付が行われる（図４のステップＳ６）。
【００７７】
図１１に示す発行画面には、上から順に、ＵＲＬ１０００、課題出題者が発行タイトル入力欄７０５（図９）に入力した内容８０１、パスワード入力欄８０２、課題出題者がメッセージ入力エリア７０６（図９）に入力した内容（符号省略）、解答者氏名入力欄８０３、携帯メールアドレス入力欄８０４、携帯メールアドレス再入力欄８０５、スタートボタン８０６が表示される。
【００７８】
被験者は、パスワード入力欄８０２に、予め電子メール等で知らされているパスワード「test2009」を入力し、解答者氏名入力欄８０３及び携帯メールアドレス入力欄８０４に氏名とメールアドレスを入力した後に、スタートボタン８０６をクリックする。そうすると、クライアント端末２Ｂの表示部２５にプログラミング画面（図１２）が表示される。具体的には、サーバ１のウェブアプリ１７５は、クライアント端末２Ｂのウェブブラウザアプリ２７２からの要求に応じて、発行ＤＢ１７９から、表示部２５にプログラミング画面を表示させるためのＨＴＭＬ文書等をＲＡＭ１３上にコピーして読み出して、それをクライアント端末２Ｂに送信する。これにより、被験者にプログラミング環境を提供する。なお、図１２は、課題表示／編集エリア９０１にまだ何も入力されていない様子を示している。
【００７９】
図１２に示すプログラミング画面中、課題表示／編集エリア９０１の「課題」タブをクリックすると、例えば図１３に示すように、課題出題者が被験者に受けさせたい課題の内容（課題文）が表示される（図７に示す課題内容登録エリア６１８３参照）。上述したように、課題内容が省略されている場合（課題内容は口頭などで既に伝えている場合）には、「課題」タブをクリックしても空欄表示となる。
【００８０】
図１２又は図１３において、課題表示／編集エリア９０１は、「課題」タブによって課題内容を表示するエリアであるとともに、「編集」タブによってソースコードの作成・編集を行わせるエリアである。プログラミングをしている最中に、課題表示とソースコード編集は随時切り替えることができる。これにより、被験者は、課題を忘れた場合であっても課題内容を適宜確認することができる。
【００８１】
課題表示／編集エリア９０１の下に表示される出力エリア９０２は、被験者にとって標準出力（ＳＴＤＯＵＴ）エリアになる。ここにはビルド結果やプログラムの出力結果などが表示される。例えば、図１４に示すような警告表示がなされたり、図１５に示すようなエラー表示がなされたりする。出力エリア９０２の下には、ビルドボタン９０３、実行ボタン９０４、テストボタン９０５、及び完了ボタン９０６が左から順に並んでいる。
【００８２】
ビルドボタン９０３は、サーバ１において作成中プログラムのビルドを行う。具体的に説明すると、被験者が課題表示／編集エリア９０１に入力したソースコードは、順次サーバ１に送られる。例えば、JavaScriptを利用して非同期通信を行い、サーバ１とクライアント端末２Ｂの間でＸＭＬデータのやり取りを行うＡｊａｘ（Asynchronous JavaScript＋ＸＭＬ）を用いることができる。これにより、クライアント端末２Ｂは、被験者のプログラミング過程データ（ログデータ）をサーバ１に非同期で送り続けることができる。
【００８３】
なお、ログデータは、被験者がソースコードを１文字入力するごとに送られてもよいし、所定のブロック（例えば任意の関数）を完成させるごとに送られてもよい。本実施形態では、被験者がソースコードを１文字入力するごとに、ログデータ（それまで被験者が記述したソースコード）がサーバ１に送られるものとする。これにより、通信障害等で送信されたログデータが一部失われたとしても、サーバ１は、それ以降のログデータを受信することにより、ログデータを回復（欠落部分を補充）することができ、ひいてはビルド対象となるログデータの信頼性を高めることができる。また、Ａｊａｘ以外にも、サーバ１がログデータを受信できる技術であれば、如何なる技術を採用してもよい。例えば、サーバ１との同期通信を行うＤＨＴＭＬ（Dynamic Hyper Text Markup Language）を用いて、所定のタイミング（例えばリロードタイミング）でログデータをサーバ１に送ってもよい。その他、プラグインのインストールを前提に、より自由度の高いＦｌａｓｈ（登録商標）を用いてもよい。
【００８４】
サーバ１のＣＰＵ１１は、クライアント端末２Ｂから送られてきたログデータを、通信部１６を介して受信すると、解答した被験者と対応付けてＨＤＤ１７内の解答ＤＢ１８０に順次格納する。このとき、ＣＰＵ１１の内蔵タイマ又は外付けタイマ、或いは時計機能等によって、通信部１６においてログデータを受信したタイミングが解答ＤＢ１８０に格納される。このタイミングは、後述する［プログラミング能力診断］又は［定量的なスキル評価］に用いられる。
【００８５】
このように、解答ＤＢ１８０にログデータが順次格納されている状態において、被験者がビルドボタン９０３をクリックすると、クライアント端末２ＢのＣＰＵ２１は、通信部２６を介してビルド実行命令をサーバ１に送信する。サーバ１のＣＰＵ１１は、通信部１６を介してビルド実行命令を受信すると、解答ＤＢ１８０から現在格納されているログデータ（それまで被験者が作成したソースコードに相当）を読み出して、ビルドを行う。ビルドについては、コンパイルとリンクを連動させて実行形式のファイルを自動生成する処理である。ビルドの過程で、文法エラーがあった場合等には、コンパイラのメッセージは出力エリア９０２に表示される。なお、本実施形態では、ビルドを行うタイミングで解答ＤＢ１８０からログデータを読み出すこととしたが、もしログデータの欠落があった場合には、ビルド結果の信頼性が低下する。そこで、例えばサーバ１は、ビルド実行命令を受けたタイミングで、クライアント端末２Ｂから再度ログデータを取り直すこともできる。これにより、ログデータの欠落がない状態でビルドできるので、ビルド結果の信頼性を高めることができる。
【００８６】
実行ボタン９０４は、作成中のプログラムを実行するためのボタンであり、これをクリックすることによって、ビルドにより自動生成された実行形式のファイルが開かれる。プログラムからの標準出力は、出力エリア９０２に表示される。作成中のソースコードに変更があった状態で実行ボタン９０４がクリックされると、変更後のソースコードについて未だビルドが行われていないので、「ビルドを行いますか？」といった表示とともに、ビルドを許容するＯＫボタンが、例えばポップアップウィンドウにより自動的になされる。そして、被験者は、ビルドボタン９０３を直接クリックすることによって、或いは、実行ボタン９０４をクリックした後に、ポップアップウィンドウのＯＫボタンをクリックする等してビルドを許容することで、自分が記述したソースコードに、文法エラーがないか否か等を確認することができる。なお、「ビルドを行いますか？」といった表示をせず、実行ボタン９０４がクリックされた場合にビルドされていないとき、自動的（強制的）にビルドされ、その後、自動的に実行形式のファイルが開かれるようにしてもよい。
【００８７】
ここで、文法エラー等がない場合であっても、課題出題者が意図した出力結果が得られない可能性がある。そこで、被験者は、テストボタン９０５を利用する。テストボタン９０５は、自動単体テストを実行するためのボタンであり、自動単体テストとは、課題に対する解答されたソースコードが論理的に正しいか否かを自動的にチェックするためのテストをいう。前述した図７に示すテストコード登録エリア６１８５には、main関数と、TestCaseという名前（この名前は一例であり、他の名前でもよい）の構造体（struct）が記述されている（一部抜粋）。被験者がテストボタン９０５をクリックすると、図１５に示す課題表示／編集エリア９０１に記述されたソースコードに、図７に示すテストコード登録エリア６１８５を通じて課題出題者が登録したテストコードがマージされ、ビルドが行われる。その後、自動生成された実行形式のファイルが開かれ、出力結果が出力エリア９０２に表示される。このようにして、被験者は、課題出題者が意図した出力結果が得られるか否かを、課題提出前に確認することができる。
【００８８】
換言すれば、サーバ１のＨＤＤ１７には、コンパイラやリンカとしての機能を提供するプログラミングアプリケーション（図２では図示せず）がインストールされており、ＣＰＵ１１は、そのプログラミングアプリケーションを実行することによって、上述したソースコードとテストコードをマージしたもののビルドを行う。
【００８９】
ソースコードとテストコードのマージ方法は、如何なる方法であってもよい。例えば、課題表示／編集エリア９０１に記述されたソースコードの中に、main関数に相当する記述があった場合には、その部分を削除したり、（テストコード中のmain関数が真のmain関数となるように）属性変更を行ったりするなど、必要に応じて編集を行った上で、ソースコードとテストコードをマージすればよい。ビルドが完了すると、ＣＰＵ１１は、得られた実行形式のファイルを実行し、出力結果を表示部２５（図１５に示すプログラミング画面の出力エリア９０２）に表示する。
【００９０】
このように、被験者は、サーバ１のプログラミングアプリケーション機能の提供を受けることで、自己のクライアント端末２Ｂ上において、自動単体テストを実行することができる。すなわち、本実施形態では、被験者が操作するクライアント端末２Ｂは、プログラミング課題を出題された被験者がプログラミング課題を解決するプログラムを作成するプログラム作成装置の一例となる。また、このクライアント端末２Ｂにおいて、被験者によってプログラムが作成され、プログラミング課題を出題した出題者により設定された所望のプログラム出力が得られるか否かのテストとして、自動単体テストが実行される。換言すれば、サーバ１に登録されているテストコードと、被験者により作成されたソースコードとを組み合わせることによって生成された、テスト用プログラムの出力結果を得るためのテストとして、自動単体テストが実行される。
【００９１】
なお、図７を用いて説明したテストボタン６１８７に関して補足すると、このボタンは、上述したように、課題出題者が課題内容を登録する段階において、プログラミング課題に対する解答を自分で試作してみるとともに、試作したプログラムについて自動単体テストを実行してみるためのボタンである。すなわち、課題出題者によってテストボタン６１８７がクリックされると、図１２に示すプログラミング画面が、課題出題者のクライアント端末２Ａの表示部２５に表示される。そして、課題出題者は、プログラミング画面の課題表示／編集エリア９０１に、課題に解答するソースコードを試しに記述してみる。課題出題者は、プログラミングが終了すると、図１２のプログラミング画面下方のテストボタン９０５をクリックする。そうすると、被験者が自動単体テストを行うのと同様に、課題表示／編集エリア９０１に記述されたソースコードに、図７に示すテストコード登録エリア６１８５を通じて登録されたテストコードがマージされ、ビルドが行われる。このようにして、課題出題者は、課題内容を登録する段階において（図７参照）、図７に示すテストボタン６１８７をクリックすることにより、試しに課題を解いてみることができる。つまり、自分が作成した模範ソースコードと模範テストコードによって、意図した出力結果が得られるか否かを試すことができる。
【００９２】
図１２に戻って、最後に、被験者が完了ボタン９０６をクリックすると、プログラミング課題の受験は終了する。ただし、テストボタン９０５による自動単体テストに合格していない場合は、「全てのテストケースを通過していません。終了しますか？」というメッセージが表示される。すなわち、受付部２４から操作信号を受信したクライアント端末２ＢのＣＰＵ２１は、その旨をサーバ１に知らせる受験完了信号を送信する一方で、サーバ１のＣＰＵ１１は、その受験完了信号を受信すると、解答ＤＢ１８０にアクセスして、テストボタン９０５による自動単体テストの合否履歴を確認する。なお、ここでいう全てのテストケースとは、図７に示すテストコード登録エリア６１８５を通じて課題出題者が登録したテストコード（例えば、ある変数に第１の値を代入すると、出力結果として第２の値が出力される等）の全てのケースを意味する。そして、自動単体テストのテストケースで１つでも合格していないと判定した場合には、上述したメッセージを表示させるＨＴＭＬ文書を、クライアント端末２Ｂに送信する。これにより、課題出題者が作った自動単体テストで合格した後に、作成したプログラムを提出するよう被験者に促すことができる。
【００９３】
このようにして、結果的にサーバ１の解答ＤＢ１８０には、課題出題者により設定された所望のプログラム出力が得られて自動単体テストを通過したプログラム（テスト通過プログラム）と、被験者がテスト通過プログラムを作成する過程で生成された複数のプログラム（中間生成プログラム）とが格納されることになる。本実施形態では、上述したＡｊａｘ等の技術を用いて、被験者が受付部２４を１回操作するごとに、クライアント端末２Ｂからサーバ１へデータ転送が行われる。なお、テスト通過プログラムについては１個であっても複数であってもよい。
【００９４】
図１２に戻って、完了ボタン９０６のクリックによって、被験者によるプログラミング課題の受験が終了すると、上述した図５に示すトップメニュー画面の解答新着件数表示欄６４が１だけインクリメントされる。すなわち、サーバ１のＣＰＵ１１は、クライアント端末２Ｂからの受験完了信号を受信すると、解答新着件数表示欄６４に表示された数字に１を加算する。そうすると、課題出題者は、図５に示すトップメニュー画面の解答確認ボタン６３をクリックすることにより、解答確認画面上で被験者の解答を確認することができる（図４に示すステップＳ７）。
【００９５】
図１６は、課題出題者が被験者の解答を確認するための解答確認画面の一例である。図１６に示す解答確認画面には、トップメニュー画面に表示されていた解答新着件数表示欄６４と同じく、解答新着件数表示欄６３１が表示されている。また、解答新着件数表示欄６３１の下には、被験者が解答した課題の一覧（結果一覧）が表示される。この結果一覧において、基準６３２、課題名６３３、解答日６３４は、システムによって必ず表示される項目である。また、基準６３２の欄については、後述する［定量的なスキル評価］に用いられる。
【００９６】
結果一覧の下方には、チャート表示ボタン６３７、ダウンロードボタン６３８、課題情報ボタン６３９、発行情報ボタン６４０が表示されている。結果一覧では、これら４個のボタンのいずれによっても開かれていない新着解答データについては、太字で示されるようになっている。これにより、課題出題者は、まだ開いていない新着データを容易に把握することができる。
【００９７】
チャート表示ボタン６３７は、後述する［定量的なスキルの評価］の評価結果を生産性・品質チャートで表示するためのボタンである。ダウンロードボタン６３８は、解答ＤＢ１８０から被験者の解答を読み出してダウンロードするためのボタンである。具体的には、課題出題者のクライアント端末２Ａの表示部２５上で、ダウンロードボタン６３８がクリックされると、サーバ１のＣＰＵ１１は、解答ＤＢ１８０に格納された被験者の解答（上述したテスト通過プログラムと中間生成プログラム）を読み出して、クライアント端末２Ａに対して送信する。その結果、課題出題者のクライアント端末２Ａは、テスト通過プログラムと中間生成プログラムをダウンロードし、読み込むことができる。なお、ダウンロードの対象となるのは、図１６に示す解答確認画面において、カーソル等によって現在選択されているカレントデータである（図１６では、Ｎｏ．３の解答者Ｑが作成した解答データ）。また、ここでは中間生成プログラム自体をダウンロードしているが、その中間生成プログラムを復元可能なプログラム構成情報をダウンロードするようにしてもよい。具体例を挙げると、“ｉ”と入力された状態のソースコードからなる中間生成プログラム、“ｉｎ”と入力された状態のソースコードからなる中間生成プログラム、“ｉｎｔ”と入力された状態のソースコードからなる中間生成プログラムをダウンロードすることもできるし、或いは、“ｉ”と入力された状態のソースコード、“ｎ”と入力された状態のソースコード、“ｔ”と入力された状態のソースコードからなるプログラム構成情報をダウンロードすることもできる。このプログラム構成情報があれば、“ｉ”と入力された状態のソースコードからなる中間生成プログラムも、“ｉｎ”と入力された状態のソースコードからなる中間生成プログラムも、“ｉｎｔ”と入力された状態のソースコードからなる中間生成プログラムも、復元することができる。例えば、“ｉ”と入力された状態のソースコードと、“ｎ”と入力された状態のソースコードとを組み合わせれば、“ｉｎ”と入力された状態のソースコードからなる中間生成プログラムを復元することができる。要は、プログラム構成情報は、中間生成プログラムを復元可能な情報であれば、如何なる情報であってもよい。この趣旨に照らせば、中間生成プログラム自体も、プログラム構成情報となり得る。
【００９８】
以上説明したように、プログラミング能力診断装置としてのクライアント端末２Ａにおいて被験者のプログラミング能力診断を行うにあたって、プログラミング課題に対する被験者の解答データを、通信ネットワーク１００を介してサーバ１からクライアント端末２Ａにダウンロードすることができる。
【００９９】
次に、ダウンロードして取得した解答データ（テスト通過プログラムと中間生成プログラム）を用いて、クライアント端末２Ａ上で行われるプログラミング能力診断について、具体的に説明する。
【０１００】
［プログラミング能力診断］
まず、課題出題者は、図１６に示す画面の下方にハイパーリンクされた「再生観察アプリケーションのダウンロードはこちら」の文字６４１をクリックし、インストーラファイルをダウンロードし、自己のクライアント端末２Ａにインストールする。具体的には、サーバ１のＨＤＤ１７には、ソフトウェアプログラムの再生観察アプリ（図示せず）も格納されており、サーバ１のＣＰＵ１１は、クライアント端末２Ａのウェブブラウザアプリ２７２の要求に従って、再生観察アプリのインストーラファイルを送信する。クライアント端末２ＡのＣＰＵ２１は、受信したインストーラファイルを実行し、その結果生成されたファイルをＨＤＤ２７に格納する。これにより、クライアント端末２Ａに再生観察アプリがインストールされる。なお、本実施形態では、再生観察アプリは、通信ネットワーク１００を介してダウンロードされることとしたが、ＵＳＢやＤＶＤなどの記憶媒体を使ってクライアント端末２Ａにインストールすることもできる。
【０１０１】
図１７は、再生観察アプリがインストールされた後のクライアント端末２Ａのソフトウェア的な機能を示す機能ブロック図である。本実施形態では、このクライアント端末２Ａが、被験者のプログラミング能力を診断するプログラミング能力診断装置の一例となる。
【０１０２】
図１７に示すように、クライアント端末２Ａは、制御部２０と、受付部２４と、表示部２５と、通信部２６と、記憶部２７とを有するとともに、再生部３１と、可視化図生成部３２と、タイミング解析部３３と、検索部３４と、コード重複率解析部３５とを有している。受付部２４、表示部２５、通信部２６、記憶部２７は、それぞれ図３に示す受付部２４、表示部２５、通信部２６、ＨＤＤ２７によってソフトウェア的に実現される。
【０１０３】
特に、記憶部２７は、サーバ１からダウンロードした、複数の関数モジュールから構成されるテスト通過プログラムと、複数の中間生成プログラムを復元可能なプログラム構成情報とを記憶する機能を有する。再生部３１は、プログラム構成情報により復元される複数の中間生成プログラムに基づいて、テスト通過プログラムの作成過程を再生する機能を有する。可視化図生成部３２は、テスト通過プログラムに基づいて、一の関数モジュール若しくは複数の関数モジュール各々の処理手順又は一の関数モジュール若しくは複数の関数モジュール間の構造が可視化された図を生成する機能を有する。制御部２０は、再生部３１により再生されるテスト通過プログラムの作成過程と、可視化図生成部３２により生成された図とを表示部２５に表示させる機能を有する。
【０１０４】
また、タイミング解析部３３は、複数の中間生成プログラムに基づいて、一の関数モジュール又は複数の関数モジュール各々が生成されたタイミングを解析する機能を有する。検索部３４は、一の関数モジュール又は複数の関数モジュール各々について、タイミング解析部３３によって解析されたタイミングよりも前に、被験者による関数モジュールの記述があるか否かを、複数の中間生成プログラムを用いて検索する機能を有する。コード重複率解析部３５は、一の関数モジュール内又は複数の関数モジュール間でコードの重複度合いを示すコード重複率を解析する機能を有する。
【０１０５】
また、制御部２０は、タイミング解析部３３の解析結果、検索部３４の検索結果、コード重複率解析部３５の解析結果を、表示部２５に表示させる機能を有する。加えて、制御部２０は、表示部２５においてユーザの操作を受け付ける受付部２４からの操作信号に基づいて、タイミング解析部３３の解析結果、検索部３４の検索結果、コード重複率解析部３５の解析結果を、選択的に表示部２５に表示させる機能（いわゆる選択切替表示機能）を有する。
【０１０６】
再生部３１と、可視化図生成部３２と、タイミング解析部３３と、検索部３４と、コード重複率解析部３５と、制御部２０との各部の機能は、図３に示すＣＰＵ２１、ＲＯＭ２２、ＲＡＭ２３、及び、記憶部２７に格納される再生観察アプリのソフトウェア等により機能的に実現される。以下、図１８〜図４０に示す画面例に基づいて、本実施形態に係るプログラミング能力診断方法の詳細について説明する。
【０１０７】
図１８は、クライアント端末２Ａにおいて再生観察アプリを起動したときに、表示部２５に表示される起動画面の一例を示す図である。なお、図１８に示す起動画面は、大きく横に３つの領域に分かれており、左欄には、画面モード１００１、対象データファイル１００２、ＣＳＶ変換１００３が表示され、中欄には、再生欄１００４、出力欄１００５が表示され、右欄には、経過時間１００６、再生モード１００７が表示されている。
【０１０８】
画面モード１００１は、テスト通過プログラムの作成過程を再生する「再生モード」と、可視化図生成部３２により生成された図など、プログラミング作成過程を分析するための図を表示する「分析モード」とを切り替えるためのものであって、図１８ではラジオボタンによって構成されている。プログラミング能力診断を行う者は、このラジオボタンのクリック位置を所望の位置にするだけで、再生モードと分析モードを切り替えることができる。
【０１０９】
対象データファイル１００２は、参照ボタン１００２ａによって指定された参照フォルダに存在するファイルであって、分析対象とするために、追加ボタン１００２ｂによってファイル選択画面（図示せず）を表示させ、所望のファイルを追加することができる（追加した様子は後述する）。
【０１１０】
ＣＳＶ変換１００３は、後述する各パラメータ推移で用いるデータを、ＥＸＣＥＬ（登録商標）等の汎用ソフトウェアで分析できるようにＣＳＶ形式で出力する機能である。どのファイルのどのデータを出力するかは、設定ボタン１００３ｂによってデータ選択画面（図示せず）を表示させ、所望のデータを設定し、変換ボタン１００３ｃをクリックすることにより、参照ボタン１００３ａによって指定された参照フォルダへＣＳＶ変換されたＣＳＶファイルを出力する。これにより、プログラミング能力診断を行う者は、例えばＥＸＣＥＬ（登録商標）等のＣＳＶファイルを扱うことが可能なソフトウェアを用いて、所望の分析を行うことができる。
【０１１１】
再生欄１００４は、テスト通過プログラムの作成過程を再生するための欄であり、出力欄１００５は、被験者によってコンパイルされた結果や自動単体テストが実行された結果を表示するための欄である（再生・表示している様子は後述する）。
【０１１２】
経過時間１００６は、被験者がテスト経過プログラムを作成する過程において実際に経過した時間であり、再生モード１００７は、ラジオボタン１００７ａのクリック位置を切り替えることによって、実時間ベースでの再生と、操作ベースでの再生を切り替えることができるようになっている。すなわち、被験者がテスト経過プログラムを作成する過程において時間の経過に応じて再生する実時間ベースでの再生と、被験者がテスト経過プログラムを作成する過程において操作する回数に応じて再生する操作ベースでの再生とを切り替えることができるようになっている。
【０１１３】
例えば、実時間ベースでの再生の場合には、１秒経過後、２秒経過後、３秒経過後の中間生成プログラムが、それぞれ再生欄１００４に順次表示される。一方、操作ベースでの再生の場合には、１回目の操作後（例えばキーボードのiを押下した後）、２回目の操作後（例えばキーボードのnを押下した後）、３回目の操作後（例えばキーボードをtを押下した後）の中間生成プログラム（すなわち、“i”と入力された状態のソースコード→“in”と入力された状態のソースコード→“int”と入力された状態のソースコード）が、それぞれ再生欄１００４に順次表示される。
【０１１４】
速度調整バー１００７ｂを操作することによって、再生欄１００４で再生されるスピードを調節することができる。すなわち、速度調整バー１００７ｂを「速い」の方（上方）へ移動させることで、いわゆる早送り再生が可能となり、速度調整バー１００７ｂを「遅い」の方（下方）へ移動させることで、いわゆるスロー再生が可能となる。最も下方へ移動させた場合には、等速再生が可能になる。このように、速度調整バー１００７ｂを移動させるだけで、所望の速度でテスト通過プログラムの作成過程を再生することができる。
【０１１５】
次に、プログラミング能力診断を行う者は、再生観察アプリを起動した後、図１８に示す追加ボタン１００２ｂをクリックして、ファイル選択画面（図示せず）を表示させ、参照ボタン１００２ａによって指定された参照フォルダ内に存在するファイルを選択することによって、分析対象となるデータファイルを追加する。このようにして、再生部３１は、記憶部２７に記憶されたテスト通過プログラム及び中間生成プログラムのうち、分析対象となるものを対象ファイルとして読み込む。
【０１１６】
図１９は、分析対象となるデータファイルが１個追加された様子を示す図である。図１９では、「英単語カウント」のプログラミング課題に対してＡさんが作成した対象ファイル（「英単語カウント＿Ａ」で示す）が追加されている。なお、Ａさんが作成した対象ファイルを追加することで、削除ボタン１００２ｄが有効化されている。
【０１１７】
また、追加ボタン１００２ｂの下方には、「自動追加」機能を有効化するか否かのチェックボックス１００２ｃが設けられており、このチェックボックス１００２ｃにチェックを入れることにより、再生観察アプリを起動した際、自動的に、参照ボタン１００２ａによって指定された参照フォルダに存在するファイルが対象ファイルとして読み込まれる。また、対象ファイルとして自動追加するファイル数は所望の数に制限することができる。図１９では、チェックボックス１００２ｃの右側に示すように、１個までに制限されている。
【０１１８】
次に、プログラミング能力診断を行う者は、図１９の右上に示す経過時間１００６の下に配置された再生ボタン１００６ａをクリックする。そうすると、テスト通過プログラムの作成過程の再生が開始される。
【０１１９】
図２０は、テスト通過プログラムの作成過程が再生されている様子を示す図である。なお、図２０では、再生ボタン１００６ａの右側に配置された一時停止ボタン１００６ｂをクリックした状態になっている。また、一時停止ボタン１００６ｂの右側に配置された停止ボタン１００６ｃをクリックすると、再生欄１００４はクリアされる。
【０１２０】
図２０に示すように、再生欄１００４には、１２行のソースコードが記述されており、これは、経過時間１００６を見ると、プログラミング課題に対する解答を開始してから１分４７秒後のソースコードであることが分かる。つまり、被験者は、１分４７秒の間に１２行のソースコードを記述したことが分かる。また、経過時間１００６の下方には、操作回数１００８ａとして１８０回、文字数１００８ｂとして２０６文字（コピー＆ペースト等を考慮すれば、操作回数よりも文字数の方が多くなる場合はある）、行数として１６行（ここでは空欄行もカウントされている）、課題確認時間１００８ｄとして１８秒（課題確認時間については図２２を用いて後述する）、ビルド回数１００８ｅとして０回、実行回数１００８ｆとして０回、自動テスト回数１００８ｇとして０回が表示されている。
【０１２１】
ビルド回数１００８ｅは、上述した被験者がテスト通過プログラムを作成する過程で、図１２に示すビルドボタン９０３をクリックした回数を示し、実行回数１００８ｆは、被験者がテスト通過プログラムを作成する過程で、図１２に示す実行ボタン９０４をクリックした回数を示し、自動テスト回数１００８ｇは、被験者がテスト通過プログラムを作成する過程で、図１２に示すテストボタン９０５をクリックした回数を示している。
【０１２２】
なお、自動テスト回数１００８ｇの下に表示されたサムネイルグラフ１００９は、画面モード１００１において分析モードを選択したときに表示されるグラフ（詳細は後述する）のサムネイルである。特に、操作回数又は再生時間を横軸にもつサムネイルグラフ１００９の中には、重なるようにして、サムネイル用再生位置バー１００９ａが表示されており、全体のうちどの程度まで再生が済んだかが分かるようになっている。
【０１２３】
また、図２０の下方には、再生位置バー１０１０が表示されており、全体のうちどの程度まで再生が済んだかが表示されるようになっている。プログラミング能力診断を行う者は、この再生位置バー１０１０をクリックして、左右に移動させることによって、所望の操作回数（実時間ベースでの再生の場合には所望の経過時間）における中間生成プログラム（ソースコード）を視認することができる。
【０１２４】
ここで、再生位置バー１０１０とサムネイル用再生位置バー１００９ａは連動表示される。すなわち、再生位置バー１０１０を左右に移動させると、それに追随してサムネイル用再生位置バー１００９ａも移動する。このように、テスト通過プログラムの作成過程を再生するときに、操作回数（操作ベースでの再生のとき）又は再生時間（実時間ベースでの再生のとき）の経過状況を示す再生位置バー１０１０と、プログラミング作成過程を分析するための複数のパラメータ（詳細は後述）を表示するサムネイルグラフ１００９に重なるようにして配置され、操作回数又は再生時間の経過状況を示すサムネイル用再生位置バー１００９ａとを、制御部２０によって表示部２５に連動表示させている。これにより、サムネイルグラフ１００９中のパラメータを視認しながら再生位置バー１０１０を移動させ、再生欄１００４に、所望の中間生成プログラムを迅速に表示させることができる。
【０１２５】
例えば、サムネイルグラフ１００９中に、操作回数のパラメータが急激に増加していた箇所があった場合、プログラミング能力診断を行う者は、被験者がどのような操作を行ったか知りたいことがある。このような場合には、サムネイル用再生位置バー１００９ａがサムネイルグラフ１００９上でその箇所にくるように、再生位置バー１０１０を移動させればよい。これにより、サムネイルグラフ１００９上で操作回数のパラメータが急激に増加していたところで、被験者がどのような操作を行っていたかを迅速に把握することができる。なお、サムネイルグラフ１００９上にどのようなパラメータを表示させるかは、グラフ設定１００９ｂをクリックして、パラメータ選択画面（図示せず）を表示させ、所望のパラメータを選択すればよい。なお、ここでは再生位置バー１０１０のみを移動操作可能としているが、例えば、サムネイル用再生位置バー１００９ａのみ、或いは、再生位置バー１０１０及びサムネイル用再生位置バー１００９ａの双方を、移動操作可能としてもよい。
【０１２６】
図２１は、被験者によってビルドが１回行われている様子を示す図である。図２１では、クライアント端末２Ｂの表示部２５において、図１２に示す出力エリア９０２に表示された内容が、クライアント端末２Ａの表示部２５において、図２１に示す出力欄１００５にも表示されている。なお、ビルドが１回行われたことに伴って、ビルド回数１００８ｅが１だけインクリメントされている。
【０１２７】
図２２は、再生欄１００４に、プログラミング課題が表示されている様子を示す図である。具体的には、図２２によれば、被験者のＡさんは、経過時間１００６が２分７秒の時点で、プログラミング課題を見ていたことになる。ということは、実際にＡさんがクライアント端末２Ｂにおいてプログラミングをしている最中に、２分７秒経過した時点で、図１３に示すようにプログラミング課題を見ていたことが分かる。そして、プログラミング課題を見ていた時間は、上述した課題確認時間１００８ｄとして計測されている。このように、本実施形態に係るプログラミング能力診断装置としてのクライアント端末２Ａは、複数の中間生成プログラムに基づいて、被験者がテスト通過プログラムの作成過程でプログラミング課題を視認していた時間を、課題確認時間として計測する計測機能を有している。
【０１２８】
図２３は、図２１と比べて更に多くの時間が経過したときの様子を示す図である。経過時間１００６は３０分２７秒を示しており、操作回数１００８ａは１０１８回を示している。また、再生位置バー１０１０は、図２１よりも右に移動している。また、ビルド回数１００８ｅ及び出力欄１００５に示されているように、ビルドは３回行われている。
【０１２９】
特に、図２３では、図２１と異なり、再生欄１００４にスクロールバー１００４ａが現れている。中間生成プログラムの行数が増えてくると、自動的にスクロールバー１００４ａが表示される。プログラミング能力診断を行う者は、スクロールバー１００４ａを上下に移動させることによって、再生欄１００４に、中間生成プログラムの所望箇所を表示させることができる。
【０１３０】
図２４は、最後に生成された中間生成プログラムが表示されている様子を示す図である。図２４に示すように、再生位置バー１０１０は最も右の位置にきており、経過時間１００６は１時間２７分３９秒、操作回数１００８ａは２７１７回、文字数１００８ｂは２１２６文字、行数は１２２行、課題確認時間１００８ｄは１１７３秒、ビルド回数１００８ｅは３５回、実行回数１６回、自動テスト回数は０回となっている。また、操作回数１００８ａの２７１７回は、サムネイルグラフ１００９の横軸右端の数値２７１７と一致している。
【０１３１】
図１８〜図２４は、再生モード１００７のうち、操作ベースでの再生について説明した。上述したように、再生モード１００７におけるラジオボタン１００７ａのクリック位置を切り替えることによって、実時間ベースでの再生と、操作ベースでの再生を切り替えることができる。図２５は、実時間ベースでの再生について説明するための図である。図２５では、図２４と同様に、最後に生成された中間生成プログラムが表示されている様子を示しており、経過時間１００６が示す１時間２７分３９秒（＝５２５９秒）と、サムネイルグラフ１００９の横軸右端が示す数値５２５９とが一致している。
【０１３２】
以上が画面モード１００１のうち再生観察モードについての説明である。次に、画面モード１００１のうち分析モードについて説明する。図２６は、プログラミング作成過程を分析するための図を表示する分析モードのうち、各パラメータ推移の様子を示す図である。図２６では、左欄の画面モード１００１において、ラジオボタンのクリック位置が分析モードになっている。
【０１３３】
図２６の中央には、プログラミング作成過程を分析するための図が表示される分析欄１０１１が設けられている。この分析欄１０１１には、右欄におけるパラメータ設定１０１４の設定内容（チェックボックスのチェック状態）が反映される（なお、縦軸のスケールの関係で、又は、線の濃さの関係で、一部の線が見え難くなっている）。図２６の右欄には、上から順に、グラフ個数１０１２、表示内容１０１３、パラメータ設定１０１４が表示されている。グラフ個数１０１２は、１０１１を分割表示するためのものであるが、図２６では縦１×横１に設定され、分割されていない（分割されている様子については後述する）。
【０１３４】
表示内容１０１３では、ラジオボタンによって、各パラメータ推移、関数ライフサイクル、フローチャート、コードの重複を選択することができるようになっている。図２６では、各パラメータ推移が選択されている。各パラメータ推移で用いるパラメータ設定１０１４では、正規化１０１５、横軸値１０１６、基本項目１０１７、オプション１０１８を設定することができるようになっている。正規化１０１５と横軸値１０１６の詳細については後述する（後述する図３０及び図３１と、図３５参照）。
【０１３５】
基本項目１０１７としては、操作回数、総文字数、総行数、実コード文字数、実コード行数（空欄行を除いた実際のコード行数）、実コード語数（スペース文字を除いた実際のコード語数）、コメント文字数、コメント行数、課題確認時間、課題確認回数、ビルド回数、実行回数、自動テスト（自動単体テスト）回数、ビルドエラー数、ビルドワーニング（警告）数、自動テストエラー数といった各々のパラメータを、分析欄１０１１に表示させるか否かをチェックボックスにより選択できるようになっている。これらのパラメータは、特にこれらに限定されるものではなく、必要に応じて増やしたり減らしたりすることができる。
【０１３６】
また、ビルド回数、実行回数、自動テスト回数については、いずれも回数自体が少なく操作回数等と同じグラフに表示させると見えにくくなるため、別途オプション１０１８として、ビルドタイミング、実行タイミング、自動テストタイミングを、基本項目１０１７のパラメータが示すグラフ中に四角印で表示させるようにしている。例えば、分析欄１０１１中、四角印１０１８ａは、ビルドタイミングを示し、四角印１０１８ｂは、実行タイミングを示している。このように、基本項目１０１７のパラメータ推移が表示されたグラフ中に、ビルドタイミングや実行タイミングを四角印で表示させることによって、ビルドタイミングや実行タイミングを視認しやすくなる。
【０１３７】
例えば、ビルドや実行をあまりに早いタイミングで繰り返す被験者は、頭の中で見通しが立てられないので試行錯誤している可能性がある。したがって、早い段階でビルドタイミングや実行タイミングを繰り返す被験者よりも、遅い段階でビルドタイミングや実行タイミングを繰り返す被験者の方が、プログラミング能力が優れていると考えられる。また、ビルドタイミングや実行タイミングの回数に着目すれば、回数の多い被験者よりも回数の少ない被験者の方が、プログラミング能力が優れていると考えられる。後者の方が、しっかり考えながらプログラミングを行っていると思われるからである。
【０１３８】
図２７は、プログラミング作成過程を分析するための図を表示する分析モードのうち、関数ライフサイクルを示す図である。図２７の右欄に示すように、表示内容１０１３のラジオボタンのクリック位置は、関数ライフサイクルの位置にある。なお、関数ライフサイクルとは、ソースコード中に関数モジュールの各々が生成され消去されるまでの、関数の生存期間を示すものであり（一般的には、プログラミング課題の題意把握ミスなどがない限り、関数モジュールは最後まで消去されることはない）、上述のとおりタイミング解析部３３の解析結果に基づいて自動的に作図される。また、関数とは、引数と呼ばれるデータ（入力データ）を受け取って、予め規定された処理を実行して結果を返す命令群を意味し、一般的に、プログラムの構成要素となる。本実施形態では、入力データとして数字を扱うこととしているが、例えば、入力データとして文字が入力され、処理結果としてその文字が画面に表示されるような関数を考えることもできる。なお、横軸は、操作回数を示す（横軸値１０１６のラジオボタンのクリック位置は、操作回数の位置にある）。
【０１３９】
図２７に示す関数ライフサイクルによれば、Ａさんは、プログラム中に、“ＩｓＷｏｒｄＥｎｄ”１０２１、“ＩｓＳｍａｌｌＡｌｐｈａ”１０２２、“ＩｓＢｉｇＡｌｐｈａ”１０２３、“ＩｓＡｌＮｕｍ”１０２４、“ＣｏｕｎｔＷｏｒｄ”１０２５、“ｍａｉｎ”１０２６の合計６個の関数モジュールを作っていることが分かる。特に、一番下の“ｍａｉｎ”１０２６は、プログラムの骨格となる基本関数（一般に、各サブルーチンを呼び出す基本関数）であり、これが早いタイミングでプログラム中に作られている。したがって、Ａさんは、最初にmain関数という基本構造を作り、その後、main関数の中で個々の関数モジュールをサブルーチン化したプログラムを作っていることが分かる。
【０１４０】
また、図２７に示す関数ライフサイクルによれば、全ての関数モジュールが、操作回数で半分よりも手前のタイミング（図２７でいえば左半分のタイミング）で作られている。関数モジュールは、いわばプログラムの部品であるため、Ａさんは、プログラムにどのような部品が必要になるかを早いタイミングで見通せている、すなわち構成を見通す力を有していることが分かる。
【０１４１】
ここで、図２７に示す関数ライフサイクルの作図は、予め規定された定義に基づいて、その定義に当てはまる記述を関数として認識すればよい。代表的な方法が、コンパイラ等による構文解析である。ここではＣ言語を用いて記述されたソースコードの構文解析について説明する。Ｃ言語における関数は、「“関数型指定子”＋“関数名”＋“（”＋“引数”＋“）”＋“｛”＋“関数本文”＋“｝”」で定義することができる。ここでいう関数型指定子は、“ｉｎｔ”や“ｖｏｉｄ”などである。可視化図生成部３２やタイミング解析部３３が関数モジュールを認識するときには、このような定義に当てはまる記述を検索し、見つかった場合にはその記述を関数として認識する。一部でも、この定義に当てはまらない記述については、関数として認識しない。本実施形態では、全ての中間生成プログラムに対して構文解析を試みている。そのため、上述した６個の関数モジュールの各々において、構文解析が成功した中間生成プログラムのうち、最も操作回数の少ない中間生成プログラムが生成されたタイミングが、その関数モジュールの生成タイミングとして認識される。例えば、“ＩｓＷｏｒｄＥｎｄ”１０２１についていえば、タイミング１０２１ａで生成された中間生成プログラムで構文解析が成功し、ソースコード中に関数モジュール“ＩｓＷｏｒｄＥｎｄ”１０２１が存在することが認識されている。以下同様に、“ＩｓＳｍａｌｌＡｌｐｈａ”１０２２、“ＩｓＢｉｇＡｌｐｈａ”１０２３、“ＩｓＡｌＮｕｍ”１０２４、“ＣｏｕｎｔＷｏｒｄ”１０２５、“ｍａｉｎ”１０２６のそれぞれについて、タイミング１０２２ａ、１０２３ａ、１０２４ａ、１０２５ａ、１０２６ａで生成された中間生成プログラムにおいて構文解析が成功し、ソースコード中に関数モジュール“ＩｓＳｍａｌｌＡｌｐｈａ”１０２２、“ＩｓＢｉｇＡｌｐｈａ”１０２３、“ＩｓＡｌＮｕｍ”１０２４、“ＣｏｕｎｔＷｏｒｄ”１０２５、“ｍａｉｎ”１０２６が存在することが認識されている。
【０１４２】
このように、タイミング解析部３３の解析結果に基づけば、ソースコード中に関数モジュールがどのタイミングで生成されたかを認識することができる。しかしながら、ここでいうタイミングとは、あくまでタイミング解析部３３による“解析が成功した”タイミングを意味し、実際にＡさんが関数モジュールの必要性に気づき、ソースコード中に関数モジュールを“記述した”タイミングを意味するものではない。
【０１４３】
そこで、本実施形態では、検索部３４により、プログラム中で被験者が関数モジュールを記述し始めたタイミングを検索するようにしている。具体的には、タイミング解析部３３によって解析されたタイミングよりも前に、被験者による関数モジュールの記述があるか否かを、複数の中間生成プログラムを用いて検索するようにしている。図２７でいえば、“ＩｓＷｏｒｄＥｎｄ”１０２１のタイミング１０２１ａの左側にヒゲ１０２１ｂが突き出している。これは、検索部３４の検索結果により、タイミング１０２１ａよりも前のタイミングで、被験者による関数モジュールの記述があったことを示している。このように、被験者が関数モジュールを記述した直後のタイミングを知ることによって、被験者が関数モジュールの必要性に気づいた時期など、被験者の思考過程を把握することができ、ひいてはプログラミング能力診断に役立てることができる。なお、図２７では、被験者が作成したプログラムは複数の関数モジュールから構成されているが、一の関数モジュールから構成される場合もある。
【０１４４】
図２８は、プログラミング作成過程を分析するための図を表示する分析モードのうち、フローチャートを示す図である。右欄の表示内容１０１３のラジオボタンのクリック位置は、フローチャートの位置になっている。このフローチャートは、可視化図生成部３２によって、テスト通過プログラムに基づいて、複数の関数モジュール各々の処理手順が可視化された図を示す。
【０１４５】
図２８によれば、図２７を用いて上述したように、Ａさんが作成したプログラムには、“ＩｓＷｏｒｄＥｎｄ”１０２１、“ＩｓＳｍａｌｌＡｌｐｈａ”１０２２、“ＩｓＢｉｇＡｌｐｈａ”１０２３、“ＩｓＡｌＮｕｍ”１０２４、“ＣｏｕｎｔＷｏｒｄ”１０２５、“ｍａｉｎ”１０２６の合計６個の関数モジュールが作られていることが分かる。また、最も右側の“ｍａｉｎ”１０２６の処理手順内には、３個のサブルーチン１０２６ｂが組み込まれていることが分かる。同様に、“ＩｓＷｏｒｄＥｎｄ”１０２１や“ＣｏｕｎｔＷｏｒｄ”１０２５にも、一又は複数のサブルーチンが組み込まれている。このように、図２８に示すフローチャートを確認すれば、被験者が関数モジュールをサブルーチン化している様子を一見して把握することができる。
【０１４６】
また、図２８によれば、最も左側の“ＣｏｕｎｔＷｏｒｄ”１０２５の処理手順内には、入れ子状態の処理手順１０２５ｂが組み込まれていることが分かる。同様に、“ＩｓＡｌＮｕｍ”１０２４の処理手順内にも、入れ子状態の処理手順１０２４ｂが組み込まれている。ただ、入れ子状態の処理手順１０２５ｂは、入れ子状態の処理手順１０２４ｂと比べても分かるように、分岐やループを多用されており、複雑なアルゴリズムになっている。したがって、分岐やループが少なくてシンプルなアルゴリズムを実現できているか、という診断基準においては、Ａさんは良い評価にならないことになる。なお、シンプルなアルゴリズムかどうかは、Ａさんの処理手順だけを見ても分からないことが多い。そのため、複数の被験者の処理手順を見比べ（後述する図３３等参照）、相対的な評価（どちらのアルゴリズムがシンプルか）をすることによって、より的確な能力診断を行うことができる。
【０１４７】
なお、本実施形態では、複数の関数モジュール各々の処理手順が可視化された図として、フローチャートを考えたが、本発明はこれに限られず、記号の近くに説明を入れたＨＣＰチャートなど、プログラムの目的を階層構造で表現した設計図を用いることも可能である。また、可視化図生成部３２は、複数の関数モジュール各々の処理手順が可視化された図ではなく、複数の関数モジュール間の構造が可視化された図を生成するようにしてもよい。例えば、クラス図など、システムの構造を記述する構造図や、ＤＦＤ（データフローダイアグラム）など、関数と関数との間のデータの流れを示す図である。また、複数の関数モジュール各々の処理手順と、複数の関数モジュール間の構造との両方を可視化するような図を生成してもよい。さらに、図２８では、複数の関数モジュールが示されているが、一の関数モジュールが示される場合もある。この場合、一の関数モジュールの処理手順が可視化された図や、一の関数モジュールの構造が可視化された図が生成されることになる。
【０１４８】
図２９は、プログラミング作成過程を分析するための図を表示する分析モードのうち、コードの重複を示す図である。右欄の表示内容１０１３のラジオボタンのクリック位置は、コードの重複の位置になっている。コードの重複率は、複数の関数モジュール間でコードの重複度合いを示すものであり、コード重複率解析部３５によって解析される。コード重複率の低いプログラムを作成した被験者は、無駄が少なく効率的なプログラム構造を構築できる力が優れていることになる。
【０１４９】
図２９に示すコード重複率１０３０は、０％になっており、全く重複していない。すなわち、ソースコードを記述する際、例えばコピー＆ペースト等を全く使用していないことが推測される（図３４を用いて後述する例では、コード重複率が５０％近くになっている）。したがって、Ａさんは、無駄が少なく効率的なプログラム構造を構築できているか、という意味においては、優れたプログラマであることが分かる。また、コード重複率が低いと、仕様変更が発生した場合であっても変更箇所が少なくなるので、この意味において、Ａさんのプログラムはメンテナンス性に優れているといえる。なお、コード重複率を解析する技術としては、如何なる技術を採用しても構わない。例えば、主にソースコードのコピー＆ペーストを行うことにより生成される、ソースコード中の重複したコード列を検索することにより、コード重複率を解析することができる。具体的には、ソースコード（テスト通過プログラム）を、プログラミング言語の字句規則に従ってトークンに分割するとともに、型や変数、定数に属するトークンは、同一のトークンに置き換える。この置き換えによって、例えば変数名だけが異なるコード列の組を、重複したコード列として検出できるようになる。なお、図２９では、複数の関数モジュール間でコードの重複度合いが示されているが、一の関数モジュール内のコードの重複度合いが示されるようにしてもよい。
【０１５０】
以上、図２６〜図２９を用いて説明したように、ユーザは、受付部２４を通じて、表示内容１０１３のラジオボタンのクリック位置を変更するだけで、表示部２５に各図を選択的に表示させることができる。したがって、プログラムの構造を構築する能力を、様々な視点から簡易かつ迅速に診断することができる。
【０１５１】
図３０は、二人の被験者の各パラメータ推移を比較している様子を示す図である。図３０において、上側は、上述したＡさんのパラメータ推移１０３１ａを示しており、下側は、新たに追加したＢさん（左欄の対象データファイル１００２参照）のパラメータ推移１０３１ｂを示している。このような比較表示は、右欄のグラフ個数１０１２において、縦２個×横１個と調整することによって実現することができる。なお、図３０は、右欄のグラフ個数１０１２において、縦２個×横１個と調整した例であるが、縦１個×横２個と調整することによって、横に２個のグラフを並べることも可能である。
【０１５２】
ここで、図３０では、比較を容易にするために、パラメータ設定１０１４の正規化１０１５の機能を使用している。具体的には、正規化１０１５のチェックボックスにおいて横軸の欄にチェックを入れている。これにより、Ａさんのパラメータ推移１０３１ａの横軸右端１０３１ｃの値が１００になるとともに、Ｂさんのパラメータ推移１０３１ｂの横軸右端１０３１ｄの値も１００になり、正規化される。なお、図３１は、図３０と異なり、横軸だけでなく縦軸も正規化されている例を示す。具体的には、Ａさんのパラメータ推移１０３１ａの縦軸上端１０３１ｅの値が１００になるとともに、Ｂさんのパラメータ推移１０３１ｂの縦軸上端１０３１ｆの値が１００になっている。
【０１５３】
このように、本実施形態に係るプログラミング能力診断装置（クライアント端末２Ａ）は、プログラミング作成過程を分析するための図において横軸又は縦軸を正規化する機能を有している。この正規化機能によって、相対的な比較をし易くすることができる。特に、グラフ各軸の“絶対値”よりも、“グラフ形状”を見たいときに便利である。例えば、文字数の推移を見るときに、「何文字書いたか、何分で書いたか」を視覚化したいときには、正規化機能を使わないグラフの方が便利である一方、「前半と後半とで、どちらが文字数の伸びが激しいか」を視覚化したいときには、正規化機能を使ったグラフの方が便利である。
【０１５４】
図３２は、二人の被験者の関数ライフサイクルを比較している様子を示す図である。図３２の下側に示す、Ｂさんの関数ライフサイクルにおいて、“ＣｈｅｃｋＷｏｒｄ”１０３２のタイミング１０３２ａの左側にヒゲ１０３２ｂが突き出している。これは、上述したように、検索部３４の検索結果により、タイミング１０３２ａよりも前のタイミングで、被験者による関数モジュール“ＣｈｅｃｋＷｏｒｄ”１０３２の記述があったことを示している。図３２において、Ａさんの関数ライフサイクル（上側）と、Ｂさんの関数ライフサイクル（下側）とを比較すると、プログラムに必要な関数モジュールが早いタイミングで全て揃っているＡさんの方が、プログラムの構造を見通す力が高いといえる。一方、関数モジュールの個数自体が少ないＢさんの方が（Ａさんは６個、Ｂさんは３個）、アルゴリズムをシンプル化する力が高いといえる。プログラミング能力を診断する者は、図３２に示す関数ライフサイクルのみで評価を決定する必要はなく、フローチャートやコードの重複などを参照しつつ、総合的な評価を下すようにすればよい。また、シンプルなアルゴリズムを構築するプログラマが欲しい場合には、Ｂさんを高評価にすればよいし、プログラム構造を見通す力の高いプログラマが欲しい場合には、Ａさんを高評価にすればよい。
【０１５５】
図３３及び図３４は、それぞれ三人の被験者のフローチャート及びコード重複を比較している様子を示す図である。図３３に示すように、三人の被験者のフローチャートを縦に並べて表示させると、アルゴリズムが相対的にどの程度シンプルであるかを一見して把握することができる。関数モジュールが３個のＢさん、関数モジュールが４個のＤさんと比べて、関数モジュールが９個のＥさんのフローチャートは、非常に複雑である。このように複雑なフローチャートになる原因の一つとしては、ソースコードを記述する際にコピー＆ペーストを多用している可能性がある。そこで、Ｂさん、Ｄさん、Ｅさんのコード重複を比較すると、図３４に示すように、それぞれ０％、０％、４８％となっている。つまり、Ｅさんは、半分近くをコピー＆ペーストしている可能性があることが分かる。あとは、各パラメータ推移を示すグラフにおいて、総文字数の推移を確認し、急激に文字数が増加している箇所などが発見されれば、コピー＆ペーストをしている可能性が高まる。
【０１５６】
図３５は、図２６と異なり、パラメータ設定１０１４における横軸値１０１６のラジオボタンのクリック位置を、操作回数から時間に代えている様子を示す図である。すなわち、図３５では、図２６と異なり経過時間を横軸にとっており（横軸右端の値が経過時間５２５９秒となっている）、時間経過に対する各パラメータ推移を一見して把握することができる。これにより、例えば操作回数１０４１に着目したとき、ソースコードを記述する際に何も操作をしていない時間帯（例えば区間１０４１ａ）がどれくらいあるか、といったことを把握することができる。
【０１５７】
図３６は、被験者が何も操作していない時間帯（待ち）が所定時間発生したときに、キャラクターの表情を変える表情モード設定画面１０５１の一例である。図３６に示す表示モード設定画面１０５１は、経過時間１００６の右側に配置されたキャラクターボタン１００６ｄをクリックすることによって、ポップアップウィンドウとして中央に現れる。表情モード設定画面１０５１によれば、０．５秒以内で連続操作されているときには、キャラクターの表情が好調の表情になり、待ち時間が１０秒発生した場合には、キャラクターの表情が悩みの表情になり、待ち時間が３０秒発生した場合には、キャラクターの表情が睡眠の表情になる。このように、本実施形態に係るプログラミング能力診断装置（クライアント端末２Ａ）は、受付部２４を通じた被験者の操作間隔に基づいて、表示部２５に表示されるキャラクターの表情を変更する機能を有する。
【０１５８】
以上、図１７〜図３６を用いて説明したように、クライアント端末２Ａで行われるプログラミング能力診断によれば、プログラミング課題に対する解決能力、特にプログラムの構造を構築する能力を簡易かつ迅速に診断することができるとともに、プログラミング課題の内容を勘違いして作成されたことによるプログラムの誤評価を防ぐことができる。
【０１５９】
ただし、これらは定性的な診断の側面が強いため、プログラミング能力診断を行う者によって診断結果にバラツキが生じる可能性がある。ある程度のバラツキは許容するにしても、誰が診断を行う場合も同じ結果が出るような、何らかの客観的な指標があることが好ましい。例えば、読みやすさを追求してコメントが多く書かれたソースコードが、必ずしも品質の悪いソースコードとは限らない。かといって、一課題に対し、あまりに多くの時間が掛かったのでは生産性の観点から好ましいとはいえない。そこで、以下、被験者のプログラミング能力を定量的な評価について説明する。
【０１６０】
［定量的なスキル評価］
本実施形態では、被験者のプログラミング能力を定量的に評価するために、生産性・品質評価アプリ１７４（図２参照）を用いる。すなわち、ＣＰＵ１１は、生産性・品質評価アプリ１７４を実行するとともに、解答ＤＢ１８０から上述したログデータやタイミングを読み出して、定量的なスキル評価を行う。
【０１６１】
サーバ１の解答ＤＢ１８０には、ソースコードの時系列の推移情報となる基本情報と、被験者が文法エラーチェックを行った時刻、発生した文法エラーの種類、発生した文法エラーの数、被験者が論理エラーチェックを行った時刻、発生した論理エラーの種類、発生した論理エラーの数等の補正情報とが記憶される。なお、図１５を用いて上述したように、ビルドボタン９０３やテストボタン９０５をクリックした時刻、その結果、出力された文法エラーの種類や数などが記憶される。
【０１６２】
図３７は、解答ＤＢ１８０に記憶されるデータ構成の例示図である。図３７（ａ）は、入力情報テーブルのデータ構成の例示図である。基本情報であるソースコードの時系列の推移情報は、被験者のプログラミング作業における特定のタイミングにてソースコードが復元可能なフォーマットで記憶される。復元可能であればフォーマットは特に問わない。例えば図３７（ａ）では、入力されたテキストデータ等を一文字ずつ入力時刻及び削除時刻とともに記憶している。入力情報テーブルを先頭から解析することにより、任意のタイミングでのソースコードを復元することができる。入力情報には、テキストデータだけではなく、改行、タブ、スペース、各種制御コード等を含めてもよい。また別の記憶方法として、一文字ずつの入力時刻と、各入力時刻における全ソースコードとを対応付けて記憶してもよい。この場合、データ容量は比較的大きくなるものの、任意のタイミングにおけるソースコードの復元アルゴリズムは単純となる。
【０１６３】
いずれの方法であっても、文字が入力されたタイミング毎に推移情報を記憶しているので、被験者のプログラミング作業における任意のタイミングでのソースコードを復元することができる。実際には必ずしも全てのタイミングでソースコードを復元する必要はないが、後述する複雑度の時系列推移データからの近似曲線の算出において、所定の精度を維持することが可能な程度のサンプリング数は必要となる。例えば、予め定めたキー入力の数の単位、リターンキーを操作したタイミング又は予め定めた特定の文字が入力されたタイミング等、予め定めた条件に合致した所定のタイミングにて中間生成プログラムとしてのソースコードを取得するようにしてもよい。
【０１６４】
図３７（ｂ）は、文法エラーテーブルのデータ構成の例示図であり、図３７（ｃ）は、論理エラーテーブルのデータ構成の例示図である。補正情報である文法エラーチェックに関する情報、論理エラーチェックに関わる情報は、例えば図３７（ｂ）、（ｃ）に示すように、それぞれ文法エラーテーブル、論理エラーテーブルに記憶される。文法エラーの種類又は論理エラーの種類に対応付けて文法チェック実行時刻又は論理チェック実行時刻も記憶している。別途カウンタを用いて、文法エラー、論理エラーそれぞれの発生個数の累計値をカウントすることもできる。これらの各種テーブルは、解答ＤＢ１８０に格納することができる。なお、上述したように、文法エラーチェックの実行時刻は、ビルドボタン９０３又は実行ボタン９０４（図１５）がクリックされたタイミングを認識することで記憶可能であるし、また、論理エラーチェックの実行時刻は、テストボタン９０５（図１５）がクリックされたタイミングを認識することで記憶可能である。
【０１６５】
サーバ１のＣＰＵ１１は、ソースコードの時系列の推移情報に基づいて、複雑度の推移を時系列に演算した複雑度推移データを算出する。ここで「複雑度」とは、単に分岐が多い、階層が多い等の構造的複雑さを示す概念のみならず、ソースコード全体として無駄な論理構造、無駄なサブルーチン等を含むか否か等の評価も含む構造化されたソースコードであるか否かを評価する指標値を意味する概念である。一般にプログラム作成開始当初は、複雑度は０（ゼロ）であり、コーディングが進むごとに上昇する。そして、プログラムの完成時期には特定の値に収束する。
【０１６６】
「複雑度」の概念について、以下詳述する。本実施形態では、作成されたプログラムを完全にテストするのに必要なテストケース数（テストパターン数）、及び作成されたプログラムを変更、保守等するのに要する工数と相関のある定量値を、そのプログラムの複雑度と呼んでいる。テストケース数とプログラム変更、保守等に要する工数との間にも相互に相関があるので、概念としてどちらかに代表させてもよい。説明を簡単にするため、テストケース数のみを用いる場合について説明する。
【０１６７】
図３８は、提示されるプログラミング課題の具体例を示す例示図である。なお、ここでは上述したプログラミング課題とは内容が異なる例を示している。また、図３９は、提示されたプログラミング課題に応じて被験者が作成したＣ言語によるプログラムの例示図である。複雑度の算出には、プログラム中に現れる様々な定量値を用いることができる。最も一般的な複雑度は、プログラム中の分岐の数である。単純な数え方としては、図３９に示すプログラムには、ｉｆ文が６個（１３、２０、２１、３４、３６、３８行目）、ｗｈｉｌｅ文が１個（３３行目）存在するので、合計７個の分岐が存在する。一般に分岐の数は、他の条件が全て同じであれば、多ければ多いほど完全なテストをするためのテストケースが多くなることから、分岐数７は複雑度を示す定量値として用いることができる。
【０１６８】
同じく分岐に着目する場合でも、２０行目のｉｆ文のように、１つのｉｆ文の中に２つの判定条件を含む場合には、このｉｆ文は分岐を２つ含むという数え方もある。また９行目のreturn文に含まれる判定条件も暗黙の分岐と考え、４つの分岐と数える場合もある。斯かる考え方で分岐数を数えた場合、図３９に示すプログラム中に存在する分岐は、９行目に４個、１３行目に１個、２０行目に２個、２１行目に１個、２２行目に１個、２６行目に１個、３３行目に１個、３４行目に１個、３６行目に２個、３８行目に２個、それぞれ存在し、総分岐数は１６個となる。
【０１６９】
また、テストケース数と相関のある定量値として、各言語仕様で定義されている様々な型の変数の数を用いてもよい。例えば図３９に示すプログラムには、５個のローカル変数が宣言されている（１８、１９、３０、３１、３２行目）ので、ローカル変数の数に着目すれば図３９のプログラムの複雑度は５であると考えられる。これも、グローバル変数を加えてもよいし、引数も一種の変数とみなして加えてもよい。
【０１７０】
また、複雑度としてインタフェース数を用いてもよい。例えば図３９に示すプログラムには、引数を１つ持つ関数が４個（７、１１、２４、２８行目）、引数を２つ持つ関数が１個（１６行目）含まれている。引数の数がインタフェース数であると考えた場合、このプログラムのインタフェース数として定量値６を得ることができる。インタフェース数は、どのような単位で外部とのインタフェースを考えるかにも依存する。例えばクラスにおけるパブリック関数の数、ファイル単位での外部公開関数の数等をインタフェース数としてもよい。
【０１７１】
同じ理由で、ネストレベルが採用される場合もある。例えば図３９に示すプログラムには、３３行目のｗｈｉｌｅ文の中に３４行目のｉｆ文があり、さらにその中に３６行目のｉｆ文がある。つまり分岐が３段階の入れ子になっており、プログラム全体での最大ネストレベルとして定量値３が得られる。さらに、単に最大ネストレベルを用いるのではなく、例えば分岐の中にある分岐は悪影響が強い等の考え方で、各定量値にネストレベルに応じた重み付け係数を乗じた値として複雑度を算出してもよい。
【０１７２】
他にも、例えば状態の数等の様々な定量値が採用されているが、一般にテストケース数、保守又は変更に要する工数と相関のある定量値であれば、複雑度として用いることができる。また、複雑度の計算精度を上げる目的で、複数の定量値を組み合わせてもよい。例えば、分岐数をＢ、変数の数をＶ、インタフェース数をＩ、ネストレベルをＮとして、ｆ（Ｂ、Ｖ、Ｉ、Ｎ）のように所定の重み付けを付して計算してもよい。計算方法は、プログラム全体で一括して計算してもよいし、関数等の単位ごとに個別に計算したものを全体として再計算してもよい。どの定量値を用い、どのように計算するかは、要求される計算精度や複雑度の算出目的に応じて決定すれば足りる。
【０１７３】
また、複雑度を示す定量値は、使用するプログラミング言語の仕様を考慮して決定される場合もある。例えば図３９に示すプログラムはＣ言語で記述されているが、Ｃ＋＋、ＪＡＶＡ（登録商標）等のようにクラスの概念を有する言語である場合、クラス構造の複雑度を評価する定量値を考慮してもよい。また、直接ソースコードから複雑度を算出することに限定されるものではなく、中間コード、フローチャート等の設計図から計算してもよい。
【０１７４】
逆に、テストケース数、保守又は変更に要する工数との相関の無いパラメータは、複雑度を示す定量値として用いることはできない。例えば、ソースコードの単純な文字数、行数等は、事後メンテナンスを容易にするために丁寧にコメントを付したソースコードであるほど複雑度が高く評価されると考えられ、少なくとも単独では複雑度を示す指標として用いることは不適当である。また図３９のプログラムでは、比較的長い変数名（３０、３１、３２行目）を使用しているが、このような長さ（トークンの長さ）はテストケース数とは全く関係なく、保守又は変更に要する工数の点でも一概に長い（短い）方が良いとは言えないので、少なくとも単独では複雑度として用いることはできない。ファンクションポイントの数、画面数等も、単独で複雑度として用いるには不適当である。一般に、単にソフトウェア規模を表すような定量値は、単独で複雑度として用いるには不適当である（ただし、複雑度を算出する場合に、本来の複雑度を表す定量値と共に計算される場合は除く）。
【０１７５】
さらに、特定のコーディング規約に沿っているか否かを示す定量値等は、そもそも複雑度と無関係である場合が多く、少なくとも単独では複雑度として用いることはない。ただし、コーディング規約自体に複雑度を下げる効果が認められる場合に限り、用いる場合も生じうる。
【０１７６】
また、サーバ１のＣＰＵ１１は、複雑度の時系列の推移データに基づいて、被験者の能力評価値を算出する。能力評価値は、複雑度数値が低い状態で推移した被験者であればあるほど、また短時間に完了した被験者であればあるほど、能力が高いと評価する値とする。すなわち、より短時間によりシンプルな解を見つけた被験者ほど能力が高いと評価する値に設定する。
【０１７７】
能力評価値は、品質能力に関する評価値と生産性能力に関する評価値とを独立して算出
することができる。例えば、複雑度は元来品質を示す指標であり、被験者Ａと被験者Ｂとが同程度の所要時間であり、Ａの複雑度がＢの複雑度よりも低く推移した場合、Ａの品質能力はＢの品質能力よりも高いと評価することができる。またＡの複雑度とＢの複雑度とは同程度で推移しているが、Ａの方がＢよりも短期間に完了した場合は、Ａの方がＢよりも生産性が高いと評価することができる。
【０１７８】
さらに補正情報として記憶されている、被験者が文法エラーを発生させた時刻、エラー
の種類、文法エラーの数の累計値、論理エラーを発生させた時刻、エラーの種類、論理エ
ラーの数の累計値等々を使用して、評価者は、得られた評価値に被験者が実際に発生させ
たエラーという観点からの補正を加えることもできる。
【０１７９】
以下、被験者にプログラミング課題を提示（出題）し、被験者のプログラミング作業から能力評価のためのデータを収集するまでの処理手順を説明する。図４０は、サーバ１のＣＰＵ１１のデータ収集処理の手順を示すフローチャートである。
【０１８０】
図４０において、サーバ１のＣＰＵ１１は、クライアント端末２Ｂの表示部２５に、図１１を用いて前述したように、プログラミング課題の課題名を表示させる（ステップＳ１１）。そして、クライアント端末２Ｂから、プログラミング開始を示唆するスタートボタン８０６（図１１参照）の操作信号を受信すると、タイマによる計時を開始し（ステップＳ１２）、文字入力を受け付けたか否かを判断する（ステップＳ１３）。なお、文字入力とは、テキストデータの入力に限定されるものではなく、削除、改行、タブ、カーソル移動、コピー＆ペースト、検索操作等の編集操作に関連する制御コードの入力も含む。
【０１８１】
ＣＰＵ１１が、文字入力を受け付けていないと判断した場合（ステップＳ１３：ＮＯ）、ＣＰＵ１１は、文字入力の待ち状態となる。ＣＰＵ１１が、文字入力を受け付けたと判断した場合（ステップＳ１３：ＹＥＳ）、ＣＰＵ１１は、被験者のプログラミング作業の任意のタイミングでのソースコードを復元することができるフォーマットで解答ＤＢ１８０に記憶する（ステップＳ１４）。なお、全ての基本情報を記憶してもよいし、評価値の算出精度を維持することができる範囲で間引いて記憶してもよい。
【０１８２】
ＣＰＵ１１は、被験者から文法エラーチェックの開始指示を受け付けたか否か（すなわち、図１５に示すプログラミング画面において、ビルドボタン９０３がクリックされたか否か）を判断し（ステップＳ１５）、ＣＰＵ１１が、開始指示を受け付けていないと判断した場合（ステップＳ１５：ＮＯ）、ＣＰＵ１１は、開始指示の待ち状態となる。ＣＰＵ１１が、開始指示を受け付けたと判断した場合（ステップＳ１５：ＹＥＳ）、ＣＰＵ１１は、被験者が開始指示の受け付け時点で作成していたソースコードに対して文法エラーチェックを実行し、文法エラーチェックの開始指示を受け付けた時刻を解答ＤＢ１８０に記憶して（ステップＳ１６）、文法エラーが存在するか否かを判断する（ステップＳ１７）。なお、文法エラーが存在するか否かは、コンパイラ言語である場合には、市販のコンパイラがコンパイル結果として出力する文字列に基づいて判断すればよい。また同時に実行可能モジュールを生成してもよい。さらに、解答ＤＢ１８０に文法エラーチェックの開始指示を受け付けた時刻を記憶することに限定されるものではなく、例えば文法エラーチェックの完了時刻であってもよい。
【０１８３】
ＣＰＵ１１が、文法エラーが存在すると判断した場合（ステップＳ１７：ＹＥＳ）、ＣＰＵ１１は、存在する文法エラーの種類及び数を、解答ＤＢ１８０に追加して記憶し（ステップＳ１８）、処理をステップＳ１３へ戻して、上述した処理を繰り返す。なお、フローには示していないが、文法エラーが存在しない場合であっても、文法エラーが存在しない旨を示す情報は、文法エラーチェックの完了時刻に対応付けて解答ＤＢ１８０に記憶される。
【０１８４】
ＣＰＵ１１が、文法エラーが存在しないと判断した場合（ステップＳ１７：ＮＯ）、ＣＰＵ１１は、ステップＳ１８をスキップして、被験者から論理エラーチェックの開始指示を受け付けたか否か（すなわち、図１５に示すプログラミング画面において、テストボタン９０５がクリックされたか否か）を判断する（ステップＳ１９）。ＣＰＵ１１が、開始指示を受け付けていないと判断した場合（ステップＳ１９：ＮＯ）、ＣＰＵ１１は、開始指示の待ち状態となる。ＣＰＵ１１が、開始指示を受け付けたと判断した場合（ステップＳ１９：ＹＥＳ）、ＣＰＵ１１は、被験者が開始指示の受け付け時点で作成していたプログラムに対して、テストケースに従った自動単体テストを実行し、論理エラーチェックの開始指示を受け付けた時刻を解答ＤＢ１８０に記憶して（ステップＳ２０）、論理エラーが存在するか否かを判断する（ステップＳ２１）。なお、論理エラーが存在するか否かは、テストケースの入力に対して、想定されている正しい出力を得ることができたか否かに基づいて判断すればよい。
【０１８５】
ＣＰＵ１１が、論理エラーが存在しないと判断した場合（ステップＳ２１：ＮＯ）、ＣＰＵ１１は、プログラムが完成したと判断して処理を終了する。ＣＰＵ１１が、論理エラーが存在すると判断した場合（ステップＳ２１：ＹＥＳ）、ＣＰＵ１１は、存在する論理エラーの種類及び数を、解答ＤＢ１８０に追加して記憶し（ステップＳ２２）、処理をステップＳ２３へ戻して、上述した処理を繰り返す。なお、フローには示していないが、論理エラーが存在しない場合であっても、論理エラーが存在しない旨を示す情報は、論理エラーチェックの完了時刻に対応付けて解答ＤＢ１８０に記憶される。また、被験者が、ソースコード整形等を行う意思を有する場合に備えて、処理を終了するか、さらにプログラミング作業を継続するかの判断を被験者に任せてもよい。
【０１８６】
以上のように図４０に示すフローチャートには、文法エラー及び論理エラーが除去される除去過程が含まれている。該除去過程は外部仕様の同一性を保証する上で重要である。プログラミング課題が同一であっても、それだけでは作成されたプログラムの外部仕様が同一であることは保証されない。例えば被験者Ａのプログラムにはバグが残存し、被験者Ｂのプログラムにはバグが存在しない場合、これは外部仕様に相違があるのと等価であり、その相違は複雑度に影響する。この状態で被験者Ａと被験者Ｂとの複雑度推移を比較しても、その差異が外部仕様の差異によるのか被験者の能力の差異によるのか判別できない。図４０に示すフローチャートでは、文法エラー及び論理エラーが除去される除去過程が含まれているので、このような懸念はない。
【０１８７】
以上、定量的なスキル評価のためのデータ収集プロセスを説明した。なお、図４０では説明の便宜上、ビルドによって文法エラーを検出し、自動単体テストによって論理エラーを検出することとしたが、ビルドによって両者を検出してもよいし、自動単体テストによって両者を検出してもよい。以下、サーバ１が収集したデータに基づいて能力評価値を算出する処理手順を説明する。図４１は、ＣＰＵ１１の能力評価値算出の処理手順のフローチャートを示す。
【０１８８】
まずＣＰＵ１１は、解答ＤＢ１８０に記憶されているソースコードの時系列の推移情報を用いて、プログラミング作業の過程におけるソースコードを順次復元しながら複雑度を時系列に算出し、複雑度の時系列推移データを作成する（ステップＳ３１）。
【０１８９】
複雑度は、ソースコードを入力として算出される。簡便な算出方法として、例えばＭｃＣａｂｅの複雑度における判定条件（複合条件も含む）の数に１を加えた値である基本パス数を算出の基礎として用いてもよい。基本パス数が増大するほど、複雑度も増大していると考えることができる。
【０１９０】
より評価精度を上げる必要がある場合、上述した複雑度の算出の基礎に、変数の種類及び数、関数等の手続きの数、モジュール間インタフェースの数、ソースコードの規模（例えば語数）等のソースコードの複雑さに関連するパラメータを加え、所定の重み付けを行って演算してもよい。また算出の基礎としてＭｃＣａｂｅ以外の指標を用いることも可能である。
【０１９１】
複雑度の算出に用いる指標、パラメータは、要求される評価精度に応じて決定すればよい。例えば初心者に近いプログラマと、企業において定常的に高難易度モジュールを担当している優秀なプログラマとの差異を検出するのであれば、複雑度の差が非常に大きいと考えられることから、単にＭｃＣａｂｅ指標を適用するだけで能力の差異を検出することができる。一方、被験者Ａと被験者Ｂとの能力の差異が非常に小さい場合（例えば２倍程度の場合）は、より多面的な指標、パラメータ等を用いて複雑度の算出精度を上げればよい。
【０１９２】
図４２は、サーバ１によって算出された複雑度の推移データの例示図である。図４２に示すように、タイマによる計時を開始してからのサンプリング経過時間ごとの複雑度９１が算出されている。図４２では、複雑度９１の算出に、上記ＭｃＣａｂｅ指標に加えてプログラムの語数も併用している。
【０１９３】
図４１に戻って、ＣＰＵ１１は、被験者の姿勢による影響を除去するため、得られた複雑度推移データから能力評価に使用する有効区間を抽出する。「被験者の姿勢による影響」とは、例えば、被験者Ａは充分に自動単体テスト、ソース整形等を行い、プログラミング作業を完了したのに対し、被験者Ｂはコーディング中に偶然論理エラーチェックが存在しないと判断され、そのままプログラミング作業を完了した、といった場合に発生する。この例では、たとえ被験者Ａと被験者Ｂとの所要時間、最終複雑度が同じであったとしても、当然ながら評価値としては被験者Ａの方が高く算出されなければならない。このような場合の評価値を正確に算出するために複雑度推移データから有効区間を抽出する。
【０１９４】
有効区間を抽出するために、ＣＰＵ１１は、得られた複雑度の推移データに対して近似曲線を作成する（ステップＳ３２）。近似曲線の作成方法としては、例えば二次曲線による最小二乗近似を組み合わせてもよいし、あらかじめ複数の曲線パターンを解答ＤＢ１８０に記憶しておき、パターンマッチングにより最も近似する曲線パターンで近似してもよい。
【０１９５】
なお、近似曲線は、原理的には数点のサンプリング点からでも作成することができるが、精度を確保する上では数十点以上のサンプリング点が存在することが望ましい。サンプリング点を決定する方法としては、所定時間毎にサンプリング点を設ける方法、所定個数の文字入力があったタイミングをサンプリング点とする方法等、特に限定されるものではない。また、サンプリング点における代表値の決定方法としては、上述した各所定時間又は各所定個数内の複雑度の平均値を求める方法等を用いることができる。
【０１９６】
図４３は、サーバ１によって算出された近似曲線の例示図である。図４３では、所要時間を１００分割し、それぞれの区間の複雑度９１の平均値を代表値として近似曲線１０１を作成している。また近似方法としては、被験者が作成したソースコードの最終複雑度と所要時間から曲線の縦横比を決定した後に、あらかじめ解答ＤＢ１８０に記憶されている約２０００通りの曲線とのパターンマッチングを行っている。解答ＤＢ１８０に記憶されている曲線パターン群は、処理を簡便にするために、複雑度が一定時間０で推移した後に単調増加に転じ、ある複雑度で収束するパターンに統一している。なお、ここではパターンマッチングを行うこととしているが、加重移動平均など他の方法を用いることとしてもよい。
【０１９７】
図４１に戻って、近似曲線１０１が得られた時点で、ＣＰＵ１１は有効区間を抽出する（ステップＳ３３）。図４４は、サーバ１によって抽出された有効区間の例示図である。有効区間１１２は、処理を簡便にするために、複雑度が０から単調増加に転じた点を起点とし、単調増加が終了した点を終点としている。有効区間１１２は、初期設計区間１１１やテスト区間１１３を含まない純粋なプログラミング作業部分とみなすことができる。ここで、初期設計区間１１１やテスト区間１１３を全て除外するのも精度上問題があるとの考え方もあるので、初期設計区間１１１やテスト区間１１３を所定の重み付けで考慮して有効区間１１２を抽出してもよい。
【０１９８】
図４５は、有効区間１１２を補正する必要がある場合の、サーバ１によって作成された近似曲線１０１の例示図である。抽出される有効区間１１２としては、図４４では全体の一部分として抽出されている。しかし、図４５に示すように有効区間１１２は拡大された有効区間１１２’として抽出するべき場合もある。
【０１９９】
図４５に示すようなケースとしては、被験者がプログラミング中に試しに論理エラーチェックをした場合に、偶然にも論理エラーが検出されなかったケース、被験者がテストを軽視する姿勢であるケース等が想定される。斯かる場合、被験者は本来もっと所要時間がかかったものと解釈することができ、有効区間１１２を拡大して能力評価することが妥当である。
【０２００】
図４１に戻って、最後にＣＰＵ１１は、抽出された有効区間１１２に対して所定の演算を行い、能力評価値を算出する（ステップＳ３４）。能力評価値の簡便な算出方法としては、例えば有効区間１１２の近似曲線１０１に対して積分値を求める方法がある。すなわち、時間軸と近似曲線１０１で囲まれた面積を求める方法である。斯かる面積は、被験者がプログラミング作業中に取り組んだ複雑度の総量であると考えられる。面積がより小さい被験者は、プログラミング課題を、より短時間に、よりシンプルに解決したことになるので、面積が小さいほど能力が高いと評価することができる。したがって、積分値（面積）がそのまま評価値となる。
【０２０１】
上記積分値（面積）は、絶対値を算出するのではなく、別途基準となる評価値を設けておき、基準となる評価値との比率で算出しても良い。例えば既知の被験者Ａに特定のプログラミング課題を解いてもらい、被験者Ａのデータを課題情報記憶部１３２に記憶しておく。そして、以後の未知の被験者に同じプログラミング課題を解いてもらう場合、記憶してある「被験者Ａのデータ」との比率で能力評価値を算出できる。このように既知の人物の能力との比率で算出する方法は、開発現場にとって評価値の意味合いを直感的に理解しやすいというメリットがある。
【０２０２】
また積分値（面積）の算出に当たって、近似曲線１０１を使用するのではなく、複雑度の生データを使用してもよい。例えば複雑度の推移データの区間平均値を加算する方法であってもよい。この場合、意味的には積分であっても、演算としては単なる加算となり、演算処理負荷を軽減することができる。さらに近似曲線１０１を用いた場合でも、曲線が充分に単純である場合は、有効区間１１２の時間幅と特定位置の複雑度データと所定の係数とを用いて、単なる乗算で評価値を算出してもよい。
【０２０３】
また別の側面からの能力評価として、上記有効区間１１２において、あるサンプリング点の複雑度が直前のサンプリング点の複雑度よりも小さくなった回数を計数して評価値としてもよい。複雑度は、プログラミング作業が順調に進んでいるうちは単調に増加するが、被験者が設計の誤りに気付いた場合、文法エラーや論理エラー等による修正作業が発生した場合等には、一時的に複雑度が下がる場合がある。計数した回数が多い人ほど初期の設計の見通しが甘く、試行錯誤の度合が高いと判断することができる。
【０２０４】
有効区間１１２の抽出された位置、大きさ等から被験者の傾向を示す評価値も得ることができる。例えば抽出された有効区間１１２が複雑度の全推移データの中で極端に前半に位置していた場合は、プログラミング課題をよく読まずに取り掛かる傾向が強いと判断することができる。仕様をよく理解せずにプログラミングを開始するのは、品質に悪影響を与えやすい開発姿勢である。
【０２０５】
逆に、抽出された有効区間１１２が複雑度の全推移データの中で極端に後半に位置していた場合は、よく動作チェックを行わずに完了したと判断することができる。そのような姿勢は、当然ながら品質に悪影響を与える。また、全体の所要時間が非常に長いにもかかわらず、抽出された有効区間１１２が極端に狭い場合は、仕様理解や動作チェックにあまりに時間をかけすぎた可能性があり、生産性改善の余地が大きいと判断することができる。有効区間１１２の位置の偏りや全体に占める比率を定量化することは容易である。
【０２０６】
能力評価値は、被験者の品質能力と生産性能力とに独立に算出することも可能である。これは複雑度の推移データ自体が、縦軸に品質に関連の深い複雑度をとり、横軸に生産性に関連の深い時間をとって作成されているからである。
【０２０７】
図４６は、特徴的な４名の被験者Ａ、Ｂ、Ｃ、Ｄの複雑度の推移データを示す例示図である。図４６において、被験者Ａは短時間に高い複雑度に到達したグラフとなっている。手は速いがコードは乱雑な傾向の被験者であり、生産性能力は高いが品質能力が低いパターンを有している。以下同様に、被験者Ｂは生産性能力も品質能力も低く、被験者Ｃは生産性能力も品質能力も高く、被験者Ｄは、生産性能力は低いが品質能力は高い、と解釈することができる。
【０２０８】
品質や生産性に関する特性は容易に定量化することができる。最も簡便な定量化方法は、曲線を包含する矩形を描き、矩形の面積と縦横比とを得る方法である。面積と縦横比とに基づいて、図４６に示す４パターンのどこに位置するかを定量的に算出することができる。位置算出の結果は図３１のプロット（黒丸）で示されている。矩形を求めるに当たっては、複雑度の推移データ全体を用いても良いが、有効区間１１２の抽出を考慮した方が評価精度は高い。
【０２０９】
このように、複雑度の推移データを用いることで、近似曲線の作成、有効区間の抽出等を実行することにより、被験者の能力評価値のみならず特性にまで踏み込んだ定量値を算出することができる。上述した例の他にも、複雑度に基づいて算出され、プログラミング能力を評価するに値する評価指標であれば、評価値として用いることができる。
【０２１０】
最後にＣＰＵ１１は、解答ＤＢ１８０に記憶されている補正情報（被験者のエラーチェックタイミング、発生したエラーの情報等）を、一覧表又はグラフの形式にて評価者に提示する。提示するフォーマットは、その被験者が、いつエラーチェックを行い、そのときにどんなエラーが発生したのかが評価者にわかれば、どのようなフォーマットでも構わない。また提示方法は、課題出題者のクライアント端末２Ａの表示部２５（或いはサーバ１の表示部１５）に表示してもよいし、印刷してもよいし、後に他のソフトウェアや他のコンピュータで閲覧されることを想定して所定の形式で記憶又は送信しても構わない。
【０２１１】
図４１のフローチャートでは、能力評価値の算出にあたって補正情報（被験者のエラーチェックタイミング、発生したエラーの情報等）を使用していない。使用しない理由は、サーバ１を企業における入社試験等に利用する場合、３０分〜２時間程度で完了するプログラミング課題であることが望まれるが、そのような短時間で被験者が発生させるエラーは偶発性が強く（従って再現性が低く）、能力評価値のパラメータとしては不適当なためである。
【０２１２】
ただし、あまりにも極端なエラー状況であった場合、例えば文法エラーチェックも論理エラーチェックも１回で通過させるような優秀な被験者、逆にあまりにも大量のエラーを出しながらプログラミングを行う被験者等がいた場合は、能力評価値に加えてエラー情報も考慮すべきである。このような理由から、補正情報は能力評価値の算出には用いないが、評価者に提示はしている。
【０２１３】
しかし、被験者の時間的制約が緩い場合、例えば企業における教育研修で統計的に有意な期間（例えば数日等）が許される場合はこの限りではなく、補正情報を能力評価値の算出に用いてもよい。
【０２１４】
なお、ここでは能力評価のため被験者にＣ言語プログラミングの作業をさせる場合について説明したが、Ｃ言語プログラミング作業は１つの例であり、ここでの能力評価値算出の本質ではない。作業内容としては、被験者によって作成されるテスト通過プログラム及び中間生成プログラムから複雑度を算出可能であれば、どのような作業であってもよい。
【０２１５】
以上説明した［定量的なスキル評価法］によれば、被験者が作成したソースコードの中間生成プログラム（ログデータ）をクライアント端末２Ｂから所定タイミングで取得し、そのタイミングと中間生成プログラムの複雑度に基づいて、被験者のスキルを定量的に評価できるので、被験者のプログラミングスキルを容易に客観的に評価することができる。
【０２１６】
具体的に説明すると、課題出題者が視認し得る図１６に戻って、チャート表示ボタン６３７をクリックすれば、例えば図４７に示す生産性・品質チャート６３７１の表示画面が、クライアント端末２Ａの表示部２５に現れる。この図４７に示すチャート表示画面は、図４６に示す例示図によって示される画面に相当するものであり、被験者のプログラミングにおける生産性能力や品質能力を相対的に図示している。横軸は、品質能力（図４６では品質と表記）を示し、縦軸は生産性能力（図４６では生産性と表記）を示している。また、図４７では、図４６と異なり正方向を逆転させている。すなわち、図４７では、横軸の品質能力についていえば、左方向に行くほど品質能力が高くなり、縦軸の生産性能力についていえば、下方向に行くほど生産性能力が高くなる。また、図４７では、被験者２（四角枠で囲まれた２で示す）、被験者３（四角枠で囲まれた３で示す）、被験者５（四角枠で囲まれた５で示す）、被験者６（四角枠で囲まれた６で示す）の能力評価を行っているが、これは、図１６に示す解答確認画面において、課題出題者がＮｏ．２、Ｎｏ．３、Ｎｏ．５、Ｎｏ．６を選択したからである。
【０２１７】
図４７に示すように、被験者３の生産性、品質は、ともに２．０である。また、被験者６の生産性、品質は、ともに５．０である。これは、被験者３が被験者６と比べて生産性が２．５倍高く、品質が約２．５倍良いことを意味する（つまり、生産性・品質チャート６３７１の左下にいくほど能力が高いように配置される）。したがって、仮に、被験者６が既存の社員で、被験者２，３，５が採用試験の応募者である場合には、被験者３は既存のある社員（被験者６）よりも数倍能力が高いため採用する、といった適切な判断を下すことができる。このように、被験者のスキルを相対的に判断するためには、生産性・品質チャートで基準となるデータが必要になるため、図１６に示す基準６３２の項目を設けている。そして、図４７に示す生産性・品質チャート６３７１で、被験者６（基準となる者）を示す四角枠内に色を着けることによって、課題出題者は被験者のスキルを容易に相対判断することができる。
【０２１８】
また、図４７では、基準となる者の位置を自由に変更することができるように、基準位置調整ボックスが表示されている。詳細には、生産性能力基準位置調整ボックス６３７２、このボックス内の数値を増減させるスピンボタン６３７３、品質能力基準位置調整ボックス６３７４、このボックス内の数値を増減させるスピンボタン６３７５が表示されている。変更ピッチは、０．１刻みである。また、基準位置のデフォルトは、（５．０，５．０）である。基準位置を変更する場合には、課題出題者は、スピンボタン６３７３やスピンボタン６３７５をクリックすればよい。
【０２１９】
さらに、図４７では、生産性・品質チャート６３７１に面積一定線６３７７を描画するか否かを選択するためのチェックボックス６３７６が設けられている。生産性・品質チャート６３７１内に描画された面積一定線６３７３は、生産性能力値×品質能力値が一定になるように一本又は複数本描画される。これにより、各被験者のスキルを、基準となる被験者６と比べて、総合的に優れているか劣っているかを相対判断することができる。なお、閉じるボタン６３７８がクリックされると、図４７に示す画面は閉じられる。
【０２２０】
以上、図３７〜図４７を用いて説明した生産性・品質チャートは、図２６に示すパラメータ設定１０１４にチェックボックスを設け（図２６では図示せず）、分析欄１０１１に表示させることができる。具体的には、テスト通過プログラムと中間生成プログラムをクライアント端末２Ａにダウンロードする際、これを一緒にダウンロードし、記憶部２７に記憶させておけばよい。
【０２２１】
また、本実施形態に係るプログラミング能力診断装置（クライアント端末２Ａ）の機能として、診断レポート出力機能がある。図４８は、診断レポート（１枚目）の一例であり、図４９は、診断レポート（２枚目）の一例である。図４８及び図４９に示すレポートには、図３７〜図４７を用いて説明した生産性・品質チャートを縮小した縮小版生産性・品質チャート１０７１と、図２６〜図３５を用いて説明したプログラミング作成過程を分析するための各図を縮小した図（縮小版複雑度推移グラフ１０７２、縮小版コード重複図１０７３、縮小版関数ライフサイクル図１０７４、縮小版フローチャート１０７５）とが印刷されている。また、各図の近辺には、コメント欄が印刷されており、プログラミング能力診断を行う者は、コメントを記入した上でレポート出力可能となっている。
【０２２２】
このように、診断レポート出力機能を設けることで、被験者に対し、定性的かつ定量的な診断結果を提供することができる。なお、この診断レポート出力機能は、クライアント端末２Ａの制御部２０が、縮小版生産性・品質チャート１０７１などを記憶部２７から読み出して、プリンタ等から構成される印刷部（図１７では図示せず）に印刷信号を送信することによって実現することができる。この印刷部は、クライアント端末２Ａに（ＵＳＢなどで）外部接続されるプリンタ等であってもよい。或いは、診断レポート出力機能として、Ｅｘｃｅｌ（登録商標）形式でデータ出力するようにしてもよい。
【０２２３】
［実施形態の主な効果］
以上説明したように、本発明の第１実施形態に係るプログラミング能力診断装置（クライアント端末２Ａ）によれば、複数の関数モジュール各々の処理手順（図２８に示すフローチャートなど）又は複数の関数モジュール間の構造が可視化された図（例えばクラス図など）を視認することによって、自身がプログラミングに熟知していなくても、また、被験者が大勢いた場合であっても、プログラムの構造を構築する能力を簡易かつ迅速に診断することができる。
【０２２４】
また、図１２のテストボタン９０５を用いることによって、プログラミング課題の内容を勘違いして作成されたプログラムは、プログラミング能力診断の対象から排除することができるので、プログラミング課題の内容を勘違いしてプログラムが作成されたことに起因する誤評価を防ぐことができる。
【０２２５】
また、タイミング解析部３３の機能により、複数の関数モジュールの各々が生成されたタイミングを知ることができ、ひいてはプログラムの構造を頭の中で如何に早く構築することができるか、といった能力を診断することができる。また、検索部３４の機能によれば、関数モジュールが被験者によって記述されたタイミングを把握することができる。また、コード重複率解析部３５の機能により、プログラムの構造を効率的に構築できているか、といった能力を診断することができる。
【０２２６】
さらに、プログラミング能力診断を行う者は、受付部２４を操作して、可視化図生成部３２により生成された図と、タイミング解析部３３の解析結果と、コード重複率解析部３５の解析結果とを、表示部２５において選択的に切り替えることができるので、プログラムの構造を構築する能力を様々な視点から簡易かつ迅速に診断することができる。
【符号の説明】
【０２２７】
１  サーバ
２Ａ，２Ｂ  クライアント端末
２０  制御部
２４  受付部
２５  表示部
２６  通信部
２７  記憶部
３１  再生部
３２  可視化図生成部
３３  タイミング解析部
３４  検索部
３５  コード重複率解析部
【図１】
2011008554.tif 000003
【図２】
2011008554.tif 000004
【図３】
2011008554.tif 000005
【図４】
2011008554.tif 000006
【図５】
2011008554.tif 000007
【図６】
2011008554.tif 000008
【図７】
2011008554.tif 000009
【図８】
2011008554.tif 000010
【図９】
2011008554.tif 000011
【図１０】
2011008554.tif 000012
【図１１】
2011008554.tif 000013
【図１２】
2011008554.tif 000014
【図１３】
2011008554.tif 000015
【図１４】
2011008554.tif 000016
【図１５】
2011008554.tif 000017
【図１６】
2011008554.tif 000018
【図１７】
2011008554.tif 000019
【図１８】
2011008554.tif 000020
【図１９】
2011008554.tif 000021
【図２０】
2011008554.tif 000022
【図２１】
2011008554.tif 000023
【図２２】
2011008554.tif 000024
【図２３】
2011008554.tif 000025
【図２４】
2011008554.tif 000026
【図２５】
2011008554.tif 000027
【図２６】
2011008554.tif 000028
【図２７】
2011008554.tif 000029
【図２８】
2011008554.tif 000030
【図２９】
2011008554.tif 000031
【図３０】
2011008554.tif 000032
【図３１】
2011008554.tif 000033
【図３２】
2011008554.tif 000034
【図３３】
2011008554.tif 000035
【図３４】
2011008554.tif 000036
【図３５】
2011008554.tif 000037
【図３６】
2011008554.tif 000038
【図３７】
2011008554.tif 000039
【図３８】
2011008554.tif 000040
【図３９】
2011008554.tif 000041
【図４０】
2011008554.tif 000042
【図４１】
2011008554.tif 000043
【図４２】
2011008554.tif 000044
【図４３】
2011008554.tif 000045
【図４４】
2011008554.tif 000046
【図４５】
2011008554.tif 000047
【図４６】
2011008554.tif 000048
【図４７】
2011008554.tif 000049
【図４８】
2011008554.tif 000050
【図４９】
2011008554.tif 000051