他にない、上質なITを

Column

プログラミングの習得に必要な「国語力」とは


Pocket

「独習Python入門」という本を出版させて頂いてから、「プログラミングを未経験者に教える」機会が増えました。未経験者の方がプログラムを書けるようになっていく過程やつまづいてる過程を見ていく中で、プログラミングには「国語力」が何よりも求められるのだなと強く感じました。

YESかNoで、判断できる基準を作る

プログラムはコンピューターに実行させる命令の集まりのことです。「まずは、これを作れ。次にこうしろ。もしこうだったら、中断しろ・・・」そんな感じで、コンピューターに対して指示を1つ1つ出していきます。それらを組み合わせてシナリオを作る作業がプログラミングです。

複雑そうに見えるこのシナリオですが、構造はとてもシンプルです。プログラミングの実行順序を制御する方法は、以下の3つしかありません。

  1. 逐次実行
  2. 条件分岐
  3. 繰り返し

逐次実行は書いた順番に実行すると意味です。それを除いた条件分岐と繰り返しが、プログラミングの基礎文法です。プログラミングにおける文法は処理の流れや内容をコントロールするためのものです。プログラミングを行うにあたっては、まず具体的なケースを想定して、具体的なデータにおける共通点を見つけなければなりません。一般的には「抽象化」と言われる思考のあり方です。

抽象化する範囲はそれぞれです。「ある整数値(x)の倍数」であるというくくり方も出来ますし、「数字に3が含まれている数」というくくり方も出来ます。こういった条件を設定すれば「Xの倍数であるか否か」「数字に3が含まれているか否か」という条件を設定することで、必ずYESかNOかを判断することが出来ます。

FizzBuzz判定

FizzBuzzという、プログラミングの課題で有名な課題があります。内容は以下の通りで、これらの条件を「全て」満たすプログラムを書くのがゴールです。

  1. ある数字が、3の倍数なら”Fizz”と画面に表示する
  2. ある数字が、5の倍数なら”Buzz”と画面に表示する
  3. ある数字が、3と5の倍数なら”FizzBuzz”と画面に表示する
  4. ある数字が、上記の条件を全て満たさないなら、その数字を画面に表示する

この処理の肝となるのは「倍数の判定」です。倍数を言い換えれば、ある数で割り切れることができる数です。プログラミングで割り切れるかどうかを判断するには、あまりが0かそうではないかで判断します。このレベルの抽象化を行い条件として設定すれば、整数値ならどれでもOKになります。

ある数字は、どういった数字になるか分かりません。10かもしれませんし、334かもしれませんし、9478354071のような巨大な数字かもしれません。でも、どの数字が判定対象になったとしても、上記の判断基準は間違ってはなりません。それは不具合になってしまいます。通称「バグ(Bug)」と言われるものです。

今回は「数字である以上、Fizz/Buzz等の判定が正しく行われる」という決まりごとがあります。それに対して、その通りの結果にならない場合は、プログラムが正しくないと判断され不具合があることになります。

少し話がそれましたが、プログラムの世界はYES or Noが9割です。 扱う情報の性質を鑑みて、どういったYES or Noの判断基準を与えれば理屈が成り立つのかを考えるのか、もう少し砕けて言うと「何と何を比較して、白黒つけたらいいのか」を決定すること。これが、プログラミングにおける国語力だと考えています。

数あてゲーム

FizzBuzzの条件分岐は比較的単純なので、頭に入りやすいと思います。プログラミングの初学者が苦労するのが、繰り返しをどう使えばいいかです。以下のような数あてゲームを作るという時に、少し面食らう方がいます。

  1. 答えとなる数を1〜100の間でランダムに決定する。
  2. ユーザーは数字を入力し、入力値によって以下のような動作をする。
  3. 入力値が答えより大きかったら、「もっと小さい数だよ」と画面に表示
  4. 入力値が答えより小さかったら、「もっと大きい数だよ」と画面に表示
  5. 同じだったら「正解!」と画面に表示して、正解までに要した回答回数を画面に表示

この場合、条件分岐はもちろん必要ですが、それだけでは不十分です。「正解」にたどり着くまでに、どれだけ回答を必要とするか全くわからないので、回答する回数が何回になろうとも、不正解である以上は何度も何度も回答を受け付ける必要があります。

正解・不正解の判断を行い、不正解なら回答を受け付けて正解かどうかを判断し続ける。そういった繰り返しを行う必要があります。正解・不正解の判断を行うには、「答えと入力値が同じか、そうじゃないか」で判断できます。正解という結果が成り立つための条件を、データを比較することで決定づけます。

「要は、こうでしょ?」と「例えば、どうなる?」

プログラミングにおける表現は、YESとNoで判断できる基準を作ることが肝要だという話をしました。しかし、そうは言ってもどうやって抽象化していいのかピンとこない・・・ということも大いにあります。そういう時は、まず具体例を思い浮かべて処理の流れをイメージしましょう。

答えが10になったとして…変数answerを仮に10にする。で、answerと入力値を比較して… という格好です。変数という単位で抽象化すると処理の流れは検証できないので「例えば、ここに10が入ったら」という形で処理の流れを追いかけていきます。そうする中で、共通する属性が見つけられます。「つまり、こうなればいいんだ」という答えが見つかります。

プログラミングは「要は、こういうことでしょ?」と「それが正しいなら、例えばこの場合は、こうなるよね?」という抽象と具体を行ったり来たりすることが求められます。こういった訓練を積んでおくことで、色んな課題解決に対して応用が効くことになりますので、プログラミングを楽しんで取り組んでいただければと思う次第です。


IT企画の進め方

IT企画、ITプロジェクト支援

会社や事業を変革するために必要なITをどうやって企画して、プロジェクトをどう立ち上げて、成功裏に導くのか。当社はそのためのノウハウを全て公開しています。IT企画から構想立案、要件定義までの支援をさせて頂いています。

IT企画・プロジェクト支援へ

システム内製化支援

様々な開発ツールを使い、御社の業務システムを共に作り上げ、最適な会社の仕組みを作ること。将来的には自立した内製化チームを立ち上げ、業務改革に貢献するソフトウェアの開発・運用を担うメンバーの育成を同時に実現するご支援です。

システム内製化支援へ

お問い合わせはこちらから