プログラミング初学者が「変数って何なの？？？」を乗り越えた話

この記事は、2021年4月にプログラミングを始めたわたしが
最初にぶつかった壁である「変数って何なの？？？」をなんとか乗り越えたよ〜という内容です。
初学者の方で、当時のわたしと同じように悩んでおられる方のお役に立てましたら嬉しいです。

・
・
・

## ■ 最初の壁
プログラミングって何か楽しそう〜と思い、
「プログラミング言語ってこんなにいっぱいあるんだー」とか「フレームワークって何ｗ」とか、
基礎知識ゼロの状態だったわたしが、アハハウフフな気持ちで最初にさわり始めたのはPHP（Laravel）でした。

おそらく初学者の登竜門（？）であるToDoアプリを作り始めるやいなや
ぶつかった最初の壁は、そう、タイトルにも冒頭にも書いたとおり、「変数って何なの？？？」というやつです。
それはそれはもうめちゃくちゃ検索しました。
`変数とは`　`変数って何`　`変数とはつまり`　`変数 わからない`　`変数 意味` etc...

**あああああああ〜調べても調べても書いてあることが理解できない〜〜**

```php:user.php
'user_id' => $user_id;
```

こんなふうに書かれててもどれが変数でどれがカラムでそれぞれがどういう動きをしているのかさっぱりわからない。

検索して出てくるサイトや記事を読めば、それが親切丁寧に書いてあることだけは理解できても
肝心の「で、変数って何なの？？？なんで定義してあげないといけないの？？？」が全く腑に落とせなかったのです。
（ついでに言うと、関数を自分で作るっていうのも意味がわからないぜ！と思ってました。）

## ■ 定義するっていうのはつまり
段々と、わたしの悩みは「変数って何なの」から「定義するって何！！！！ギャオーー」に変わっていきました。

ここで突然の自己紹介ですが、わたしには現在2歳の息子がいます。
わたしが定義のことでギャオついていた当時、息子はようやくいくつかの単語を喋るか喋らないかぐらいの年頃です。
そんなわたしと息子がYouTubeで色んな動物が出てくる動画を何気なく見ていたときのこと、
息子はとくにゾウさんが大好きだったので、アニメや実写などいくつか動画を見るなかでも、
ゾウさんが出てくるシーンは「どうあん！！（ゾウさん）どうあん！！」と大喜びだったのですが、
そこでわたしはふと疑問に思いました。

**アニメのゾウさんと実写のゾウさん、冷静に考えたら全然違うくない？？**　　と。

だって実写のゾウさんは別に水色とかピンク色じゃないし、にっこりした顔でもないし、
大体あの鳴き声ってパオーンっていう表現で合ってる？？
なのに息子はアニメのゾウさんを見ても実写のゾウさんを見ても、どうやら同じくゾウさんだと認識してるっぽい。

鼻が長くて耳が大きくてひらひらしてて、ずんぐりむっくりした動物　をゾウだと思ってる。
・
・
・
んん？
**もしやこれがつまり定義ってことなのでは？？そうなのでは？？？**

なんだか雷に打たれたような気持ちになって（というと少し大袈裟なんですが）
試しに息子に、「ボール持ってきて」とお願いしてみると、息子のお気に入りのボールを持ってきてくれました。
そこでようやく、変数もプログラミングもこれと同じことなんじゃないのかと思い始めるのです。

そのときのわたしの頭に浮かんだものをプログラミングのコード風（あくまでも風）に書きおこすとしたらこんな感じ。

```php:my_son.php

public function getFavoriteBall() {

    ＄おもちゃ箱　＝　遊ぶものがたくさん入ってる箱；
    ＄ボール　＝　丸い形をした遊ぶもの；
    ＄おかあさん　＝　いつも家にいてご飯をくれるアイツ；

    if （ ＄おもちゃ箱　のなかに ＄ボール があったら ）　{
            ＄おかあさん　に　渡す；
    }
}

```

そう、そうなのです。
プログラミングを始める前からずっと、知らず知らずのうちに、ありとあらゆるものが定義されている世界で生きていたし
自分自身でもいろんなものを定義して生きていたのです。
人生は定義だらけ。

生活するうえで必要なことは定義がなくては会話もままならないでしょう。
「おーい、いつも家にいてわたしのつくったごはんを食べる小さいひと〜、
あそこの四角い形のやつのなかに入っていて、あなたがよくあそんでいる丸い形のあそぶものを取ってきて」
なんてことになります。超面倒くさいです。
なるほど。定義、大事。

さてさて、こういったことをプログラミング上ではこちらの意図を伝える相手が人間ではなく機械なので、
察してもらうということができません。

仮に、「ねえねえ、アレ取ってきてくれない？」を人間とロボットの間で実現するためには、

-　「ねえねえ」という音を検知したら、ねえねえの後に続く指示を実行するとあらかじめ決めておく
-　「アレ」とは何を指すのかをあらかじめ決めておく
-　「取ってきてくれない？」で、どこから取ってきて、取ってきたものをどうしなければならないのかをあらかじめ決めておく

