プログラミングの何がそんなに「難し」くて「向き・不向きがある」とか経験者がマウント取っちゃっているのか

 # はじめに
　一般的に、「プログラミングには向き・不向きがある」「プログラミングは、本質的に難しい」といわれる。
　プログラミング出来る側としては、初心者・初学者などに対して「向き・不向きがあるよ」とかマウント取っちゃったりする。

　プログラミングは、果たしてほかの仕事と比較してそこまで難易度が高くてマウント取っちゃってもいい仕事なのか、どんな仕事だって難しいし、向き不向きがあるのではないか。とおもう。


　そこで、プログラミングの何が「難易度が高い」「難しい」のか、考察を巡らせてみた。


結論として、初心者・初学者にとって、プログラミングの難しさは次の２点に収束するのではないかと仮説を立てててみた。

 1. 目標としている成果物の想定に相違があること
 1. 成果が目に見えないこと

上記「成果が目に見えない」というのは、なんとなく分かって頂けると思われる、「目標としている成果物の想定が違うこと」も重要な要素だと考えている。それらについて説明する。

# ■目標としている成果物の想定に関する相違
## プログラミング以外の仕事における初心者に想定されるレベル感
　世の中の一般的な仕事においては、まず初学者は教師・同僚・先輩などから手ほどきを受け、マニュアルを参考に指示通り作業を行う。その過程で作業の手本や成果物の見本および途中経過が示される。
　指示通りの作業に慣れてきたらひとつ上の難易度のものに挑戦し、ステップアップを繰り返す。

　学校の授業においても、まずは指示通り課題をこなし、ステップアップしていく。

　中級以上の腕前になれば、初級の作業はそこそこ完璧にこなせるようになり、ある程度のイレギュラーに対応でき、創意工夫も可能となる。

## 電気工事士の実技試験を例にして違いを考える

　ひとつの例として、電気工事の実技試験に焦点をあててみる。（※電気工事士の実技試験を題材としたのは、私自身が電気工事士の免許を取得しており（ペーパーですが）、資格取得のための授業の講師も担当したことがあるからである。プログラミングと比較して難易度がどうこうと言うわけではない。）

　電気工事は、言ってみれば建築物の電気配線や電気設備を施工・取付けすることであり、そのためには電気工事士の免許が必要である。免許を取得するには筆記と実技の試験に合格する必要がある。

　電気工事士の実技試験において求められるのは、図面で示される仕様の通りに施工することである。

## 電気工事士の実技試験とは

　電気工事士の実技試験では、単線図という図面が示される。
　単線図は、機器と配線の接続や位置関係および配線長などを表した図面で、機器間の配線は１本の線で表記される。
　しかしながら、実際の配線には２本の電線を１組としたケーブル、もしくは３本の電線を１組のケーブルを用いる。もしくはそれらのケーブルを複数本組み合わせる。単線図には電線やケーブルの種類などは記載されていない。

　このため、施工に先立って単線図を複線図と呼ばれる図面に拡張する必要がある。複線図には、どの種類のケーブルを用いるのか、電線は何本用いるのか、ケーブル内のどの電線をどの機器に接続するのか、などを記載する。


## 実技試験の学習方法・練習方法

　電子回路の初級の知識を用いればどのように配線すべきかはなんとなく想像できそうではあるが、初学者においてはその限りではない。
　このため、**授業や教本では、「まず、非接地側どうしをすべて接続しましょう」、「その次に、....の場合はxxxxしましょう」のように手順が指示される**。このような手順を、回路のパターンに応じて覚えて実践することが最初の一歩となる。

※電気工事士実技試験の教本としては、以下のHOZAN社のサイトがわかりやすい。
　参考：　https://www.hozan.co.jp/corp/denko2/pg/1figurebasic/

複線図ができたら、その図面通りに施工する。施工後は、通電して動作確認をおこなう。


## プログラミングに例えてみる


　ここで、プログラミングに話を戻してみる。


　電気工事の過程において、先述の 『「まず、非接地側どうしをすべて接続しましょう」「その次に、....の場合はxxxxしましょう」』という **手順（指示）を【考えること】および【言語化すること】がプログラミングに相当するのでは** ないだろうか。



　手順や指示はプログラムに相当し、施工者（つまり人間）がコンピュータのハードウェアに相当する。
　自分自身で施工が完結するなら指示をする必要はないし言語化する必要も無いが、他人に指示を出して作業を完遂するとなると、それが必要となる。
　指示を間違えば、当然ではあるが全く違う仕上がりとなり、場合によっては誤配線による電気災害も発生しうる。これは、プログラムのバグに相当するだろう。


## 「初心者」に要求されるレベルの違い

　**ほとんどの仕事では、他人へ指示をして作業を完遂させることは、初心者には要求されない。** というか、それが出来る人材を初心者には分類しない。
　それに対してプログラミングでは、これを初級者から求められる。しかも、一定程度の品質をもつ成果物ができあがることを求められる。
　**ほかの仕事でいうところの、中堅どころあたりに求められる能力が、プログラミング初心者レベルで要求される**、といったところだろう。

つまり、仕事の成果物や要求が
 >マニュアルの指示（手順）どおり作業をすれば出来上がる程度の成果物を制作しろ
 
 とおもっていたら

> 成果物を得るための手順を、自分で考えて書け！！

 ということだったのである。
 　前提が違うのだから、いくら学習してもゴールにたどり着けないのである。ゴールが見えなければ、モチベーションの維持も難しいので、ドロップアウトしてしまう原因となりかねない。
 
　このように、求められる成果物の想定に関する認識に相違があることが、プログラミングの習得を難しくしているのだと考える。

 # ■成果が目に見えない
　プログラミング以外のほとんどの仕事では、成果物は目に見える。完成品になる前にいくつかの段階を踏むが、その過程における成果物も、ほとんどの場合目に見えるものである。目に見えるから、完成するまで長い工程があっても、段階を踏んでいるのだと思える。
　先述の電気工事士実技試験においても、電線の寸法を間違っていたら、微調整したあと定規で測ってたしかめればよい。


## プログラミングは、成果が分かりづらい
　一方、プログラムでは、初心者からしてみれば、完成して動かしてみるまで成果がわからない。少しでも間違っていれば期待した動きにならないことも多々ある。制作途中に「エラー」が発生し、先に進まなくなる。プログラムに全く問題が無かったとしても、動作しているということ自体が観測できないこともある。
　つまり、「完璧にしないと、成果にならない」という風に、初心者・初学者には映る。おそらく、初心者からしてみれば、電気工事士実技試験に例えると「目をつぶって耳栓をして施工する」心境に近いのではないか。


　「え、デバッガを使えば見えるっっしょ？」「なんなら、オシロスコープも使おうか？？？」というのは、また次の話。


 ## モチベーションが全然上がらない
　ここで、モチベーションの話をする。
　成果物が、常時何らかの形で目に見えている状態であれば、完成像や進捗も把握しやすいしのでモチベーションを保ちやすい。
　プログラミングは、完成するまで成果が分からないし、なんかよくわからないけど動かないし、エラーとか言って怒られるし、教科書通りにやっているのにその通りうごかねーし、やってらんねーよ、もう！！となりがちである。モチベーションだだ下がりである。これでは、習得も難しい。

　「目標の想定に相違がある」「目に見えない」という要素の相乗効果によってモチベーションがだだ下がるのかもしれない。



 # ■おわりに
 　というわけで、プログラミングを難しく見せている要因を分析してみました。

 　じゃあ、これをどうやったら克服できるんだ！！！というのを、次の記事として書いたら公開します。