事例138
差し迫る言語選択! C? JavaScript? Python?
横浜市立横浜総合高校 康 允範(かん ゆんぼむ)先生

私は、大学時代は実験心理学を学んでいたため、いわゆる「The 情報系」の出身ではありません。「感覚知覚」や「認知」という人の五感や記憶などがどのようにして脳で処理されるかという、人間の情報処理を専門としていました。学部を卒業後はインフラ系SEとして民間企業に勤め、大学院で再度実験心理学を学んだ後、私立高校で専任講師を勤めました。そして現在は横浜市立の教員として横浜総合高校にいます。総合学科の学校であるため、普通科とは異なり様々な授業があります。
高校での言語選択、いま直面する課題
さて、皆様はこんな悩みをお持ちではないでしょうか。情報Ⅰに向けての準備をしないといけないけれど、まだできていない。プログラミング教育が必修になったけど、どんなことをやれば良いのかわからない。プログラミングを授業に取り入れたいけれど、どこをゴールにしたら良いかわからない。高校でのプログラミングは、何だか大変そうで手を付けられない。

そんな悩みにお答えするために、今日のお話は次のことをゴールにします。一つ目は、高校教育で扱うプログラミング言語の選択材料を得ていただくこと。二つ目は、プログラミングを学ぶ上で押さえるポイントの参考材料を提供すること。
この二つです。

こちらは、情報科における文科省の方針を私なりに解釈したものです。一番大きな柱は情報活用能力を育むという点で、情報技術を適切かつ効果的に活用し、さらに新たな情報に再構成することにつなげていきます。プログラミングは、この「情報技術の適切かつ効果的な活用」に用います。

具体的には、情報技術を使って情報を得たり分析したりしたものから問題を発見し、解決につなげるという「問題解決」でプログラミングを用います。
そして、この問題解決で得られた情報から新たな問題を発見し、解決へ挑むという流れが「探求」なのではないかと思います。高校の学習指導要領における情報科やプログラミング教育の中では「探求」、そして「活用」という文字を非常に多く見ることができます。
しかし、実際のところプログラミングの「活用」は難しいものです。授業時間内では、教科書のソースコードを打たせて動きを確認し、体験するだけで精いっぱいになりがちです。予定通りにプログラムが動かない生徒を、プログラミングやタイピングが得意な生徒が助けて、ほとんど全部やってしまうということもあります。そもそもキーボード入力すらおぼつかない生徒もいます。さらには、正直、プログラミングに自信がないという先生もいらっしゃいます。
そのため、活用なんて夢のまた夢という学校も多いのではないかと思います。そんなところにも、一つの道筋を作れたらと考えています。

ゴール設定と対象の重要性
そこで大事になるのが「ゴールをどこに置くか」ということです。
こちらのスライドの一覧は、上に行くにつれて難度が上がります。プログラミング教育で一番に目指すところは「探求に活用できるようになる」ことです。

上から2番目の「ソースコードが読めるようになる」ことができれば、インターネット上のソースコードを参考にしたり、自分の中に組み込んだりすることができ、様々な場面で役立てることができます。また、「大学や専門学校へつながるプログラミング」は、基本制御構造や順次、繰り返し、分岐などができるというレベルです。
これらに加え、「ソースコードを書けるようになったかも!体験」や、「プログラミング的思考を育む」、「プログラミングに興味を持ってもらう」といったゴールを単元の中でどこに置くのか。そのゴールを達成するために何の言語を使うか、どのような内容で行うか、誰を対象にするかで授業内容は大きく異なります。カリキュラムマネジメントにも関わってきます。
さて、問題の「どの言語を用いるか」ということですが、文科省より提供されている教員向け研修教材には、「言語の選択は自由」とされています。
では、先ほどの「ゴール」のお話にも出てきた「探求」に活用するためにはどのようなものが有効でしょうか。探求に活用するためには統計処理が必要となることも多いでしょう。また、プログラミングでシミュレーションなども行いたい。さらに、AIやビッグデータというキーワードも絡んできます。

そのような時、Scratchやドリトルなどのビジュアルプログラミングで、問題解決への活用や統計処理まで十分まかなえるでしょうか。C言語系、JavaScript、Java、Pythonなどが適しているかもしれませんが、プログラミングで扱う必要があるのでしょうか。表計算ソフトで十分ではないか。では表計算ソフトにプラスアルファのVBAでも良いかもしれません。しかし、VBAはAIやビッグデータにつながるまでの活動に適しているでしょうか。
プログラミングの授業実践
こちらが今まで私が実際に使用してみた、あるいは使用を予定している言語です。
まずJavaScriptとC言語です。
JavaScriptは手軽で、かつWEBページ作成にも活用できるので、生徒は自宅でも楽しんで取り組んでいます。jQueryなどの拡張やライブラリも無限大ですから、どんどんカスタマイズしてパーツを作ることが可能です。

また、プログラミングの基本と名高いのはC言語で、私自身も大学院生時代に学びました。コンピュータがどのように動くかの基礎がよくわかりますし、基本的には何でもできるのが特徴ですが、細かい制御をしなければならない面もあります。
Pythonは、ご存知のように最近注目を浴びている言語で、今後我が校でも実施を予定しています。手続き型もオブジェクト指向型も可能で、AIやビックデータの処理でも期待ができ、統計処理もそれなりに手軽にできるため、「良いとこ取り」のように思えて期待しています。
プログラミングで数当てゲームを作る
授業では数当てゲーム「ヒット&ブロー」を作りました。
三つの数を順番通りに当てられたら正解というもので、解答者は三つの数を答え、出題者は「ヒット」「ブロー」という言葉でヒントを出していきます。「ヒット」なら数も順番も正解。「ブロー」なら正解の中にその数が含まれていますが、順番は合っていません。最終的に3ヒットを目指します。

