プログラミング言語を習得したら、次は何?【プログラミング言語の選びかた】

プログラミングには、「知識」と「知恵」が必要です。これまで連載でずっとお話してきたプログラミング言語の習得は、「知識」に相当します。プログラミング言語は、コンピューターに命令を伝えるための手段。いわば基礎で、むしろそこからがはじまりとも言えます。自在にプログラミングできるようになるには、命令自体の組み合わせや組み立て方も習得しなければなりません。これが「知恵」です。最終回の今回は、この「知恵」についてお話しします。

基本的な命令の組み合わせでプログラムをつくる

プログラミング言語を実際に習得していくと、実はそこには本当に基本的な命令しかないことが、すぐにわかります。

たとえば、三角形や四角形、五角形などの多角形を画面に描くことを考えてみてください。残念ながらほとんどのプログラミング言語には、こうした図形を描く命令はありません。あるのは「線を描く」という命令だけです。そのためこうした図形を描くには、線を何本か組み合わせるしかありません(ただし四角形に関しては、とてもよく使うので特別に用意されていることが多いです)。

つまり自分がやりたいことを用意されている命令の単位まで細分化して、「用意されている命令を組み合わせてつくる能力」が必要です。これがいわゆる「知恵」に相当する部分です。

たくさんある「やり方」。どれを使う?

では具体的にどうすればよいのでしょうか?たとえば正三角形を描くことを実際に、ビジュアルプログラミング言語のスクラッチを使って考えてみましょう。

このように小さな命令を組み合わせで目的を達成するための方法は「アルゴリズム(算法。手段のこと)」とも呼ばれ、その方法は一通りではありません。スクラッチでは「ペン」という機能を使って図形を描けます。「ペンの色を変える」「ペンを下ろす」「ペンを上げる」「ペンを特定の場所に動かす」「ペンの向きを回転する」などの命令が用意されています。ペンを特定の場所に動かすには、座標を使います。次のようなX座標とY座標で座標を指定します。

線を描くには、「ペンの色を変える」「始点にペンを移動する」「ペンを下げる」「終点にペンを移動する」「ペンを上げる」という組み合わせをします。たとえば、Scratchで次のようなプログラムをつくります。ここでは、(0, 0)から(100, 100)に向けて線を描こうとしています。実行すると、斜めの線が描けます。このプログラムを見るとわかるように、プログラムは、本当に命令をただ並べたものに過ぎません。意外とプログラミングって簡単なことがわかるのではないでしょうか。

結果

さて、ここまでがScratchの基本、いわゆる「知識」です。ここから、考え方である「知恵」に話を移します。この仕組みを使って、正三角形を描くには、どうすればよいでしょうか?

その方法は、いくつかあります。代表的な方法を2つ挙げてみます。

(1)座標で指定する方法

ひとつめの方法は、あらかじめ座標を決めておき、その座標を次々と入れていく方法です。たとえば、次のような具合です。ここで「100, 173」の座標の「173」は、正三角形を半分にした辺の長さは、「1:2:√3」であることを利用し、√3×100≒173として計算したものです。プログラムは、ただ座標を拾って線を書いているだけなので、簡単ですね。

(2)正三角形の性質を使う方法

もうひとつの方法は、正三角形の性質を使う方法です。正三角形は、すべての辺の長さが等しく、角の角度が60度です。そこで、一定の方向に進んだら、180 – 60 = 120度回転して、同じ長さだけ進むことでも描けます。そのようにしてつくったのが、次のプログラムです。

結果は、どちらも同じです(厳密には計算の誤差は少し出るので完全に同じにはなりませんが)。このように同じ処理をするのでも、その命令の組み合わせ方は、たくさんあります。つまり別解がたくさんあるということです。

これからプログラミングを学習していく過程では、「教科書に書いているのと自分の考えが違う」「先生に習ったのと違う」ということも出てくると思います。でも、同じように動けば、どれも正解です。必ず、どういう方法でつくらなければいけないというわけではありません。

ただし、つくり方によって、「速度が速い」とか「改良しやすい」など特徴があり、善し悪しが出ます。たとえば方法(1)は、座標を拾うだけなのでプログラムはわかりやすいですが、座標を計算するのに√3を使っているので、1対2対√3であるということを知らないと座標の場所がわかりません。

その点、方法(2)は、√3を知らなくても、正三角形の性質だけでプログラミングできます。しかし回転が絡むので、プログラムの理解は少し難しくなります。そして少し捻った方法でもあるので、こうした思いつきができるかどうかという発想力、いわば「知恵があるかどうか」が求められるというわけです。

命令の流れを構成する4つの要素

さて今回は、プログラムが始めてという人がほとんどだと思うので、方法(1)や方法(2)は、命令を単純に上から下へと並べるだけにしましたが、並べるだけでは「いつも決まった動き」しかできません。この例のように正三角形を描くような場合ならよいのですが、たとえば、「Aというボタンが押されたらネコの鳴き声を鳴らす」「Bというボタンが押されたらイヌの鳴き声を鳴らす」というようなプログラムをつくりたい場合、「Aというボタンが押されたか」や「Bというボタンが押されたか」などの判定が必要です。

