やわらかテック

興味のあること。業務を通して得られた発見。個人的に試してみたことをアウトプットしています🍵

ビジュアルプログラミングを卒業した後に覚えたいプログラミング言語

プログラミングを学ぶ背景

2020年より小学校ではプログラミングが必修化されて、必然的に小学校を卒業するまでに生徒たちはプログラミングを学ぶことになります。

www.mext.go.jp

小学校でのプログラミングが必修化されている目的として「プログラミング的思考力」を鍛えたいという点があります。「いや、プログラミング的思考力って何やねん」というツッコミはおいておいて、実際に小学校で取り入れている、もしくは小学生が自身で学ぶ場合のプログラミング教育の実例をいくらか見てみました。
事例として多いのは「ビジュアルプログラミングを用いて総合的な時間や既存教科に合わせた取り組み」といったケースです。

miraino-manabi.jp

miraino-manabi.jp

既存のカリキュラムに対してより理解を深めてもらうためにプログラミングを用いて授業を進めているそうです。例として上がっているのは正三角形の描画をビジュアルプログラミングを用いて行うものでした。
良い時代になりましたね。自分が小学生の時は分度器と定規を使って、正三角形を作業的に作図した記憶がほのかに残っています。

また2021年には中学校でも、既存のカリキュラムを見直し「双方向ネットワーク」という要素を重要視したプログラミング教育の授業を行なっていきたいという旨を政府が公開しております。すでに取り組みを始めている中学校も多いようです。

ビジュアルプログラミングを終了した後の流れがない

最近はプログラミング教育に関する資料や書籍、情報によく目を通すようにしているのですが、気になった点があります。すでに課題として多くの有識者が意見を述べていますが、改めて。

それは「ビジュアルプログラミングで学んだ後に実際のプログラミング言語を学ぶための導線がない」という点です。小学校でプログラミングが必修化されたことで多くの生徒がビジュアルプログラミングでの体験をすることになります。しかしながら、中学校に進学して、より難易度が高いであろうプログラミング言語の記述に触れられる機会は少ないようです。

当時の私の記憶では、技術の時間にOfficeを使った簡単なパソコン操作と、タッチタイピングがあった程度でした。またICT支援員と呼ばれるプログラミング教育を支援する人材が不足していることも問題の1つです。

現場教員のインタビュー記事をいくらか拝見しましたが、上記のような問題を解決するために壁となっている要因として多いのは以下の通り。

  • プログラミング言語を用いた教育が行える環境が整っていない -> eg: ブラウザが使えない
  • 指導できる教員がいない -> ICT支援員の不足
  • 何をしていいのか分からない -> 正三角形をプログラミング言語を使って書くのは面白いのか
  • プログラミング言語の文法の理解 -> 変数だの分岐処理だの繰り返し処理だの...

プログラミング言語を記述するということ

ビジュアルプログラミングと実際にプログラミング言語を用いてプログラムを書くという作業は本質的な部分、作業を細分化して列挙していくという部分では共通する部分があるでしょうが、その性質は異なるといっていいでしょう。

先ほども壁となっている要因としてあげたように、プログラミング言語を使いこなすためには言語特有の文法を理解して、変数分岐処理繰り返し処理といった基本的なプログラミング言語の動作に関する知識と文法への理解が必要になってくるでしょう。

また、記述をすすめる中でエラーとなり思ったように動かないことも当然あるでしょう。その時にはなぜ動かないのかをスタックトレースと呼ばれるエラーログから追う必要があります。エラーログを追う作業は現役のエンジニアであっても、初心の頃に1年程の時間をかけて感性を磨いていくものです。ましてやエラーログはほぼ全て英語で記述されており、プログラミング言語特有の概念であったり、単語が頻出する場合もあり、英語に対しての理解があっても解読が難しいこともあります。

