(更新日:2018-03-06)

制御構造における変数の値の変化や役割の理解を目的としたプログラミング学習の支援方法の研究

 本研究では,プログラミング初学者を対象として,プログラムの制御構造における変数の値の変化や変数の役割の理解を促すことに着目した研究を行っています.この目的に対しプログラムのソースコードの新しい図表現の方法を考案しました.

参考文献

制御構造における変数の値の変化や役割

 プログラムの複雑な制御構造を理解するために,プログラミング初学者を対象とした教育においては,フローチャートやトレース表などを使って表現する方法が用いられることがあります.ソースコードに対するプログラムの実際の動作を,これらの図表と共にアニメーションで提示することで理解を促そうとする試みの研究も行われています.これらの表現方法も確かに有効ですが,以下の観点で不十分であると考えられます.

(A)プログラムの全体構成の理解
プログラム内部にどのような変数,メソッド,クラスがあるかを把握しようとしたとき,フローチャートやトレース表からは把握しにくいという問題があります.
(B)全体的な処理の流れの理解
プログラムの開始から終了までの大まかな流れを把握しようとしたとき,フローチャートは理解しやすいと考えられますが,トレース表は変数の値の変化を追っていかなければならず把握困難です.
(C)プログラムにおける制御構文の(文法上の)制御構造の理解
構造化プログラミングにおける逐次,分岐,反復の3つの制御について,個々の制御が何を行っているかを理解することは,フローチャートやトレース表などを用いなくとも比較的容易です.例えば,Javaにおいて「if(x % 3 ==0)」という記述について“xが3で割り切れればtrueとなる条件分岐だ”ということを理解することは,初学者でもそれほど難しいことではありません.
(D)変数の値の変化や制御構造における役割の理解
実際のプログラムにおいては個々の変数や制御構造には何らかの役割があります.その役割を理解することは(C)を理解することではありません.変数の値の変化を踏まえながら各ステップでどのような制御をどのような目的で行っているかを理解する必要があります.この点で,変数の変化を知ることができるトレース表は役に立ちますが,処理が複雑になるほどにトレース行数が増えて把握しにくくなります.これを解決するため,フローチャートと変数モニタを組み合わせて提示する方法なども研究されていますが,ソースコードと対応付けて理解する必要もあるため,初学者には困難になりがちです.

新しい表現方法の提案

 制御構造における変数の値の変化や役割を理解するためには,変数がソースコード中のどの制御によって値を変化させたり,影響を及ぼしたりするのかを分かりやすく表現する必要があります.そのためには,変数のスコープをわかりやすく表現することも併せて必要になります.この点に着目して,本研究室では図1のような表現方法を考案しました.

 図1はProcessingによるプログラム例に対して表現されたものです.まず,図の上部には各変数を配置します.各変数から下方へ延びる縦方向の棒(青色)は変数のスコープを表しています.例えば,変数factは関数fの局所変数ですので宣言された行の位置からこのブロック内がスコープになっています.スコープには,その変数が関わるソース行に対応させるように関係行マーカを表示します.また,ソースコード上のブロックを把握しやすいように,関数をオレンジ,分岐をピンク,反復を緑で背景を塗りつぶしています.

 プログラム実行中の変数の値は,実行位置を表す赤線の上部に各変数のスコープ表現に重ねるようにして表示します.変数の値が変化したり制御に影響を与えるところでは変数の値を関係行マーカと重ねて表示します.こうすることで,変数の値の変化が直感的に把握できるようようにしています.


図1 考案した新しい表現方法

支援ツールの試作

 考案した表現方法による学習を可能にするために,Processing Development Environment(PDE)の支援ツールを試作しました.図2は試作した支援ツールの画面例です.PDE上でプログラムを作成して支援ツールを起動すると,ソースコードを解析して考案した表現方法による図が画面に表示されます.PDEのデバッガを起動してステップ実行を行うと,ソースコード上の実行中のステップに対応させながら変数の値を図中に表示します.


図2 考案した新しい表現方法に基づく支援ツールの画面例

考察および現状の課題

 本方法では,フローチャートやトレース表のような既存手法では分かりにくかった変数のスコープを表現しています.また,変数の値が変化したり,変数の値が制御に関わっている位置をソースコードと対応させてわかりやすく表現しています.このことから,前述の(A)~(C)の理解を促す効果は既存手法に比べて高いと考えられます.(D)については,本手法の表現方法から直接理解することはできませんが,(A)~(C)の理解が高まることによって(D)の理解を促進する効果も高まると考えられます.

 今後の大きな課題としては,配列の表現,クラスの表現があります.変数が多くなった場合は横方向に図が長くなるため,直感的なわかりやすさが損なわれる可能性もあります.また,現状,試作した支援ツールはPDE3.xのプラグインとして実装されています.もともとPDE3.xには,プラグインがデバッグ機能と連携できるようにするための仕組みがありません.そのため,本支援ツールの試作においては,PDEの一部コードを改変してプラグインがデバッグ機能にアクセスできるようにしました.しかしこの方法は,PDEのプラグイン実装モデルに反する形になっており,現状では開発環境(Eclipse)上での動作確認のみとなっています.この点は早々に解決していきたいと考えています.

小学校におけるプログラミングの必修化に向けて

 小学校におけるプログラミングの必修化に伴い,プログラミング教育の重要性が再認識されています.小学生でも楽しめるScratchなどのビジュアルプログラミングは,プログラムの作成を通じた論理的思考力や創造性,問題解決能力などといった資質・能力を早期に育む手段として有効であるとされています.また,今後世界的に不足するといわれているIT人材の確保のためにも,小学校におけるプログラミング教育の必修化は重要な意義を持っているといえます.

 Scratchを実際に使ってみると,簡単な画面操作でキャラクタを動かす動作を実現できることがわかります.一方,単調な動作であれば確かに容易ですが,複雑な動作を実現しようとすると配置するブロックの数は多くなり制御構造も把握しにくくなります.この点では,Scratchなどのビジュアルプログラムミングも,文字ベースで記述する既存のプログラミング言語と同様の課題を抱えているといえます.論理的思考力や創造性,問題解決能力などをプログラミングを通じて確実に育てるためには,複雑な制御構造を理解できる能力の育成が欠かせません.複雑な制御構造の理解を促すための方法は,プログラミング教育の必修化の効果を高めるためにも重要な課題であるといえます.本研究で考案した表現方法は,この課題の解決に役立つと期待されます.