らむねの考え

プログラミングの勉強を始める前に「プログラミングとは?」を考えてみる

アイキャッチ(プログラミングの勉強を始める前に「プログラミングとは?」を考えてみる)
らむね

この記事では次の言葉を説明してみます。

  • プログラミング
  • プログラム
  • ロジック

これから自分は何を勉強するんだろう?

友達
友達

プログラミングを勉強してみようと思うんだ。

ここにプログラミングに興味を持った友達が一人。学生ならば授業や好奇心で興味を持って、社会人ならば転職を考えたりや子供の勉強に触発されて等々。プログラミングという言葉に触れる機会はIT系の仕事に就いていなくても世間から聞こえてくるくらいには、馴染みのある言葉になりつつあるのかなと個人的に感じています。

さて、先に挙げたようになぜ勉強を始めようと思ったかという動機はすぐに答えられるかもしれません。ですが、次の質問にすぐ答えることはできるでしょうか?

らむね
らむね

プログラミングの勉強って、何を勉強するの?

プログラミングとは何かを知らない人からすると、自分の経験に置き換えることのできる何かで伝えてほしい/教えてほしいわけですね。

さあ、この質問にみなさんなら何と答えるでしょうか?

  • プログラミング言語(未知の言葉)を覚えること?
  • でもプログラミング言語っていろいろ種類があるけれど、何を覚えれば勉強したことになるの?
  • そもそもなぜ、プログラミング言語っていろいろ種類があるの?
  • そういえばプログラミングって英語を使うイメージだし、まずは英語を勉強したほうがいいのでは?
友達
友達

よく分からないけど、まずは英語かな…

らむね
らむね

英語か。単語もそうだけど文法とか覚えるの難しそうだね。

プログラミングを勉強する ≒ 英語を勉強する になってしまいましたね。
初心者が方針を憶測で決めてしまうと、方向性が誤っていることに気付くことができません。

自分がこれから何を勉強しようとしているのか、整理することはとても大事だと思います。なぜなら、学ぼうとしていることの全体像を把握し自分の理解度を測れるようになるからです。理解度を測れるようになると自分に足りない領域が把握できるようになります。

他にも、到達度(ゴール)を決めることができるようになります。先行きが不透明な中で物事を進めるのは不安になるものです。なぜなら自分が今どこにいるのか立ち位置が分からないからです。

プログラミングに限った話ではありませんが、何かを勉強する時には具体的に何を学ぼうとしているのかをはっきりさせると迷子にならないで済むかもしれませんね。

プログラミングとはプログラムを書くことだけ?

プログラミングは英語でProgrammingと書きます。訳してプログラムを書くことという理解の方が多いと思います。

では、プログラムを書くことに必要な知識や勉強は何になるのでしょうか?

  • 書くというくらいだし、言葉を勉強しないといけない?
  • 言葉を書くなら言語ごとに方言とかあるのかな?
  • 書くって紙に鉛筆で書くの?何を使って何に書くんだろう…

たしかに書くという動作のうち出力(Output)に着目をしたとき、先に挙げたような観点はもちろん必要になるでしょう。Howにあたる部分ですね。

しかし、書くためには入力(Input)が必要なはずです。Whatにあたる部分、何をですね。

  • そもそもプログラムって何だろう?
  • プログラムって日本語を書けばいいのかな?
  • 良いプログラムや悪いプログラムはあるのかな?

プログラミングの勉強→プログラムを書くことの勉強→… ときて、そもそもプログラムとはという疑問があることに気づきました。何を書くのかを理解していないまま書き方を勉強しても、理解の進みは遅そうですし誤った書き方を覚えてしまうかもしれませんね。

プログラムとは機械に指示をするための命令書?

私たちは日常的にパソコンやスマートフォンを何気なく操作して、こうしてブログを読んだりYoutubeを見たりしています。操作≒人間の指示に従ってパソコンをはじめ機械は動いてくれている訳ですが、なぜ機械は人間の指示に従って動いてくれるのでしょうか?

それは事前に〇〇という操作をされたら××という動きをしなさいと、機械へプログラムが施されているからです。逆にいうと、プログラムされていないことは機械には行うことができません。

機械は言われた通りにしか動けないという見方ができますが、人間には難しいあることを機械は難なく行うことができます。それは繰り返し同じことを行うことです。人間は疲れや集中力の欠如などでミスをすることがあり得ますが、機械はプログラムされたことであればミスなく何度でも繰り返してくれます。

