プログラミングが難しい理由が浮かんできた

プログラミング言語を学んで業務でアウトプットしていて、ふと思ったことをメモってみました。
# こんな人に刺さるかも！
- プログラミング言語を学び始めて、「ムズっ...汗」と感じている方
- 実務を見据えた学習をしている方
- プログラミングの構文を覚え始めてこれから本格的に勉強スタートの方

# この記事の読み方
この記事の著者は、独学でプログラミングを勉強しています。
つまり、私の経験からくる個人的な意見となります。
ですので、この記事は一緒にプログラミングスクールの同僚ノートを見ているような感覚で見ていただけると幸いです。

# そもそも「プログラミング」とは
プログラミングという言葉から考えます。
プログラム(program)とは、計算の仕様。
つまり、プログラミング(programming)とは、コンピュータが理解できる計算の仕様を作ること。
ちなみに、プログラミング言語とは、そのプログラムを書くための記法のことです。
計算の仕様とは、個人的に「問題の解き方」と解釈しています。（問題の解き方の定石がアルゴリズム）

問題の解き方はたくさんありますよね！
例えば、三角形の面積とか...
例）三角形の面積を思いつく限りの方法で求めてみよう！
![triangles.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372334/197573ac-833b-7370-68fe-f8007cc182ab.jpeg)

1. 三角形の公式を使う
三角形の面積を求める公式 S =　底辺 X 高さ ➗　2を使って求める。

2. 直角三角形の性質を使う

```math
S=\frac{1}{2}a\sqrt{c^2-a^2}
```

3.sinを使った解き方

```math
S=\frac{1}{2}ab\sin\theta
```
4.ヘロンの公式を使う

```math
S=\sqrt{s(s-a)(s-b)(s-c)}
\bigl( s=\frac{a+b+c}{2}\bigr)
```

5.内接円を使った公式

```math
S=\frac{1}{2}r(a+b+c)
```
未来の私はいくつ思いつきましたか？（2021年5月現在の私は２つです^^;;）


これが「プログラム」です。
このプログラムをコンピュータがわかるように書くことを「プログラミングする」と定義しています。
このプログラミングをするための道具（農作業でいうスコップや鍬）が「プログラミング言語」です。
（最近、プログラミング教室が教えてくれることはこの「プログラミング言語」であることが多いです。）
Java,C,C#...etcこれらを使えるようになることは、プログラミングできるようになることじゃなく、
プログラミング言語という道具の使い方を知る、ということなのです。

```
# プログラミング例
# 三角形の面積を三角形の公式の「プログラム」をもとに、
# Rubyという「プログラミング言語」を使って「プログラミング」してみました。
def triangle(height,base)
  base * height / 2
end
```
### つまり
プログラミング＝プログラミング言語の知識＋プログラムの知識
なのです！！！
（今の自分は、どっちも足りないからアルゴリズムから頑張ろうねー＾＾）
![programming.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372334/836e6420-81f9-94bb-b7b3-87018ecd1bf0.jpeg)


# なぜプログラミングが難しいのか
ズバリプログラミングが難しい理由は、以下の3つです。
- 形がないため、理解しにくい
- エラーを解決するのが時間がかかる
- プログラミング言語の種類が多すぎる!!（３、４個でええやん...マジで）
特にエラーは時間を膨大に飛散させてくれるので、あったまります＾＾（エラー表示がない言語とかなら涙ポロポロ）
人間は、物や事象を理解するのに五感（視覚、聴覚、触覚、味覚、嗅覚）を使ったり、対象が周りに及ぼす影響や関係性などから、特徴や性質を見つけ出すことで理解したと実感します。
![apple.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372334/20d9ac38-e38e-5b72-4f36-01123cf9256f.jpeg)

しかし、プログラミングは視覚以外では簡単に確認することができません。
また、対象が周りに及ぼす影響は確認するまでが大変。。
（実際に使える機能を実装でもしない限りできない）
でも、これだけ頑張って会得したプログラミングスキル、実務で通用するのでしょうか。。？

# [本題] なぜ（世間的）プログラミングが難しいのか
世間的なプログラミングとは、ビジネススキルの意で使われ、実務を見据えています。
世間的プログラミングができるようになるには、先程のプログラミング知識だけでは実務で通用しません。

（え？？？なぜ？）
いや、プログラミングスクールで得た知識だけでアプリ作れたでワイ？？