では、この作業を小学校でビジュアルプログラミングを学んだ生徒たちが中学校に進学した後に行えないかと言うと、決してそうではないと思います。実際に、小学生や中学生であってもプログラミング言語を使いこなし自分の好きなものを作っている方は多く存在していますし、学生の好奇心にはいつも驚かされます。

しかしながら、決して難易度が低いとは言えません。最初に選択するプログラミング言語が非常に重要になります。
ご存知の方も多いでしょうがプログラミング言語には様々なものがあり、それぞれ難易度も性質も大きく異なります。今回は、ビジュアルプログラミング言語を学び終わり、中学校に進学した時点などでのオススメの初めて学ぶプログラミング言語を紹介したいと思います。

私は大学3回生時にプログラミングを独学で学び、挫折と学習を繰り返し、いくらかの言語を経験してきました。また、中学生の時にC言語と呼ばれるプログラミング言語に挫折したこともあり、何が躓くポイントになり得るかを理解していますので、参考になれば幸いです。

おすすめのプログラミング言語

Pythonについて

今はプログラミング言語と聞いてPythonの名前が上がらないことは考えられないでしょう。10年程前までは日本でPythonは習得すべきプログラミング源として見向きもされていませんでした。しかしながら、近年、人工知能(機械学習)に対して世間の注目が多く集まっており、実際に多くの人工知能のモデルはPythonで記述されています。なぜPythonが使われているかというと、Pythonから使用可能な数値計算のライブラリ(利用可能な便利ツール)が非常に豊富であり、GoogleFacebookなどが実装言語としてPythonを採用しているため非常に大きなコミュニティが形成されています。

f:id:takamizawa46:20200328133010p:plain

プログラミング言語の選択として大きなコミュニティが存在していることは非常に重要です。コミュニティが大きければ大きいほど、多くのライブラリが開発され、機能が日々アップデートされていきます。また、入門者向けのコンテンツが非常に充実しやすいという点があります。

その点ではPyhtonは初心者が様々なレベルで学び始めるための整備が非常に進んでいます。日本語の情報も多く、思ったように動作せずに困っている時に役立つ情報が見つかりやすいという点もあります。

Pythonの文法について

