プログラミングを勉強したい人がやっておいた方がいいこと2022

## 留意点
- （※）将来的には陳腐化しそうな気がしたので、タイトルに2022を入れています
- （※）ずっと下書きだと思って公開していた事に気付かないで放置していた記事なので、古い公開日になっています

## 対象読者
- これからプログラミングを勉強する方（勉強中の方）
- 後進育成に課題をお持ちの方
- 新卒研修の人材開発部

## 言いたいこと（≠結論）
1. アルゴリズムを軽視すると、結果的にシステムを組めない人材になってしまいます。
1. アルゴリズムは一朝一夕では身につかないものです。教えられるものではなく、気付くもの。
1. プログラミングを学ぶ上で重要なのは知識ではなく探し方・調べ方です。研修で使った言語以外でも活かせればエンジニア教育として成功と言えます。

本日はこの観点で、プログラミングを勉強したい人がやっておいた方が良い事を挙げていきます。
もちろん、今勉強中の方も活かせますし、業務である程度使えている方にも振り返りになると思います。

## 「プログラミングを学べばプログラムを組める」の勘違い
まず、プログラミングでシステムを作るには大きく分けて4つの知識（※漏れ抜けがある可能性が高いので、本来はもっとある）が必要です。

- プログラムを書く方法：エディタ
- プログラムの書き方：言語やフレームワークの仕様
- プログラムの組み立て方：アルゴリズム
- プログラムの動かし方：インフラ

言語化すると「エディタを起動して言語に合わせたコードを書いて、構築されたインフラの上に正しいアルゴリズムで組み上げたアプリを乗せて動かす」と言えます。

正しいエディタ（特にIDEの使用を前提とするガチガチなフレームワーク）を使わないと開発もままならず、
エディタの使い方が分からないとデバッグも難しく、
仕様が分からないとプログラムを組めず、
プログラムを正しく組めないと期待通り動かず、
動くプログラムも、違う環境で動かそうとするとうまくいかない

一口に「システムを作る」と言っても、細分化すると様々な知識が必要になりますが、具体的にどういう知識が必要で、どこを学習していくべきか意識しないと、実力が伸び悩みがちになります。

### 「プログラミングスキルを高める」の意味を正しく知る
まず「プログラミングスキル」とは何かを考えましょう。
先に回答をすると「TPOで異なる」ので「プログラミングスキル」という言葉ほど抽象的なものもありません。

ここでは「与えられた課題を素早く解決する」「問題（障害）が生じた際に解決に導く」の２つを考えてみます。

どちらにも言える事ですが、問題点を正しく捉えて仮説を立てながら解決アプローチを検証していく経験を積む事で、ご自身の中に経験則を積み上げていく事ができます。
前者ならアルゴリズムのパターンを、後者ならエラーメッセージや解決傾向をノウハウとして蓄積することで改善・向上が見込めます。

#### 与えられた課題を素早く解決するために
一番手っ取り早いのはテンプレートを自分の中で持っておくことです。
多くの問題を解いて、どういうケースでテンプレートが使えるか、あるいはテンプレートとして活用できるかどうか見定めながらブラッシュアップしていきましょう。

既に勉強中の方向けに、どういったサイトが適切か挙げておきます。
基本的には、問題を多く解いていくという本質は変わりません。

