事例101

プログラミングでLINEの仕組みを理解しよう

~クライアント・サーバ型の仕組みをプログラミングで体験させてみた

神奈川県立茅ケ崎西浜高校 鎌田高徳先生

この授業を行った目的は、高校生がプログラミングを使って、LINEの仕組みのすべてを理解するということではありません。生徒たちにとって最も身近な題材であるLINEを利用して、ネットワークの仕組みを考える機会にするということです。

 

本校は、神奈川県指定のプログラミング教育研究推進校の指定校です。今年の2月にプログラミング教育の授業実践を読売新聞に取り上げてもらった際には、LINEを題材にした授業例を紹介しました。高校生にとって非常に身近なLINEのトークメッセージが、どのようにして自分から友達までつながっているかということを、プログラミングを通して生徒たちがその仕組みを理解していくという授業です。今回はこの授業についてお話しします。

 

また、プログラミング教育の地域への推進を意識して、本校の生徒が近隣の小学生・中学生にマインドストームとiPadを使って、ライントレース等を教えるという活動もしています。年下の子どもたちに教えるため、生徒たちはすごくがんばって準備をするので、授業に臨む姿勢も自ずと真剣になります。

 

プログラミング「を」学ぶ、プログラミング「で」学ぶ

神奈川県の教育課程推進委員会情報部会では、2015年からプログラミングを取り入れた授業実践の研究を行っています。当時、研究推進委員に課せられたミッションが、「プログラミング教育をアクティブラーニングでやりなさい」というお題でした。その時一緒に実践研究をされたのが、相模原総合高校の大里先生と、生田東高校の大石先生でした。

 

大里先生の実践は、「『エイリアンとの交信』を題材としたプログラミングとアクティブラーニング」というものです。

 

 

プログラミング言語は、初めて接する生徒たちにとってはわけのわからないものだから、エイリアンと交信するという場面設定をして、VBAというプログラミング「を」楽しく学ぼうという授業です。

 

一方、大石先生は「暗号を解読せよ~プログラミングで学ぶ公開鍵暗号~」という授業をされました。

手計算で公開鍵暗号の解読の手順を検証した後、それをプログラミングに置き換えて自動で実行することによって、公開鍵暗号方式の解読困難性をプログラミング「で」学ぶものでした。

 

 

この2つの実践を調理に例えると、大里先生の授業は、様々な種類の包丁の中から、使いやすい包丁を選んで、その包丁を使うということを知ること。そして大石先生の授業は、調理の中で包丁をどのように使って、おいしい料理を作るかを考えることといえるでしょう。このように、「プログラミングを教える」と「プログラミングで教える」ということを、バランスよく行っていく必要があるのかなと思います。

 

こうした流れを受け、私は昨年度の全国大会で、「2進数から10進数の変換をプログラムで学ぶ」というプログラミング言語ドリトルを使った実践を発表しました。

 

発表の後に「なぜドリトルを使うのか? Excelで表計算すればよいのではないか」「わざわざプログラミングしなくても、紙の計算だけで十分ではないのか」という質問をいただきました。

その時は、それもそうかな、と思いましたが、やはりプログラミングを使う必要性があるという考えに至りました。

 

表計算というのは、プログラムという大きな枠組のごく一部です。ハンバーグを調理することにこのことを例えれば、Excelの基数変換は、冷凍ハンバーグをボイルしただけというイメージですが、それに対してプログラムの基数変換はハンバーグをゼロから作るイメージです。ハンバーグを作る過程で、材料を集めるところから始め、集めた材料を切ってこね、そして焼いて作るようなものです。ですから、求める値が出てくる裏でどのような仕組みが動いているのかを理解するためには、やはり自分の手でプログラムを書いてみることが必要ではないかと考えました。

 

また、手計算で何となく行っていた手順を、プログラミングという全く違うものに置き換えて、手順をもう一回組み直すからこそ、深い学びにつながるということもあると思います。自分が考えた手順をプログラミングの手順に置き換えて、見通しを持った試行錯誤することに意味があり、そこが深い学びにつながるのではないかと感じています。

 

それらを踏まえた上で、具体的な授業について説明していきたいと思います。

 

生徒にいちばん身近なLINEを題材にする

昨年度本校では、全国大会で発表した基数変換の授業、大石先生が発表された公開鍵暗号方式をプログラミングで体験する授業、そしてクライアント・サーバ型システムの役割をプログラミングで体験しようという、3つのプログラミングの授業を行いました。

 

 

「クライアント・サーバ型」というのは、指導要領にも書いてありますし、教科書にもしっかり載っています。でも、どうやって教えたらいいのか、という点に頭を悩ませている先生方も多いのではないでしょうか。情報の先生方に聞いてみても、「文言しか教えていない」「仕組みをどのように体系的に教えればいいかわからない」という声が、けっこうありました。それなら、これを研究授業としてやってみようと思ったわけです。

 

しかし、ネットワークの仕組みを体系的に教えるのはすごく難しくて、本当に試行錯誤の日々でした。考え抜いた末にLINEを題材として、クライアント・サーバ型を教えることにしました。なぜなら、高校生はみんなLINEを使っているので、身近な題材で、より興味を持ってもらえると思ったからです。

