基本情報技術者試験の勉強をしていると、科目Aはそれなりに進められたのに、科目Bになった途端に難しく感じることがあります。
特にプログラミング未経験の場合、変数の値を途中で見失ったり、for文が何回繰り返されるのか分からなくなったり、配列が出てきた瞬間に混乱したりすることもあると思います。
私自身、以前後輩に基本情報技術者試験の擬似言語を教えていたときに、この難しさを感じました。
現在は、その経験をきっかけに、擬似言語をブラウザ上で実行しながら学べる「Giji Academy」という学習サイトを作っています。
今回は、なぜこのような学習サイトを作ったのか、そして擬似言語を実際に動かすことで何が変わるのかについて紹介します。
擬似言語は実際に動かせないのが難しかった
Pythonを勉強するときであれば、分からないコードがあっても、その場で実行して確認できます。
たとえば、次のようなコードです。
x = 3
x = x + 2
print(x)
実行すると、結果はすぐに確認できます。
5
もし自分が予想していた結果と違っていれば、コードを見返して、どこで値が変わったのかを確認できます。
JavaScriptやJavaなど、ほかのプログラミング言語でも基本的には同じです。コードを書いて実行し、結果を見ながら理解していけます。
一方、基本情報技術者試験で使われる擬似言語は、問題に書かれたコードを読んで、自分で処理を追っていくことが中心になります。
たとえば、
x ← 3
x ← x + 2
という処理があれば、最初にxへ3を代入し、そのあと現在のxに2を足した値を、もう一度xへ代入します。
そのため、最後のxは5になります。
このくらいであれば、頭の中でもそれほど難しくありません。ただ、ここに条件分岐や繰返し、配列などが組み合わさってくると、一気に追うのが難しくなります。
- 今の変数はいくつなのか
- 条件式は成立するのか
- ループは今何回目なのか
- 配列のどこを見ているのか
こうしたことを一つずつ確認しながら読み進める必要があるからです。
私も後輩に教えていたとき、ここで変数がこの値になって、次のループではこう変わって……と説明していました。
ただ、口頭だけで説明してもなかなか伝わりません。もちろん私の説明の仕方にも問題があったと思いますが、そもそも実際の動きを見せにくいことが、擬似言語を教える難しさの一つだと感じました。
当時はPythonに書き換えて説明していた
そこで当時は、擬似言語の処理をPythonに置き換えて説明することがありました。
たとえば、ループの中で変数がどのように変わっていくのか分からない場合は、似た処理をPythonで書いて実行します。
1回目: x = 2
2回目: x = 4
3回目: x = 6
このように実際の値を表示すると、コードだけを眺めているよりも、かなり理解しやすくなります。
ただ、この方法にも少し問題がありました。
勉強したいのは擬似言語なのに、説明するためにPythonのコードを読まなければいけないからです。プログラミング未経験であれば、擬似言語とPythonという2つの書き方を見ることになってしまいます。
教える側も、擬似言語で書かれた処理を毎回Pythonへ置き換える必要があります。
それなら、教材に書かれている擬似言語をそのまま実行できた方が分かりやすいのではないか。
そう思ったことが、Giji Academyを作ったきっかけの一つです。
教材を読みながら、そのままコードを実行できるようにした
Giji Academyでは、教材を読みながら擬似言語を実行できるようにしています。
基本的な学習の流れはシンプルです。
- 教材を読む
- コードの実行結果を予想する
- シミュレーターで実行する
- 結果を確認する
- 分からなければ教材やコードに戻る
この中でも、個人的には実行する前に一度結果を予想することが大切だと思っています。
たとえば、
x ← 3
x ← x + 2
というコードを見たら、すぐに実行するのではなく、まず自分で結果を考えてみます。
5になると予想したら、実際に実行して確認する。予想どおりであれば次へ進み、違っていればどこで考え方がずれていたのかを確認します。
これを繰り返すことで、コードを眺めながら答えを覚えるのではなく、自分で処理を追う練習ができます。
科目Bではコードをトレースする力が大切
科目Bを勉強していて感じるのは、アルゴリズムの仕組みを覚えるだけでは、なかなか問題を解けるようにならないということです。
たとえば二分探索であれば、中央の値と比較して探索範囲を半分ずつ狭めていく、という仕組み自体はそれほど難しくありません。
ただ、実際の問題では、その仕組みを知っているだけではなく、書かれているプログラムを読まなければいけません。
現在の変数はいくつなのか、配列のどこを見ているのか、条件式が成立するのか、次にどの処理へ進むのか。
こうした内容を一つずつ追っていく必要があります。
二分探索の問題が分からない場合でも、原因が二分探索そのものにあるとは限りません。実は配列の添字を追えていなかったり、while文の条件を読み違えていたりすることもあります。
そのため、いきなり難しいアルゴリズムを解くよりも、
1.変数
2.条件分岐
3.繰返し
4.配列
5.関数
6.アルゴリズム
くらいの順番で、基礎から少しずつ進めた方が理解しやすいと考えています。
基礎からアルゴリズムまで学べるようにした
Giji Academyでも、最初から探索やソートなどの問題を解くのではなく、基本的な処理から順番に学べるようにしています。
現在は、次のような内容を学習できます。
- 変数
- 演算
- 条件分岐
- 繰返し
- 配列
- 関数
- 再帰
- 線形探索
- 二分探索
- ソート
- スタック
- キュー
プログラミング経験者であれば、前半はかなり簡単に感じると思います。
一方で、プログラミング未経験から科目Bを勉強する場合、この基礎部分を飛ばしてしまうと、後半のアルゴリズムで急に分からなくなることがあります。
たとえば、for文を知っていることと、実際のコードを見て何回繰り返されるのか、そのたびに変数がどう変化するのかを追えることは少し違います。
そのため、教材を読んで終わりではなく、自分でコードを動かしながら確認できるようにしています。
解説を読んで分かるのに、自分では解けない
科目Bを勉強していると、解説を読んだときには理解できたのに、次の日に似た問題を解くとまた分からなくなることがあります。
これは珍しいことではないと思います。
解説には、変数がどのように変化したのか、条件分岐でどちらへ進んだのかなど、答えまでの流れがすでに整理されています。そのため、読んでいると内容を理解しやすいです。
一方で、実際に自分で問題を解くときには、その流れを自分で見つけなければいけません。
特に擬似言語では、現在の変数の値を確認しながら、条件式の結果やループの回数、配列の位置などを順番に追っていく必要があります。
これをすべて頭の中だけで処理しようとすると、途中で分からなくなりやすいです。
そんなときは、短いコードから自分でトレースしてみるのがおすすめです。紙に変数の値を書き出したり、ループするたびに値がどう変わったのかをメモしたりするだけでも、処理の流れが見えやすくなります。
そこに実行環境があれば、自分で考えた結果が合っていたのかもすぐに確認できます。
予想して、実行して、間違っていたらもう一度コードを見る。
この流れを手軽にできる環境があれば、擬似言語ももう少し分かりやすく学べるのではないかと考えました。
まとめ
以前、後輩に基本情報技術者試験の擬似言語を教えていたとき、Pythonであればすぐに実行できるのに、擬似言語は実際の動きを見せにくいことに不便さを感じていました。
そこで、教材を読みながら擬似言語をそのまま実行できる環境があれば分かりやすいのではないかと思い、Giji Academyを作りました。
科目Bでは、アルゴリズムや答えを覚えるだけではなく、コードを上から読みながら、変数や条件、繰返しの動きを一つずつ追っていく力が必要になります。
参考書を読んでもなかなか理解できない場合は、紙に値を書き出してみたり、短いコードを実際に動かしてみたりするだけでも、かなり理解しやすくなると思います。
Giji Academyでも、教材を読む、コードの結果を考える、実際に実行する、練習問題で確認する、という流れで学習できるようにしています。
擬似言語のコードを読んでも何をしているのか分からないという方は、まずは短いコードを実際に動かすところから始めてみてください。
インフラエンジニアの学習サイトInfraAcademyも興味ある方はぜひ!