例えば、正解が「2,4,9」であるとします。
1回目の答えが「2,1,3」なら、『1ヒット0ブロー』。「2,1,3」のどれか1つの数が順番も数も当たっているということです。今回の場合では、「2」がその数となります。

2回目の「5,6,7」は、『0ヒット0ブロー』。つまり、正解に「5,6,7」は含まれていないということになります。3回目の「8,2,0」は、『0ヒット1ブロー』。「8,2,0」のどれか1つの数が正解に含まれています。しかし、その数の順番は当たっていないということです。今回の場合では、「2」がその数となります。4回目は、ここまでの回答の結果を考え合わせて、『3ヒット』で正解となっています。
このゲームを授業内でJavaScriptやC言語を用いて作ってみましたので後程紹介します。
数当てゲームを作成する上での学びは、「順次、繰り返し、分岐」の基本制御構造の習得です。カスタマイズが利き、生徒のレベルに応じて追加課題が与えられることがメリットです。
プログラミングの授業で難しいのは、生徒による進捗が大きく異なる点です。それでもコツをつかむと、複雑な課題にも試行錯誤しながら取り組めるようになります。ここが非常に重要だと考えています。

授業では、まずアルゴロジック2(※)でアルゴリズムをゲーム感覚で習得します。生徒たちはみんなこれが大好きで、楽しく取り組みながらプログラミングの基本的制御構造を体験します。その後、数当てゲームの作成に移ります。

JavaScriptを用いた授業は、前任校の2年生を対象に行いました。外部の大学進学を目指すコースと帰国子女が多いコースで、偏差値としては高めのクラスでした。「情報の科学」の8コマを使用して行いました。
エディタはサクラエディタ、コンパイラはブラウザとしてIEを使用しました。

授業のゴールは、「基本制御構造を理解し、物事を手順化できるようになる。つまり、基本的なプログラミングができるようになる」というものです。プログラミング的思考を育み、プログラミングができるようになった体験を喜び、プログラミングに興味を持ってもらうことも大事にしました。

JavaScriptを使用した授業で良かったのは、環境構築が楽で、エディタとブラウザのみの使用のため手軽という点や、ネット上に情報が多いことや関数が豊富であることなどです。エディタを工夫すれば、もっと手軽だったと感じています。
一方で、ブラウザによって挙動が若干異なる点や、デバッグ機能・補完機能が不十分である点はデメリットだと感じました。

次にC言語を用いた授業です。
横浜総合高校の2年生から4年生が対象です。本校は単位制の総合学科であり、最長で6年生まで在籍することが可能な定時制となっています。就職と進学が半々で、進学は専門学校が大半です。大学進学の場合は推薦入試を多く活用しています。
総合学科ということもあり、『アルゴリズムとプログラム』という専門科目で、25コマというかなり多めに時間を取ることができました。

エディタとコンパイラは、C machineを使用しました。既に開発が止まってしまっているものですが、改変しなければ再配布可能とのことなので、ご自身で検索して使ってみていただけたらと思います。

C言語を用いた授業のゴールがこちらです。
25コマあったため、ソースコードが読めるようになりました。C言語の基礎的な内容は大学や専門学校へつながる内容で、活用もできるようになります。
ただ、探求までには至らず、ゲームを作ることに終始してしまった感はあります。

C言語の良かった点です。
まず環境構築が楽でした。C machineはインストールが不要で「.exe」で動き、エディタとコンパイラの両方の機能を有しています。また、C言語はネット上にヒントになる情報が多いこともメリットでしょう。

一方、データ型の細かい制御や、プリプロセッサ命令が必要なのが難点です。また C machineは補完機能がなく、関数も少なめです。全体的に、C言語であるため良くも悪くも制御が細かいという印象です。
プログラミングで何が大切なのかを考える
一連の取り組みを通じて、何が大切かを考えると、明確なゴールを設定することであると思います。
「プログラミングスキルを身に付ける」だけではゴールとしては不十分です。大切なのは、プログラミングを通してどのような力を育むか、そして活用につなげるかです。

もちろん、そのためには対象や環境を考慮する必要があり、定時制高校ではそれなりに大変ではありますが、動機付けをきちんとして、環境を整えることで、生徒たちはかなりのところまで実現していけます。自主的に家で取り組んで、見せに来てくれる生徒もいます。
また、小学校・中学校との連携も大切だと考えています。できれば、高校までにここまでは経験してきてほしいのは次の点です。
まず、フローチャートが書ける程度の基本制御構造の理解。また、タイピングやマウス操作、ファイルの複製や移動などのPCの基本スキルの習得。他にも、ビジュアルプログラミングを経験した上で、プログラミングの概要を理解することなどです。もちろん、私たち高校側からの働きかけも重要だと思っています。

ここまでの話を踏まえて、私がもしこれから取り組む立場なら選ぶ言語はPythonです。理由は、AIやビッグデータ、統計処理にも使えることに加え、思いのほか手軽だからです。しかし、HackerRank Developer Skills Reportによると、2019年に開発者が学びたい言語ランキングでPythonは1位ではなく3位です。

つまり、言語というものは新しいものが次々に開発されて世に出てくるため、10年間続く学習指導要領の中で言語設定はしないほうが良いでしょうし、そのときどきに応じた学びを、生徒も教師も頑張って続けていく必要があるということです。
今後、プログラミング教育を受けてきた生徒たちが高校生になっていく中で、ゴールと対象のレベルも高くなってくる。そんなことを見据えながら、Pythonを今のうちから始めておくことが有効なのではいないかと提言します。
※神奈川県高等学校教科研究会情報部会 情報科実践事例報告会2019 口頭発表より