Pythonはインデントという空白を使用して記述するため、多言語の{を使用して記述する形式と比べて可読性が良いと言われています。実際にサンプルのコードを用意したいのでご覧になってみてください。{を使用するGolangPythonで同じ処理を記述しました。

Golang

package main
import "fmt"
func main(){
    // Your code here!
    
    for n := 0; n < 5; n++ {
      fmt.Println("-->", n+1, "回目の実行を開始します")
      for m := 0; m < 3; m++ {
        fmt.Println("ただいま", n+1, "回目の",  m+1, "番目の実行です")
      }
      fmt.Println("------------")
    }
}

Python

# 5回の処理を繰り返す -> 合計15回
for n in range(0, 5):
  print(f"--> {n+1}回目の実行を開始します")
  # 10回の中で3回ずつ繰り返す
  for m in range(0, 3):
    print(f"ただいま{m+1}回目の{n+1}番目の実行です")
  
  # 見やすくするために出力
  print("-------------")

どちらも以下のような結果を出力します。

--> 1 回目の実行を開始します
ただいま 1 回目の 1 番目の実行です
ただいま 1 回目の 2 番目の実行です
ただいま 1 回目の 3 番目の実行です
------------
--> 2 回目の実行を開始します
ただいま 2 回目の 1 番目の実行です
ただいま 2 回目の 2 番目の実行です
ただいま 2 回目の 3 番目の実行です
:
:
--> 5 回目の実行を開始します
ただいま 5 回目の 1 番目の実行です
ただいま 5 回目の 2 番目の実行です
ただいま 5 回目の 3 番目の実行です
------------

Pythonでは正しいインデントがされていないとエラーになります。そのため、誰か書いても似たような構造になるため、方針が大きく逸れしまうことがなく安心と言えます。

先ほどのコードを不適切なインデントで記述した場合にエラーが出る

# 5回の処理を繰り返す -> 合計15回
for n in range(0, 5):
print(f"--> {n+1}回目の実行を開始します") # <- わざとインデントを削除
  # 10回の中で3回ずつ繰り返す
  for m in range(0, 3):
    print(f"ただいま{m+1}回目の{n+1}番目の実行です")
  
  # 見やすくするために出力
  print("-------------")

エラーログ

  File "Main.py", line 3
    print(f"--> {n+1}回目の実行を開始します")
        ^
IndentationError: expected an indented block

様々なライブラリが公開されている

先ほども記述したようにPythonには大きなコミュニティがあり、様々なライブラリが毎日のように実装公開されています。ゲームを作るためのライブラリから、デスクトップアプリを作るたいめのライブラリ。はたまたドローン制御のライブラリに人工知能(機械学習)を作るためのライブラリと非常に幅広いです。

大げさな言い方ではりますが、Pythonを使えば記述不可能なものは少ないでしょう。また、公開されているライブラリを使うことでシンプルに早くストレスなく記述することが出来ます。

Python 作りたいもの」の組み合わせでGoogleで検索をしてみれば、きっと探しているライブラリが見つかります。

ライブラリの使い方が難しい場合であっても、使い方を解説するようなブログ記事、書籍が広く公開されているのは、やはりPythonのコミュニティの大きさ故でしょう。

Pythonの始め方

では実際にどのようにビジュアルプログラミングを卒業した後にPythonを学び始めていけばいいのかを簡単にご紹介します。前提として、ビジュアルプログラミングに取り組んで以下3つのことが理解出来ているとします。

  • 変数の定義
  • 分岐処理(もし〇〇ならば...)
  • 繰り返し処理(〇〇を何度繰り返す)

プログラムは上記の3つの組み合わせによって大抵の処理を記述することが出来ます。今は覚える必要はありませんが、データ構造やアルゴリズムなど、よりパワフルな知識を身につけることで、より効率的で美しい処理を記述出来るようになりますが、それはまだ先の話です。

まずはPythonで上記3つの記述方法は最低限覚えましょう。Progateを使っても良いですし、個人ブログの記事を使っても良いですし、書籍を購入するのも良い選択肢でしょう。

ProgateであればPythonの2章まで進めれば十分です。
prog-8.com

練習問題

ここまで来たら一度、自分の力でコードを書いてみましょう。すでに様々な処理を記述出来るようになっていることを知り自信を持ちましょう。例題を3問用意したので、好きなものを試してみてください。もちろん、全てに取り組んで頂いても構いません。回答例は「おまけ」に貼っておきます。

Q1

1から100の数字で50より大きな数字であれば「big!」、小さな数字であれば「small!」と出力してください。

ヒント:

  • 出力に使用する構文はprint("hello!")です。
  • 繰り返し処理と分岐処理を上手く組み合わせてみましょう。

Q2

1から10までの数字の合計値を求めて、合計値が10より大きければ、合計値を10倍した数値を出力してください。

ヒント:

  • 合計を求めるためには合計値を求めるための変数を用意します(例: total = 0)
  • 先ほどの変数に値を足していく処理を記述しましょう。(例: total = total + 1)
  • 足し算には+を掛け算には*を使います

Q3: ちょっと難しい

プログラムの有名な入門問題fizzbuzzに挑戦してみましょう。1から100の数字で15で割り切れる時にfizzbuzzと出力し、3で割り切れる時にはfizzと出力し、5で割り切れる時にはbuzzと出力してください。

ヒント:

  • Pythonで割り算の余りを求める時には%を使います(例: 10 % 2)
  • 15は5と3の公倍数であることに注意しましょう

次のステップ

練習問題はどうでしたか。どれも繰り返し処理分岐処理を組み合わせて、基本的な数値データに対して何かしらの処理をするというものです。プログラムの最も基本的な部分を抑えた問題になるように作成したつもりです。

この時点でPythonを最低限、記述するための全ての部品が揃いました。この先の進め方は大きく2種類に分かれます。

1つはこのままPythonの文法の理解を進める学習をすることです。変数の定義繰り返し処理分岐処理と大きく3つのテーマを扱いましたが、まだ触れていない面白いものがたくさんあります。この先に学んでいくものとしては...

  • 関数定義
  • データ構造(配列やタプル、ディクショナリー)
  • クラス定義と継承
  • ライブラリのimport

このようなものがあります。全てを今すぐ理解する必要がありません。ただ、学んでおくことで書籍のサンプルコードなどをスラスラと読み進めることが出来るでしょう。

もう1つは作りたいもののを作るという学習方法です。基本的な部分の学習は完了しているので、すでに挑戦することが出来るでしょう。先ほども記述しましたが、Python 作りたいものの名前」Google検索をすれば、よほどマニアックなことでなければ、何かしらのブログ記事、書籍がヒットするでしょう。

その中でおそらく、関数定義データ構造に対して躓く部分があるかと思います。その度に、知らないことを調べて理解することで、必要な知識だけを頭に入れつつ、作りたいものを作ることが出来るため、モチベーションをキープすることが出来ます。

なので私は圧倒的に後者の学習法「作りたいものを作る」方法をオススメしています。調べてみたけど作り方がよく分からなかったという場合は私のTwitterやココナラ(より深く回答します)などに連絡頂ければば相談可能です。

twitter.com

coconala.com

まとめ

ビジュアルプログラミングを卒業した後に学ぶプログラミング言語として私はPythonをオススメしています。理由は名前が広く知れ渡り、大きなコミュニティがあり、数多くのライブラリが公開されているためです。また可読性も良いです。

Pythonの始め方としては、まず基本的な変数の定義繰り返し処理,、分岐処理の書き方を理解すること。そして、実際に処理を記述してみて、「もうPythonが書けるんだ!」ということを体験してみてください。

そのあとの学習方法は自由です。引き続き文法の学習をするのも良し、作りたいものを作るも良しです。

おまけ1 Pythonのオススメの入門書籍について

自分が読んだことがあるものだけを紹介します。

Pythonの文法を優しく理解するために非常に良い一冊です。

より優しい内容が良いという方はこちらがオススメです。

おまけ2

Q1の回答サンプル

Q1: 1 ~ 100の数字で50より大きな数字であれば「big!」、小さな数字であれば「small!」と出力してください。

解答例

# 1 ~ 100の数値を対象の繰り返し処理をする
for num in range(1, 101):
  # 50より大きいかを判断
  if num > 50:
  
    # 大きい時
    print("big!")
  else:
    # 小さい時
    print("small!")

Q2の回答サンプル

Q2: 1から10までの数字の合計値を求めて、合計値が10より大きければ、合計値を10倍した数値を出力してください。

解答例

# 合計値を保持するための変数
total = 0

# 1 ~ 10までの数値で繰り返し処理
for i in range(1, 11):
  # 合計値を更新
  total = total + i
  # もしくは total += 1
  

# 合計値が10以上かどうかを判断
if total > 10:
  # 10以上なら10倍して出力
  print(total * 10)

Q3の回答サンプル

ちょっと難しい Q3: プログラムの有名な入門問題fizzbuzzに挑戦してみましょう。1から100の数字で15で割り切れる時にfizzbuzzと出力し、3で割り切れる時にはfizzと出力し、5で割り切れる時にはbuzzと出力してください。

解答例

# 1から100まで繰り返し返し
for i in range(1, 101):
  # 15で割り切れる時
  if i % 15 == 0:
    print(i)
    print("fizzbuzz")
  # 3で割り切れる時
  elif i % 3 == 0:
    print(i)
    print("fizz")
  # 5で割り切れる時
  elif i % 5 == 0:
    print(i)
    print("buzz")

参考文献