このあたりを明確にしておく必要があります。
この「あらかじめ決めておく」がつまり、「定義する」ということです。

## ■ 「定義する」はOK分かった、じゃあ変数は？
「ねえねえ、アレ取ってきてくれない？」を実現するために必要なことは上記で述べましたが、
「アレ取ってきてくれない？」以外にもロボットにお願いしたいことって色々あると思います。
「ねえねえ、エアコンつけて」
「ねえねえ、部屋の掃除して」
「ねえねえ、最新のヒット曲を再生して」などなど。
エアコンをつけるとは何か、部屋とは何か、掃除とは何か、最新とはいつからいつまでのことを指すのか、
そういった細かいことについてももちろん定義する必要がありますが、
それはそうと、
さきほど追加で挙げた例のためだけに、全く同じ「ねえねえ」を３回も書いてしまいました。
「ねえねえ」を「あのさぁ」に変更したくなったら、また「あのさぁ」を同じ回数書かなければなりませんよね。
正直面倒くさいし、
「ねえねえ」を「ねーねー」と書き間違えた箇所があったら、ロボットさんは厳密に指示された通り動きますから
その書き間違えてしまった箇所は「ねえねえ」では動いてくれないので、意図どおり指示が通らなくなってしまいます。

長くなりましたが、ようやくここで**変数**の登場です。
どのように呼びかけるかについてを変数として定義しちゃえばいいんですよ。
PHP（Laravel）では変数の頭にドルマーク（＄）をつける決まり事がありまして、それに従って
`＄呼びかけ　` という変数を定義します。

```php:hey.php
＄呼びかけ　＝　ねえねえ；
「＄呼びかけ、エアコンつけて」；
「＄呼びかけ、部屋の掃除して」；
「＄呼びかけ、最新のヒット曲を再生して」；
```

という記述にしておけば、「ねえねえ」を「あのさぁ」に変更したくなっても、

```php:hey.php
＄呼びかけ　＝　あのさぁ；
「＄呼びかけ、エアコンつけて」；
「＄呼びかけ、部屋の掃除して」；
「＄呼びかけ、最新のヒット曲を再生して」；
```

このように、最初の1行だけ変更すれば済むため非常に効率が良く、書き間違い防止にもなります。
（注：ここではひとまず変数という概念を理解しやすいように日本語表記でコードっぽく書いていますが、実際には上記のように日本語表記では動きません）


プログラミングにおいて変数や関数をどういう名前で定義するか、
それには、**命名規則（名付けるための決まり事）**が大切なようです。

たとえば、少し前にさかのぼって、2歳の息子とボールのくだりあたりで
getFavoriteBall　という名前の関数っぽいものを書きましたが、
ここに含まれる単語３つ　`get` `favorite` `ball`　の区切りをどう表記するかの決まり事です。

`getFavoriteBall`　   単語の頭文字をそれぞれ大文字にする：キャメルケースと言います
`get_favorite_ball`　 単語の間を _ （アンダースコア）で繋ぐ：スネークケースと言います
`get-favorite-ball`　 単語の間を - （ハイフン）で繋ぐ：ケバブケースと言います

※その他及び詳細についてはここでは割愛します。検索してみると色々とわかりやすい記事がたくさんありますのでぜひご覧になってみてください。


命名規則には守らなければならないレベルがいくつかあって、

:::note alert
そのプログラミング言語での決まり事（守らないと大概エラーになる）
:::

:::note warn
複数人でプロジェクトに携わる場合における、プロジェクト内での決まり事
（守らなくてもエラーは出ないかもしれないが可読性や保守性が低下し将来的にエラーを誘発する素因となりえる）
:::

守らなければそもそもプログラムが動いてくれない、というレベルの決まり事と、
守らなくてもプログラムは動くけれども守った方が良い、というレベルの決まり事などがあります。

何かのプロジェクトに途中から参加する場合は
既存の記述がどのように命名されているかを見て、それに従っていけばきっとOKです。
自分1人でプログラミングする場合は、数ヶ月後に読み返してもそのコードを読み解けるかどうか？と考えて頂ければOKです。

このあたりの決まり事を守ったうえで、かつ、できるだけ誰が見ても分かりやすいように、を心がければ
変数の名前も、定数の名前も、関数の名前も、自由で良いと思います。
（注：PHP・Laravelを学習している上での所感です。ほかの言語では違うよ〜ということがあればぜひ教えてください。）

とりあえず、まずは「ふーん、命名規則っていうのがあるんやな」ということを心に留めておいておけたら良いのではないでしょうか。

## ■ 結論：変数とは
人間がプログラミング言語を用いてパソコンや機械に対して意図や指示を伝えるために、
「これはこういうことです」とするうえで無くてはならないものです。
今では、変数を定義しなかったらどうやってコードを書けばいいのか分からないとさえ感じます。
この結論に至るまでの道のりを今回は記事にしました。

長々とお読み頂きありがとうございました！