プログラミングを挫折しないために必要な最重要能力は、『細分化』じゃないかと、実例から考える

## はじめに
エンジニア歴がそろそろ10年になる。
これまでのキャリアで、さまざまな方に、ホームページやプログラミングを教えてきた。
バリバリ活躍している人もいれば、途中で挫折した人もいる。
自分の指導力はいったん傍に置いておいて、そういった方々はどこで差が付くんだろう？と考えてきた。

問題解決能力とか、コミュニケーション能力とか、大きな候補となる物に一つ、気付いた。
それは何か？結論を述べてしまうと、それは

**細分化**

じゃないかと思うようになってきた。
細分化とは何か？実例から説明していきたいと思う。

## 実例

プログラミングの勉強をしていくと、どんな言語でも必ず、こんな問題は解くはずだ。

> 問題1
> 変数xが偶数であれば、「xは偶数です！」と画面に出力する。そうでなければ、「xは偶数ではありません！」と出力する

誰しもが、プログラミングの勉強の過程でこんな問題は解いた事があるはず。
実際のコードは、こんな感じになる。(例はC#)

``` csharp
int x = 13;
if(x % 2 == 0)
{
    Console.WriteLine("xは偶数です！");
}
else
{
    Console.WriteLine("xは偶数ではありません！");
}
```

これはきっと、プログラミングを習ったことがあれば必ず解けるはず。

さて、それでは次の問題はどうだろう？問題1が解けたという前提で、次の問題を読んでほしい。

> 問題2
> プログラム実行日が祝日であれば、「今日は祝日です！」と画面に出力する。そうでなければ、「今日は祝日ではありません！」と出力する

この問題はどうだろうか。先ほどの問題1と似たような構文の問題になっている。プログラミング勉強中の方は、ぜひトライしてみてほしい。
そしてきっと、必ず、以下のような疑問に辿り着くはずだ。

**「祝日ってどうやって判定するの？」**

さて、この実例をベースに、ここから「挫折する人、成長する人」の違いを説明していきたいと思う。

## 挫折する人
挫折する人は、このようなパターンになる。

- 「祝日の判定方法が分からない！」と諦める
- もしくは、「祝日の判定方法が分かりません！」と、何も手付かずの状態で周りに聞く

これらの対応をしている方は、残念ながら成長は遅いか、どこかで頭打ちになってしまうだろう。もし該当する方は、考え方を変えてほしいと願う。

さて、では何がダメなのか？ということを説明していこうと思う。
結論から言うと、**その時点でやれる事をまったくやっていないからだ。**

プログラミングをするにあたって、分からないこと、やった事が無いことに取り組むことは、よくある話だ。
そこに対して疑問に思ったり、解決できずに人に聞く事自体は、全くもって普通の事だ。

でも、「祝日の判定方法が分からない」としても、その時点の知識で、**"全てでは無いにせよ"**コードは書ける。
具体的には、問題1を解決出来ている時点で、以下の部分までは書くことができるはず。

``` csharp
if (XXXXX{※祝日の判定部分})
{
    Console.WriteLine("今日は祝日です！");
}
else
{
    Console.WriteLine("今日は祝日ではありません！");
}
```

そう、**「祝日の判定」以外は、ほとんど問題1のコードと同じ構成になる。**
肝心要の「祝日の判定」はXXXXと不明状態だが、この部分さえ解決してしまえば、このプログラムは完成する。
完成までのイメージが、グッと近付けただろう。

プログラムを作る時で、なにか分からないことがあった時に、「全てが分かりません」としてしまう人は、存外多い。
けれど実際には、それまで得てきた知識と経験で、部分部分は書くことができるはずだ。
分かる部分を書き終えたら、後は本当に分からない部分を調べたり、先輩に質問したりすることで、よりコアな課題解決へと繋がる。
これが、プログラミングを細分化していく過程となっていく。

駆け出しエンジニアの方にお伝えしたいのだが、**たとえどれだけキャリアを積んでも、どれだけ練習しても、分からないものは分からない。**
知らないことは必ず出てくる。それはどんなエンジニアであっても、疑いようの無い事実だ。
(「俺は全部知ってるぜ」的なエンジニアがもし周りにいたならば、今すぐ全力で逃げてください笑)

しかし、キャリアを積んでいくにつれ、この細分化の正確性、速度、そして「ここは分かる」の範囲は、確実に広がるし高まっていく。
必ず出てくる「分からない」に対しても、これまでの経験を活かして、解決に導くことが出来る。
そうなれば、俗に言う「高収入」といわれるようなエンジニアだって目指せるし、活躍することができることになる。そうなれるよう、是非頑張ってほしい。

## 「得体の知れない課題」から、「見たことのある課題」に

……さて、ここまででもかなり大きな学びだと思ってはいるが、せっかくなのでもう少し深掘りしてみたいと思う。
「今日が祝日かどうか」の判定についてである。
もちろん、この時点で調べたり、質問してみるのもいいが、これを更に細分化してみよう。色々なやり方はあるはずだが、スタンダードなのはこんな処理の流れだろう。

- 今日の日付を取得する
- 祝日の一覧を、何かしらの方法で取得する
- 今日の日付が、「祝日の一覧」のどれかに含まれていれば、祝日。そうでない場合、平日。


『「今日の日付」の取得』はすごく簡単だ。
『今日の日付が、「祝日の一覧」のどれかに含まれているか』の判定も、さほど難しくないはず。祝日一覧をループして、今日の日付と合致すれば、祝日という判定になる。
ということで、問題は**『祝日の一覧を何かしらの方法で取得する』**ということになる。

『祝日の一覧を取得する』方法だが、これは実は沢山ある。例えば、以下のようなものだ。

・テキストかCSVかExcelファイルに、祝日の日付の一覧を記入しておいて、そのファイルを読み込む
・データベースに祝日一覧を登録しておいて、そのデータベースを読み込む
・REST APIを使用して、祝日一覧を取得する。参考:[こちら](https://holidays-jp.github.io/)

ファイルの読み込み。データベース。API。
全てはわからなくても、この中のどれかはやったことがある。という人は多いはずだ。

そう、**ここまで細分化していけば、はじめの「祝日を判定する方法」という得体の知れない課題から、「テキストファイルを読み込む方法etc」に課題が変わっていることになる。**
これであれば、きっと出来そうと思えるのではないか。

ちなみに、祝日を管理する「ファイルの読み込み、データベース、API」について、それぞれメリットとデメリットはある。
例えばファイルの読み込みであれば、将来的に祝日を記入するためのメンテナンスが必要になる。データベースであれば、それに加えてデータベースを構築しないといけない。APIでは、そういったメンテナンスは必要ないが、実行にはネットワークに繋がっていないといけない。などなど。
そういったメリットデメリットはあるが、駆け出しであれば、どんなやり方でもいいから、まずは求められている機能を実現できることのみ意識してしまって良いと思う。
将来的に経験が増えれば、メリットデメリットを考慮した判断も、出来るようになるはずだ。

## まとめ

今回話した細分化によって、得体の知れない課題が、やったことのある課題に変わっていった。
このような細分化を、いかに適切に、いかに確実に出来るかどうかで、今後の成長は大きく変わってくる。
なので、もし成長していきたければ、今後はこの「細分化」をベースに入れて、勉強を進めていってほしいと願う。

実際の業務でも、これまでやった事がないことを手掛けることは日常茶飯事だ。
今回の例では「祝日の判定」なので、きっと直接的にググれば出てくる。
でも実際の業務では、何かしらの顧客のデータを使用しての判定だったりする。顧客のデータの判定なんて、直接的には、ググってももちろん出てこない。
細分化の能力が無いと、ここでだいたい詰まる。**「ググっても出てこない。オワタ！」**となってしまう。それまでの練習問題では、直接的にググっても大体出てきたけど、実務だと出てこない。出来ない。オワタ。となってしまうのである。
なので、細分化が必要になってくる。「何をする必要があるのか？」ということを、冷静に分析していく。それが必要になってくる。


なお、今回記載した「細分化」は、「自分が何を理解して、何を理解していないか」を、きっちり分けられる人であれば、必ず実現できる内容と考える。
もし仮に、細分化しようとしても、「全てが分からない」という状態になることがある。俗にいう「何が分からないのか分からない」状態だ。
その時は、その時は一回立ち止まって、基礎をやり直すことをオススメする。おそらく何かの知識か基礎が足りていないので、いったん回り道をしてでも、基礎の復習をしていってほしいと思う。


この記事が、誰かの力になりますように。