さて、ここまでで機械は事前に指示されたことをミスなく繰り返し行うことができるということを説明してみました。では、機械へ事前に指示を出すのは誰でしょうか?

そう、それがプログラマであり指示を出すことをプログラミングと例えることができます。

機械へ指示を出すことをプログラミングと呼ぶのであれば、プログラミングを勉強するということは次のことを勉強するイメージに近いかもしれませんね。

  1. 相手(機械)ができることとできないことを理解する
  2. 相手(機械)に誤解を与えない指示の出し方を勉強する
  3. 相手(機械)ごとに適切な指示の出し方を考えてあげる
  4. 相手(機械)の現状の問題点を的確に指摘し対応案を示してあげる
ちょっと補足

先の①~④は、おおよそ次のイメージで書いてみました。
プログラミングとはプログラムを書くこととはいえ無機的に書くではなく、様々なことに注意を払いながら書く必要があると伝えたかったです。

①ハードウェアやプロトコル等の仕様/制限で、
 できることとできないことがあることを理解する必要がある
②プログラムは書いた通りに動くので、機械自身がバグをバグだと
 判断できない(正しく動いていると思い込む)ことを理解する必要がある
③冗長な計算や処理を行う複雑なプログラムではなく、最短で効率の良い
 シンプルな(better、より良い)プログラムを目指すことで皆が幸せになる
④技術的な負債には適切なリファクタリングを施す必要がある

期待する結果を導くための論理(ロジック)とは

補足でも少し書きましたが、機械はプログラムとして書いた通りにしか動きません。人間が想定していた結果と異なったとしても、機械はプログラム通りにしか動きません。

機械は文字通り、プログラムとして指示されたことであればミスなく行うことができます。プログラムが誤っているならば、機械が誤った結果を出したとしてもそりゃそうだよねで終わりです。

なので、プログラマは機械が誤った結果を出さないように注意してプログラムを書く必要があります。当たり前なことと思うかもしれませんが、これが基本かつすごく大事なことです。

そのためには、期待する結果を導くための論理ロジック)を綿密に組み立てる必要があります。

ここで唐突に問題です。
100円のパンを5個、120円のお茶を2本買いたいと思っています。
全て購入するには何円が必要になるでしょうか?
※ただし消費税は考慮しないものとし、かつ他のイレギュラーな要素は考慮しない。

おそらく多くの人は次の式でもって、740円と計算したのではないでしょうか?

  • 100×5+120×2 = 500+240 = 740(円)

他には以下の式でも導けますね。

  • 100+100+100+100+100+120+120 = 740(円)

どちらでも期待する結果を導くことができますが複雑な処理はしないシンプルな論理だと理解されやすく後々修正が必要になっても修正が容易、また不具合バグ)が入り込みにくいので今回は前者のロジックが適切と判断しました。ここでいう適切とはより良いという意味です。

シンプルな論理だとなぜ修正が容易、また不具合が入りにくいのかを説明するのはまた今度として、ロジックというものをどのように作るのか少しでもイメージ頂けたなら幸いです。要は普段の私たちが頭の中でしている計算であったりを誰でも再現できるように手順化してあげるということです。

まとめ

長くなってきたので、そろそろまとめようと思います。

今回はプログラミングとはプログラムを書くこと。でもただ何かを書くだけではないんだよ、というお話をしました。

プログラミング≒プログラムを書くということは、機械に期待する結果を目指して動いてもらうように指示を出すこと。指示を出すということは誤った指示を出してはいけないし、適切な(better、より良い)指示を出してあげないといけません。

指示を出すということは想定する結果を導くためのロジックを綿密に作るということであり、これこそ論理的思考力(ロジカルシンキング)がプログラミングおよびプログラマに必要と言われる所以です。

なのでプログラミングとは何を勉強するのか、と聞かれることがあれば胸を張って

友達
友達

論理的思考力(ロジカルシンキング)を鍛える勉強だよ。プログラムは自分自身でロジックを組み立てられないと書けないからね。

と、伝えてあげてくださいね。

この記事が誰かの参考になれば幸いです。それでは。

投稿した人
らむね
らむね
某IT企業に勤めるエンジニア。
JavaをはじめC#やTypeScript、PHPにPython、Swiftなどを広く浅く触れるタイプ。
CentOSやシェルスクリプトも多少なら扱える。いずれはAWSやGCPを使いこなしたい。
記事URLをコピーしました