プログラムの意義とプログラマの本質

## 本題に入る前に
あくまでもこの記事はプログラムを一切やったことがない人向けに書いています。
悪しからず...
 
<br>
<br>

## プログラムの意義
結論から申します。
プログラムの意義とは...

<font color="Red">**楽をするため**</font>

人それぞれありますが、私が一言で言うならこれに尽きます。

...流石にこれだけだとつまらないので私なりにプログラムの意義をお話します。
私達は、昨今様々なものが効率化されています。
- 車や食品工場
- スーパーにあるセルフレジ

...挙げればきりがないと思います。
これらは元々人が行っていました。しかし、こういった全てのものがどんどん機械になってしまうのは、工場やスーパー側からしたら、人件費の節約や人よりも業務が効率化すると言った観点から**楽に利益を上げられる**であることは容易に想像できます。

しかし、ただ適当な機械をスーパや工場に置いたからといって思い通りに動くことはありません(極端な話、3DSを工場に置いたからと言って何か製品を作ってくれるわけではないですよね)。機械を配置して自分たちが望む挙動をさせるには**プログラムを組む**必要があります。

工場のアーム型の機械を例に考えると、どれぐらいの力で物を挟み、その後どのぐらい持ち上げ、何度アームを回転させた後にアームをおろして物を放すのか、全てプログラムする必要があります。用途によっては別の操作も要求されるため、例で上げたようなアームの挙動とは違った動きを要求される場合があります(当然ですが前述のプログラムとはまた違ったプログラムを作る必要があります)。

以上のように、私達は楽をするために機械を用いて、機械が自分たちの楽をしたい仕事をこなすようにするためには、プログラムが必要なのです。
<br>
<br>

## プログラマの本質とは
>ここでの「プログラマの本質」は「プログラマのあるべき姿」程度の認識で大丈夫です。

結論から申します。
プログラマの本質とは...

<font color="Red">**とことん楽をする**</font>

人それぞれありますが、私が一言で言うならこれに尽きます。(~~先程と似ていますね~~)
プログラマ界隈では「プログラムの三代美徳」というものがありそれぞれ。
- 怠惰「Laziness」
- 短期「Impatience」
- 傲慢「Hubris」

と、呼ばれています。イメージが悪そうな単語が並んでいますが、実はこれがプログラマの本質を突いてると私は考えています。一つ一つ丁寧に見ていきましょう。
<br>

### 怠惰

まずは意味を確認しましょう。
>**［名・形動］なまけてだらしないこと。また、そのさま。**
goo辞書より引用
                      
これがどのように美徳と捉えられるのか考えるために、対照的な「勤勉」という言葉を持ってきます。勤勉は、「勉強や仕事に一生懸命取り組むこと」をという意味です。一見勤勉のほうが良さそうですね。
ここでプログラムを勤勉な人と怠惰な人に書かせる例を考えてみます。
九九の答えを全て生成してくださいという指令があったとしましょう。
勤勉な人は、1×1から丁寧に9×9までの答えを出力するように一生懸命コードを書こうとします。(プログラムのコードは理解しなくてOK。あくまでも雰囲気だけ掴み取ってください)
```python:python
print("1*1=",1*1)
print("1*2=",1*2)
print("1*3=",1*3)
print("1*4=",1*4)
      :
print("9*8=",9*8)
print("9*9=",9*9)     
```
これを何十行も書くとなると時間が平気で溶けていきます。しかし、怠惰なプログラマーは時間を掛けることが面倒なのでこのようなコードを書きます。
```python:python
for i in range(9):
    for j in range(9):
        print(str(i+1)+"*"+str(j+1)+"="+str((i+1)*(j+1)))
```
こちらも先程のコードと同様の出力結果が得られます。
今の例から分かる通り、怠惰なプログラマーとは**怠惰であるが故に**、どのようにコードを簡潔にまとめて書くかを常に考えているということです。
<br>

### 短期

こちらも、まずは意味を確認しましょう。
>**［名・形動］辛抱ができず、すぐ怒ったりいらいらしたりすること。また、そのさま。気みじか。短慮。**
goo辞書より引用

こちらも同様にイメージとは別の真意が隠されています。短気なプログラマとは時間がかかることを嫌い、挙動の不具合を嫌います。なのでプログラムの不具合やトラブルを軽減し、計算量が膨大にならないように、プログラムに柔軟性をや処理速度が低下しないプログラムを組みます。(こちらも雰囲気だけ掴んでいただければOK)
<br>

### 傲慢
これも意味を確認しましょう。
>**［名・形動］おごりたかぶって人を見くだすこと。また、そのさま。**
goo辞書より引用

こちらも前述の通りで、当然何かしらの意味が込められています。傲慢なプログラマとは他者から見下され、批判されることを嫌います。よって高品質なプログラムを作成し、己のプログラムの品質の維持や向上に努めます。例えば、プログラムの途中で、こんな記述があったとします。
```c:c
void solve() {for (int i = 0; i < 3; i++) 
                                {for (int j = 0; j < 3; j++) {
  printf("%3d ", c[j][i]);//行列の出力(出力はi行j列になることに注意)
                      		}
	                                 printf("\n");
	}printf("---------------\n\n");}
```

...誰がどう見ても解読が困難ですね。では、こちらはどうでしょうか
```c:c
void solve() //行列の解を出力する
{
	for (int i = 0; i < 3; i++) {//行列の行の大きさ
		for (int j = 0; j < 3; j++) {//行列の列の大きさ
			printf("%3d ", c[j][i]);//行列の出力(出力はi行j列になることに注意)
		}
		printf("\n");
	}
	printf("---------------\n\n");//次の出力と混同しないようにセパレートする
}
```
先程よりもスッキリ見えませんか？実はこれ、どちらも全く同じ挙動をします。同じ挙動をして、今後プログラムを編集する可能性を考えると、きれいなコードのほうが嬉しいですよね。(一部の言語では、綺麗に書かないからに上手く動作しない、といったプログラム言語も存在します)
<br>
<br>

## まとめ
プログラムの意義は**楽をするため**
<br>

プログラマのあるべき姿は
- 短時間で書けるコードを書く
- 処理が早く、編集がしやすいコードを書く
- 誰でも見やすいコードを書く

以上のことを満たす人でした。
いかがだったでしょうか。少しでも参考になれば幸いです。