- [SQLbolt（英語ですが、簡単なものです。翻訳もできます）](https://sqlbolt.com)
- [paiza転職（プログラミングスキルチェック）](https://paiza.jp/challenges/info)
- [Project Euler(プロジェクトオイラー：日本語PukiWiki)](https://odz.sakura.ne.jp/projecteuler/)

この辺りがステップアップも込みで定番かなと思います。他にも良いサイトがいっぱいあるので探してみましょう。
なお「プログラミングスキル向上には数学が必要」と言われる事が多いですが、数学（アルゴリズム）であれば関連する部分はありますが、特に数学の公式や定義などを理解する必要はありません。
分野によりますが、AI開発では有用かもしれません。

#### 問題が生じた際に解決に導くために
まず、エラーメッセージをそのまま読めば解決できるわけではない事を理解しましょう。
エラーメッセージはあくまで原因で、原因を解決する方法は別にあります。
そして、原因の解決方法は環境依存である事がほとんどなので、解決方法は「探すより考える」事になります。
とは言っても、大体の場合はエラーログを読めれば何が起こったのか、原因となる事象が何かを推測できるようになります。

たとえば、空き容量がなくてファイルが作成出来なかった場合を考えてみます。
エラーメッセージを見ると「ファイルの作成に失敗しました」としか書いていない事が多いです。
エラーログを見ると、どのタイミングで処理が実行されたのか分かりますが、あるタイミングからファイルが作られなくなった事が分かります。
（補足：今回のようなケースだと、エラーログ自体が破損する恐れがありますが、今回は無事だったと仮定します）
ファイルの作成に失敗する原因も色々ありますが、今までファイルの作成が出来ていて、あるタイミングから動かなくなった場合などは「初期・最後のファイル出力時の頃と現在では環境が変わってしまった」可能性を疑う事ができます。
後は、環境が変わる可能性があるものを考えて、一つずつ試してみる事になります。

まとめます。

- エラーメッセージは「ファイルの作成に失敗しました」
- 問題点は「空き容量がなくなったため、ファイルの作成ができないこと」
- 解決方法は「空き容量を作った」

勉強中でも実務でも、今回のような問題と解決は度々発生します。

なお、これは裏技的ですが実務でよく使われるテクニックなので紹介します。
普段からバックアップを取っておくと、障害発生直前まで復旧する事ができるかもしれません。
今回は解決できましたが、どうにもならなくなった場合にバックアップできるように一度はリカバリを経験しておくと良いです。

### プログラミングスキルについて、もう一度考えてみましょう
今回は二例挙げましたが、他にも様々なシチュエーションでの「プログラミングスキル」があります。
ドキュメントからシステム設計、実装を組み上げるのもプログラミングスキルと呼ばれる事があります（実装じゃないからプログラミングではないのでは？と考える方もいます）し、実装したプログラムをテスト（デバッグ）し、問題を解消するのもプログラミングスキルと呼ばれたりします。
どちらも根幹にあるのは「問題があり、解決する方法（仮説）を立て、実践する」という事です。
上記で挙げた４例で言えば、アルゴリズムの部分がこれにあたります。
まずは何を学ぶべきか？という最初のテーマに戻ると「よく分からないうちはアルゴリズムを強化する」と良いでしょう。

他にも色々な「プログラミングスキル」が存在している（＝定義がTPOで変わる）ため、プログラミングに関係するものの総合力と捉えてスキルアップに励んでみてください。

## おまけ：独学でプログラミングを学ぶ時のよくある勘違い
### 既にある程度勉強している方が、第一章から読む必要はない
初学者が勉強を目的にする場合、プログラミングテキストの１章から順番に最後まで読み進めたくなりますが、読者（あなた）のレベルに合わせてつまみ食いするように読み進めたほうがタイパが良いです。
タイパがピンと来ない方には、モチベーションを下げないために読みたいところから読み進めていきましょう。
コスパを考えると勿体ない気持ちもありますが、クラウド時代のITの勉強は有料です。

#### 補足：ITの勉強代は有料？
まず、終身雇用世代のような「業務で必要な事は会社が教育しろ」という時代ではなくなってしまいました。
今は「仕事をしたいなら自分で勉強して出来るようになってから来い」という時代です。
これが良いか悪いかについては論じませんが、そんな中で新卒者に向けてしっかりと研修する会社がどれだけ学び良い環境であるかを改めて認識する必要があります。

現状を認識してもらった上で、どうやって勉強を進めていくかを考えていきましょう。
「運の良い」新卒者は厚遇されますが、今現在または今後も発生するであろう中途者を救済する仕組みは、失業者なら就職支援センターが有力です。
が、就職センターで学ぶぐらいなら有料ですがITスクール事業社のパッケージを買った方がメリットが大きいです。
なお、新卒者の研修費は会社が出しています。新卒は無料で研修してもらえるということではありません。

### コスパの高い学習方法
さて、本の読み進め方を考えます。
誤解を恐れずに言えば、大体のテキストの章立ては同じで表現が違うだけなので、違う言語の本だったとしても入門書を３冊買っても仕方ないです。
同じ言語で違う出版社のテキストを１冊買ってみて、よく分からない部分があれば別のテキストを買って比較してみるのは有効です。
もし２冊テキストを使っても分からない部分があれば、３冊目のテキストで理解できる可能性もあります。
が、そもそも単元自体が腑に落ちていない可能性が高いので、本の内容を検索して情報を集めたり、初心者が質問できるサイトを探して聞いてみるのが手っ取り早いです。
とはいえ、**質問サイトもピンキリ**なので、回答が来なかったり内容に満足できなければ「回答へのお礼を述べて、質問を終了してから」他のサイトで聞いてみるのも一つの手ではあります。
初めての質問で、初学者向けのテキストの内容ならyahoo知恵袋が良いかも知れません。
一般に、質問が専門的になればなるほど回答できる方も少なくなる事は留意しておきましょう。
市販本で勉強する時は陥りがちなのですが、手元のテキストは入門書とはいえ専門書です。

---

---

## 研修現場トーク
初学者がプログラミングを難しいと感じるポイントで多い割に講師がフォローできないものの一つにアルゴリズムがあります。
座学を頑張る方ほど、プログラミング研修の内容を学校のテストよろしく覚えて解決しようとしますが「まずは自分で考えて解決できる」成功体験を得てもらう事を試行錯誤されていると思いますが、カリキュラムの進捗の都合などで受講生に伸び伸びと演習課題を解いてもらう時間を作るのが難しかったりしますよね。
個人指導だと（極端ですが）時間を気にせず演習に取り組んでいただけますが、本業もあるので受講生に余裕がない事もあります。

こういった問題も含め「いきなりプログラミングを勉強しよう！」と思っても何から始めればいいか分かりにくいのもプログラミングの学習コストを高めている要因です。
本稿を読んでもらえば「困ったらアルゴリズムを強化しよう」と思えるかと思いますが、指導中は質疑応答である事も多いかと思います。
が、実際問題として、メンターとして受講生の質問対応時に自分の考えを押し付ける行為は不信感を買ってしまいますので、信頼関係が構築できていない場合には満足な指導は難しいですね。
せめて講師や周りの先輩エンジニアなどに現場経験などを聞く機会を作ってみるのも良い勉強の場になることを認識してもらうだけでも大きな学びになると思います。
特にITスクール講師の立場ですと契約もあるかと思いますが、受講生にとって一番良いものは何か、それぞれの講師哲学から導いてあげていただけると、将来的に受講生と同じ業務を担う事になる際に頼もしい仲間となってくれる事でしょう。

## 次の記事
- [(7日目) 子供向けのプログラミングドリルは新人研修で使えるか？](https://qiita.com/nomurasan/items/85be0d822b50235205b0)
- [カレンダーページ](https://qiita.com/advent-calendar/2022/oreno_nomurasan2022)