こうした判定をするために、プログラミングでは、条件分岐などの処理ができるようになっています。プログラミングにおいて基本となるのは、次の4つの要素です。プログラミング言語によって、その書き方は違いますが、どんなプログラミング言語でも、この4つの要素を記述できます。

(a)値の計算

ひとつは、計算をする機能です。足し算、引き算、割り算、掛け算といった四則演算のほか、数学の指数や対数、sin、cosなどを計算することもできます。もちろん、もっと複雑な計算をして、たとえば、いま流行の人工知能のような処理もさせることができます。

(b)値の保存

もうひとつは、値を一時的に保存する機能です。計算した値が必要なときに、都度、計算し直していると、速度がとても遅くなるので、一時的に保存しておいて、必要になったときは、いつでも取り出せるようにする機能です。

(c)条件分岐

すでに説明しましたが、「どのボタンが押されたかによって処理を変えたい」とか何か判断したいときに使います。たとえば、スクラッチの例だと、何かのキャラクタを画面の左右に往復して動かしたいときなどには、「左端に到達したかどうか」とか「右端に到達したかどうか」を調べて、到達していたら、逆向きに動かすというようなプログラムをつくります。

(d)繰り返し

そして繰り返しも、とても重要です。もし、繰り返しの機能がないと、同じ命令をいくつも連ねなければなりません。

さてここで、先ほどの正三角形をつくるプログラムの方法(2)を見てください。よく見ると、「120度回す」と「100歩回す」の組が、3回ありますね。これは、いま挙げた基本機能の「繰り返し」を使うと、短く書けます。スクラッチの場合は、次のように書けます。

このように、基本機能を組み合わせてプログラムを短くする、わかりやすくするのも、プログラミング技術のひとつです。ところで実は、この方法(2)ですが、少し改良すると、正四角形や正五角形、正六角形なども描けます。それぞれ、繰り返し回数が「4回」「5回」「6回」で、角度が「90度」「108度」「120度」という違いでしかないからです。

四角形

五角形

六角形

数学的な考え方とプログラミングの関係

さて、いま算数や数学の話が出てきましたが、それとプログラミングの関係について、少し補足しておきましょう。

プログラミングは、算数や数学と、とても密接な関係があります。正三角形の例で説明したように、図を描いたり、キャラクタを動かしたりする場合は座標で指定しますし、各種計算も、算数や数学の知識が絡んできます。逆に、学校で学ぶような数学の問題を、パソコンを使って解くこともできます。たとえば、「最大公約数の計算をする」「一次関数、二次関数の解を求める」「因数分解する」などは、プログラムをつくれば、比較的簡単に解けます。

また最近では、数式を入れたときにグラフを描くソフトもあるので、数学を学ぶときの手助けとしてパソコンを活用し、理解を高めるという使い方も考えられます。

実務的な考え方とプログラミングの関係

ここでは、正三角形を描くというような、いかにも算数や数学に関係している問題を扱いましたが、現実のプログラムはどうなっているのでしょうか? つまり、パソコンで動くソフトやスマホで動くアプリなどです。

実は、こうしたソフトやアプリも、その中身の処理は、ほとんどが計算処理の塊です。Excelなどの表計算ソフトはいかにも内部で計算していそうですが、Wordのようなワープロソフトも、文字の大きさや位置を計算するのにたくさんの計算をしています。そしてゲームもキャラクタは、すでに述べたように座標を計算して動かしているわけですが、ガチャなどは確率計算で当たりがでるかどうかを計算していますし、敵と出会ったときに勝つか負けるかなどは、戦闘力や防御力などのさまざまなパラメータを計算して、その大小比較することで決めています。

ですから、何か考え方が違うというようなことはありません。ただ違うのは、「データをファイルとして読み書きしたり、通信したり方法」とか「ユーザーがクリックやタップしたことを知る方法」など、「ユーザー操作」「ファイル操作」「通信」に関する命令が、いくつか絡んで来るという点は違います。こうした点は、やり方が決まっているので、プログラミング言語を習得するのと同様に、知識として身につける必要があります。

プログラムに慣れてイディオムを吸収していく

では、こうした「考え方」を習得するには、どうすればよいのでしょうか?それには、ともかく慣れてプログラムをつくっていくしかありません。プログラムが読めることと、プログラムが書けることとは、別の能力です。

まずは、プログラミング言語の基本的な内容を習得します。すると、プログラムが読めるようになります。読めるようになったら、多くの参考書を見て、どんなプログラムが書いてあるか、その意味を理解するのです。そして次に、それをまねしてつくってみるのです。そうすると、それがだんだんと身についてきます。

ここでは「考え方」などとたいそうなことを言いましたが、実は、典型的な考え方のほとんどは実は決まっていて、英語のイディオムのようなものです(図書館に行くと、「アルゴリズム辞典」のような本があると思います。先ほど述べた、「最小公倍数を求める方法」などは、そうした辞典に載っています)。ですから、何度も繰り返して書くことで、自然とそのイディオムが出てくるようになります。

そうすると、だんだんと自分の好きなようなプログラムが書けるようになり、とても楽しくなってくるはずです!

ぜひみなさん、挑戦してみてください。

これまでの記事はこちらから。