本当はLINEでなくてもいいのですが、何のためにプログラミングするのかを理解する上で、生徒の興味を引くきっかけとしてLINEを用いました。

 

授業の最初に、「あなたの端末から友達の端末まで、LINEのトークのメッセージはどうやって届いていると思う?」という問いかけをすると、生徒たちは、端末から端末まで、一直線でつなごうとします。

本当は、間にサーバが入らなければならないのですが、サーバという概念がわかっていたのは、わずか1割程度でした。ほとんどの生徒が、自分のLINEのトークや画像が友達に直接届いているものだと思っていて、違う所に保存されているということを知らないのです。

 

LINEのトークメッセージは、発信した人からいったんLINEのサーバに送られ、友達のプッシュ機能などが送ってほしいと要求して受け取るという形の、クライアント・サーバ型でやりとりをしていますが、この事実に、生徒たちはなかなか気づきません。

 

「サーバって、そういえばゲームの『サーバメンテナンス』とかある、あのサーバですか」というレベルでした。ここで例示しているLINEトークメッセージの仕組みは、実際の仕組みを簡略化してモデル化しています。

 

ポイントは「送信役」「サーバ役」「受信役」の3つを設定すること

では、このサーバの仕組みをどのように教えたらよいのか。そこで、モデル図を描いて、これを理解した上で、プログラミングを行うという手順を踏むことにしました。

 

まず、クライアント側(送信者)がサーバにメッセージを送って、サーバはそれを受け取ります。この時は、受け取るだけです。そして、別のクライアント(受信者)がメッセージを要求したら、受信者にそのメッセージを渡すという形で、この2つの手順をプログラミングします。

 

今回この授業実践がうまくいったのは、役割を送信役・サーバ役・受信役の3つに分けたことがすべてと言ってもいいでしょう。

 

 

具体的な授業の方法です。生徒を3人一組にして横に並べ、真ん中の人をサーバ役とし、左右に送信役と受信役を置きます。

役割が決まったら、全員ip configを打ち、IPアドレスを確認します。今回はサーバ役のIPアドレスに全員接続するため、全員に配布したLINEのドリトルのコード6行目、図中のxxxになっているところを、サーバ役のIPアドレスに打ち直し、サーバ役だけが、ドリトルの「サーバ」というボタンをクリックしてサーバとなります。ここまでは全員で作業しますが、ここからは、それぞれ別々の作業になります。

 

まず、送信役が、9行目から10行目のプログラムを実行します。送信ボタンを押したらサーバに、”msg”(メッセージ)というデータの中に、「こんにちは」という文字列を書き込んで送ってもらいます。つまり、サーバに向けて「こんにちは」というメッセージを送るプログラムを実行させるのです。送信役の役割は、これでおしまいです。

 

次にサーバ役が、サーバのボタンをクリックすると、先ほど送信役が送った「こんにちは」というメッセージが届いているのかどうかがわかります。

 

送信役からサーバ役のパソコンに、「こんにちは」というこの一言が届くだけで、生徒たちは「おーっ」と、盛り上がります。普段、LINEで同じことをしているのに、仕組みがわかるとメッセージが送られるだけで盛り上がります。

 

次に、受信役が、この13行目から16行目に「サーバに送られたメッセージを受け取る」ためのプログラミングを行い、実行する指示を出します。これで、送信者が送ったメッセージがサーバを経由して、受信者に届きます。

 

役割を3つに分けたのと、それぞれ違うプログラムを書くこと、つまり、違う活動を行うことで、一連の流れが体験できました。

 

その後、「送信ボタンを改良しよう」「受信ボタンを作ろう」という、次の段階に進みます。いきなり全部作るのではなく、最初に役割を分けてその流れを確認した後、送信ボタンや受信ボタンの機能を改良し、さらにうまく動くようにしていきます。このように、一つずつ流れを確認して、プログラムを少しずつ書き換えるごとにどのように実行結果が変わったか毎回確認させるという段階を踏んだことで、生徒たちもしっかり理解できたのではないかと思います。

 

最後に、「先生がみんなのサーバ役になるから、同じIPアドレスを打ち込んで先生にメッセージを送ってみよう」ということを行いました。

 

今までは3人一組だったのが、40人が一斉に、一箇所のサーバへメッセージを送るわけです。これをモニターで表示すると、そのうちに友達の名前で書き込む生徒が出てきます。いわゆる「なりすまし」です。そこから、セキュリティの大切さについて、体感することもできます。

 

このようにしてサーバの特徴を生徒が理解したあと、今度は、いきなりサーバを落としてみます。当然、生徒たちは「先生、急につながらなくなった!」と騒ぎますが、そこで「これってサーバメンテナンスなんじゃない?」などという声もあがってきます。

 

一通りサーバの流れを体験させた上で、「サーバが落ちたら、ゲームとかできなくなるよね。ゲームなどのアプリもアップデートする時にサーバを落とす必要があるんだよ」と、口頭で簡単に説明をします。

 