理由は、
（世間的）プログラミング＝プログラミング＋生きた情報工学の知識
だからだと思います。
確かに、プログラミングの知識だけで簡単なアプリ（機能数１０ほど）は作ることができますが、
大規模な製品（機能数１００以上）は作ることができません。
作ってみたらわかるのですが、もーーぐっちゃぐちゃになります....笑笑

私の経験談で恐縮ですが、
私は、プログラミングスクールに通う前に知人経由で依頼が来たことがありました。
機能数は5０でしたが当時は若かったのもあり、勢いで案件を受けてしまいました。
機能を１０個ほど実装した時に重大なエラーがおきました、しかしそれを解決するためにかなりの時間と労力を削りました。
そう、ぐっちゃぐっちゃだったのです。
関数をモジュールやクラスにきちんと分けていなかったり、変数や関数の名前付けがうまくなくて後から見返すとなんのこっちゃわからない。。
そんなのが１日に１０回もおきたのです。
しかもそれが納品する日まで続いたので２ヶ月間その地獄を体験しました。
一人で開発していたのもあり、怒りの矛先が自分しかいないため毎日自分の無能さと対面する羽目になります。
次第に体が言うことを聞かなくなり、モニターを見るだけで吐き気と頭痛がしました。
この状態に陥ると勉強するどころか、考えることをやめてしまいます。
とにかくこの地獄から這い上がりたい一心で必死になってキーボードを打ちエラーを解決していきます。
納期１週間前は全身の震えが止まらなかったのを覚えています。
（辛い思い出だけど、絶対に忘れてはいけない！　未来に活かすのじゃ）

" では、実務で使える情報工学ってどうやって身につければいいのか？ "

私は、ここに残り半分の「プログラミングが難しい」原因があると考えています。
情報工学とは、情報分野における理論と生産性効率の向上を目的とする学問です。

そう"学問"なのです。

情報工学の本を買い知識を会得しても実際実装時に使えるようにはなっていないことが多いです。
よって、「（世間的）プログラミングが難しい理由」は以下の４つです。
- 知識と実務が背中合わせ。知識を即実装、実行できることが求められる。
- 全体を俯瞰できる知識がないと、分からないところがそもそもわからない
- ソースコードに少しでも触れる人なら、設計に関しての知識は必須。
- 情報工学は人によって多様に捉えられるため、実際にできる人から教わらないと正しく使うことができないことが多い。
学問で得た概念を実務で使いこなし、実際に結果に出るまで昇華させるのに、年単位で時間とプロジェクト数をこなす必要があると思います。

いや、そんなの個人じゃ無理じゃん！！！

そうなんです、だから企業は偉大なのです。
また、大学でも大規模な製品を複数人で作る実技なんてないので（やっても１、２回）、情報工学系の企業に就職するために大学に行くのは効果薄いと言われている理由でもあります。
（大企業に就職という意味では、大卒は必ず欲しいところですが）


## まとめ
- 形がないため、理解しにくい
- エラーを解決するのが時間がかかる
- プログラミング言語の種類が多すぎる!!
- 知識と実務が背中合わせ。知識を即実装、実行できることが求められる。
- 全体を俯瞰できる知識がないと、分からないところがそもそもわからない
- ソースコードに少しでも触れる人なら、設計に関しての知識は必須。
- 情報工学は人によって多様に捉えられるため、実際にできる人から教わらないと正しく使うことができないことが多い。

先程のりんごで考えると、匂いや味・見た目以外にも長い間りんごと触れ合ってきた私たちはそれ以上のことを知っていますよね？（りんごはお友達...＾＾）
例えば、
- りんごをぶつけてしまうと痛みやすくなることを知っていたり、
- 美味しいりんごの選び方を知っている（色艶よく・つる元とおしりの窪みが深い・つるが太い）
- りんごの食べる部分は花托で果実の部分は軸の硬い部分
- りんごはバラ科りんご属。学名は、Malus domestica
ということは皆さんご存知でしたよね？
~~一番上しか知らんし、りんご友達とかあたまいtte..笑~~

ですが、このりんごの例と同じようにどの分野でも学びを仕事に活かすためには、
ある程度の時間、技術であれ考え方であれ、使ってみて検証してみる必要があるとおもいます。
今の自分がどの程度それについて知っているかを把握できるように心がけたい物です。
（#未来の俺へ 周りからの意見は養分だ。評価されることを恐れるな）

## 次回
プログラミングが難しい理由を今回考えてきましたが、次回はプログラミング知識を学ぶ上で重要な「書籍やチュートリアルから学ぶ方法」について考えていきたいと思います！