また、LINE の「トーク」は確実性を重視しているから、クライアント・サーバ型を使うけれども、「通話」の方は、タイムラグがあると困ります。

 

 

そのためLINEの1対1の音声通話は、多少ノイズがあってもスピード性が求められるため、「P2P」という、サーバを通さない方式を用いているということも話しました。

 

プログラミング教育の評価をどうするのか

この授業の評価ですが、プログラミング教育の中で、コードの評価だけをしていても不十分だと思います。生徒からも「友達のコードを写させてもらえば、同じ評価になるのがおかしい」という声があがり、それなら、プログラミングでクライアント・サーバ型を理解できたかということを評価すべきという結論に至りました。

 

そこで、この授業を行ってから、試験期間をはさんで2週間後に、ネットワーク図を書くというテストをしたところ、生徒たちはものの見事に忘れていました。

 

最初にやったときは9割の生徒が書けなかったので、それよりは多少前進したのですが、サーバを書いていても矢印の流れがうまく書けていないなど、なかなか苦心しているようでした。

 

このように、復習テストをやってみて、プログラミングでもコード以外の評価が必要だと、改めて考えさせられました。評価というのは、生徒が受け取ったときに、納得できる評価であることが重要です。コードを書いてもらうのも確かにいいのかもしれませんが、それだけではない形の評価も考えていかなければいけないのかなと思っています。

 

プログラミング「で」学ぶことから広がる可能性

生徒による気づきを書いてもらったのですが、意外と、こちらが思う以上に、様々な書き込みがありました。「友達のIPアドレスを知らなくても、サーバだけのIPアドレスがわかれば通信できる」と書いた人もあり、これについては、よく気づいたなと感心しました。

 

また、「サーバにみんなの書き込んだデータや画像のデータが蓄積されてあるということがわかって、データを集めることの意味を考えさせられた」という感想もありました。この気づきは、データサイエンスに発展させていけるとよいなとも思います。

 

下図は、去年の「基数変換」と今年の「クライアント・サーバ型」の授業をどの程度の生徒が理解したか、その割合を比較した表です。今年は「理解した」の割合が増えていて、特にクライアント・サーバ型の理解が75%と高かったので、さらに改良して、よりわかりやすい授業にしていきたいと思っています。

私自身、プログラミングを授業でやるのは、授業が楽しくなるからです。プログラミングを使って、クライアント・サーバ型の仕組みを試してみたら楽しかったわけです。プログラミングを「楽しく学ぶためのツール」として、授業設計をしてもいいのではないかと思っています。

 

そしてプログラミングは、自分で考えた手順をプログラムに置き換えるということなので、いい意味での試行錯誤が生まれる可能性があります。体験的に仕組みを理解するには、もってこいなのではないでしょうか。そのためには、「教師自身が教えることに深い学びがないとダメ」だと思います。これは、神奈川県のある先生の受け売りの言葉ですが、情報科の先生たちが、より教材について深く学ばないといけませんね。

 

これからも「プログラミングで情報の科学的理解を深めること」を目指してさらに実践を重ねていきたいと思っています。

 

今回の教材は、すべてWebサイトにアップしております。ぜひご覧になってください。

情報科eポートフォリオ

https://sites.google.com/site/johoeportfolio/

 

質疑応答

高校教員A : 大変参考になるお話でした。「コードを評価しない」というところは、なるほどなと思いました。クライアント・サーバ型を理解したかどうかを、どのように評価されているのでしょうか。

 

鎌田先生 : 最初に配った端末とサーバだけが描いてあるプリントで、自分のメッセージが、友達まで届くまでの流れが正しく描けているかどうかで評価します。

まず、送信者がメッセージをサーバに送り、受信者が受け取るときにサーバにメッセージを要求して受け取る、この一連の流れが描けていれば、クライアント・サーバ型の仕組みは理解できていると判断できます。クライアント・サーバ型は、受信者が要求してからメッセージを送るというところがポイントです。

 

高校教員A : もう一点伺いたいのですが、LINEの説明では、メールが飛んでいくようなイメージになっていますが、実際のLINEとは、若干違うような気がします。生徒たちが抱く概念と、実際がずれているところは、どのように説明したらよいのでしょうか。

 

鎌田先生 : 今回は、「メッセージは端末から端末へ直接行き来しているわけではない」というところに主眼を置いたので、複雑にならないよう、あえて簡略化しました。今回の学習では、ここまででよいと思っています。

 

高校教員B : 「プログラミングで学ぶ」というのが素晴らしいと思ったのですが、「プログラミングを学ぶ」というのも、最初にある程度必要だと思います。この授業の前に、プログラミングをどこまで学んでいってここにつながっているか教えてください。

 

鎌田先生 :  1学期ではドリトルで四則演算を行う演習をして慣れさせています。また、先ほど紹介した2進数から10進数への基数変換のプログラムの学習をしていて、そこでもドリトルを使いました。ドリトルの使い方はある程度わかるという状態で、この授業に臨みました。

 

第11回全国高校情報教育研究会全国大会事例発表より