なぜあなたのプログラミングスキルは向上しないのか？

# はじめに


私自身、未経験からプログラミングを学習して転職したこと、MENTAで50以上の人にプログラミングを教えている経験から、プログラミング学習の心構えについて思うことがあるので書き留めてみようと思います

5分ほどで読み終わるので、初学者の方は是非参考にしてみてください👀

`※ 客観的な根拠に基づく事実だけではなく、個人的見解も含まれておりますので、半分ポエムだと思ってお読みください`

`※ 人によっては痛いところを突かれて気分を害する可能性もあります。その場合はそっ閉じして日を改めてお読みください`

### 👉 メッセージ
**焦らず地道に力をつけていきましょう**
（全てをまとめるとこの一言に集約されます）

どんなに脳みそが優秀でも、全くの未学習・未経験の状態から1ヶ月勉強したぐらいでは実務をこなせるレベルのエンジニアにはなれません

**短期的な成果ばかりに目を向けず、長期的な視点を持つようにしてください**

ペンシルベニア大学心理学教授、アンジェラ・ダックワースの研究成果をまとめた「[やり抜く力 GRIT(グリット)――人生のあらゆる成功を決める「究極の能力」を身につける](https://amzn.to/30GGNsX)」によると、

**何かを成し遂げるには、才能よりもやり抜く力のほうが大事**

なようです

つまり、自分が努力することを諦める理由を才能のせいにしてはいけないのです

そもそも才能（人間の性能）の違いなんてせいぜい2〜3倍程度でしょう

あなたが人類で一番才能がない状態でGoogleのトップレベルのエンジニアを目指すわけでもない限り、人並みの努力をすれば必ず中級のエンジニアにはなれるはずです

ただ、**間違った努力をしても意味がないこともあるので、プログラミング学習の心構えを押さえておきたい人はこの記事の内容を意識しておくと良いかと思います**

### ❓ なぜこの記事を書くことになったか？
初学者の多くが、「ポートフォリオを早く完成させたい」「早く就職したい」と焦っており、**本質的な理解・学習ができてないと感じたから**です

今思うと、これまでの学校教育でも周りを見るとそんな人が多かったように思います

宿題の答えを書くことが目的となってはいけないのです
**似たような問題や見たことがない問題が出た時にも、自分の知識を活用して解けるようになることが目的のはずです**
（逆に教師側は、すでにできる人にも同じ課題をやらせるのはどうかと思いますが笑）

焦りやもどかしさを感じる気持ちはよくわかります

初学者はいろいろ覚えることが多く、それらが身につくまでにどうしても時間がかかってしまうからです😨


**しかし、時間がかかるのは人間の脳みその宿命です**
早々に諦めて地道にトレーニングしましょう🏋️‍♀️


**補足**
筆者は普段Ruby on Railsを主に扱っておりまして、言語としてはRuby, JavaScript（TypeScript）を使っておりますが、他の言語でも同じかと思います（というかプログラミングに関わらず、何かを学習する上では同じかなと）



# こんなことに気をつけよう
では具体的にどんなことに気をつければ良いか説明していきます

大きく分けて、やってはいけないこと（**アンチパターン**）とやった方がいいこと（**Tips**）の２種類あります

アンチパターンを避けるほうが大事なので先に書きます

## 🙅‍♂️ アンチパターン

### 📌 頭が悪いとレッテルを貼る（もしくは頭が良いというレッテルを貼る）
自分は頭が悪い（才能がない）からできないんだと考えるのは、百害あって一利なしなので今すぐやめましょう

**要は「やればできる感覚」を持つようにすべきということです**

最近話題の自己肯定感というやつですが、やればできるという感覚は実際に学校の成績を上げることが多くの実験でわかっています
（詳しくは「[マインドセット「やればできる! 」の研究](https://amzn.to/3rhlVUR)」が参考になりましょう）

つまり、**自身のマインドに介入することは、学習効果を高める大事な要素になっているのです**

ここで注意したいのは、とにかく自信を持てということではありません。

自分はできる人間（あるいは天才）だと思い込んでしまうと、失敗を極度に恐れて挑戦しなくなる危険があるのです :warning: 

これは難しい問題に挑戦して失敗したときに、できる人間であるはずの自分を否定することになるからです


### 🤷‍♂️ 自分で調べない
簡単に諦めるとも言います

何日も同じエラーに悩んで全く先に進まないというのも問題ですが、**ろくに調べもせずに答えを教えてもらおうとするのは問題です**

自分で考えずに答えを聞いた場合は、自分の考えのどこが間違っていたのかを理解することなく先に進んでしまうため、次同じような問題に直面したときに自分で解決できないのです

少し苦しい経験をしないと脳は学習してくれない仕組みになっているので、少しぐらい調べて自分で仮説を立てる習慣をつけておきましょう

脳科学的な良い学習の仕方が知りたい方は、「[使える脳の鍛え方 成功する学習の科学](https://amzn.to/3s7SZiB)」が参考になるかと思います

### 😇 意味を理解せずにコピペする
できない人ほどよくやりがちですが、似たようなやり方の記事を見つけて、ソースコードをそのままコピペするというものです

コピペ自体は悪いことではありません
効率的に作業ができたり、間違いが減るなどのメリットもあります

**問題は、なぜそのコードで動いているか理解せずに使うことです**

コードの意味を理解していなければ少しアレンジしようにもできるはずがありません

そして「こんな感じにアレンジするにはどうしたらいいですか？」などと質問するのはやめましょう

教えてもらって動くコードが手に入るかもしれませんが、あなたの脳みそには「コピペして教えてもらったという出来事」以外何も残りません😅

カンニングして赤点を回避するぐらいしょうもないことなので、こんなことはないようにしましょう


## 💡 Tips
ここから先は、「こんなことも意識すると良いかも」という内容です

いきなり全部やろうとするとパンクするので、少しずつ意識してできるようにしていきましょう🔥

### 😎 ちゃんと読む
文章を読まない人が割と多い気がします

ふつうに義務教育を終えている人であれば、文章を読めないということはないはずなので、ちゃんと読むようにしましょう

「いや、馬鹿にしてるのか」と思った方は、次にあげるものをちゃんと読んでるか自問自答してみてください

* **エラー文**
* **公式ドキュメント**
* **ネットの記事**（Qiitaなど）

特にエラー文はちゃんと読みましょう
大抵の場合はエラー文に答えかヒントが書いてます

英語が苦手な人は翻訳を使えば良いのです
（[DeepL](https://www.deepl.com/ja/translator)というアプリを使うと、「command + C + C」ですぐに翻訳してくれるので便利です）

ちなみに「ちゃんと読む」とは、書き手の意図どおりに文の意味を理解するということです
（文字を眺めることでも、自分の勝手な解釈で読むことでもないのです）

### 📝 検証する
初心者ほど検証しないという気がしています

検証するというのはもう少し具体的にすると、**どこまで正しくてどこで間違っているか確認するということです**

正しい範囲を潰していけば、間違ってる箇所（エラー原因）を必ず特定できます

そのために必要なことは「処理の流れを理解すること」と「デバッグ作業」です

* **処理の流れを理解する**

  * どの順番で処理が動くか理解する
  * 入力値が何で、出力値が何かを理解する


* **デバッグする**

  * この処理までは問題ないだろうという仮説を立てる
  * 上記の箇所で処理を一時停止して、期待通りにデータが処理されてるか確認する
  * 期待通りであればその先のどこかに、期待外れであればそれまでのどこかに間違いがあります

### ✨ 丁寧にやる
多少時間がかかっても丁寧にやりましょう
なぜ丁寧にやる必要があるかと言えば、そのほうが結果的に時間を節約できるからです

`※ 完璧にやれということではないです。ちょっとの注意でできることはやるようにしましょうというお話`

とりあえず初学者は以下のことに気をつけましょう:microscope:

#### インデント
インデントがずれていても言語によっては正しく動作します
以下はRubyの例（数字が偶数か判定するメソッド）ですが、これも正しく動作します

```ruby
def even?(number)
  if number.even?
          puts 'yes'
    else
puts 'no'  end
  end
```
上記は極端な例（逆に初心者には書けない笑）ですが、これだと理解に時間がかかりますし、直感的にendをつけ忘れている感じがします

インデントは特別な理由がない限り揃えましょう

#### タイプミス（タイポ）に気を付ける
タイポによるデメリットは以下の２つでしょう

* **バグが起こりやすくなる**
* **第三者から見たときにレベルが低いと思われて一気に信頼感を失う**

チャットでたまに誤記するくらいなら問題ないですが（人間なのでしょうがない）、たくさんの人に見られる文章には１つでもあってはならないという気持ちでやりましょう

プログラミングでも狭いスコープ内で一時的に使われる変数名などであればタイポしてても最悪許せます（修正もそこまで手間ではない）

しかし、テーブル名やグローバル変数の名前など、影響範囲が広いものに関しては修正のコストがかかりすぎるので、これをタイポしていると絶望的です（地獄の修正作業をするか、気持ち悪さを一生引きずって今後もタイポした名前を使い続けるかの２択になります）

<br>
`※ インデントやタイポは人間の注意力だけで０にすることは難しいので、Linterの力も活用しましょう`

#### 適切な名前をつける
名前を見ただけで中身がどんなものか想像できるととても読みやすくなります

例をあげればキリがないですが、初心者はひとまず以下の点に注意してみましょう

* 配列のデータが入ってる場合は複数形にする
* dataなど抽象的すぎる名前は使わない（何のデータ？ってなる）
* 何かを実行するメソッドなら動詞を入れる
* boolean型を返すメソッドなら「is」始まり、もしくは「？」で終わる名前にする（言語による）

定番ですが、「[リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック](https://amzn.to/38BhMDX)」にはかなり良いことが書かれてるのでエンジニアなら一度は読んでおくことをオススメします

#### 一気にやろうとしない
少しずつ正しく動作することを確認しながら実装していきましょう

ありがちなのが、`実装したい機能についてググる`→`記事のとおりに実装`→`エラーが出て解決できない`という流れです（割とみんな経験するかも）

コピペしてくるだけだと、あちこちに間違ってる部分がある可能性があり、それらを一つずつ検証していくのは初学者には大変だと思います

うまくやるには、以下のようにやってみると良いかと思います

**1. 日本語で処理のステップを書き出す**
**2. 最初のステップをコーディングする**（わからなければ調べる）
**3. １つのステップが書けたら実際に動くか確かめる**
**4. 次のステップをコーディング**（以降繰り返す）



### 👨‍💻 基礎力をつける
基本的なことができない（あるいはわからない）と、全体的な作業スピードが遅くなり、学習スピードも落ちてしまいます

誰かに教えてもらう時も、基礎的な部分ができてないとその分余計に時間がかかってしまうので少しずつでも改善していけるようにしましょう

以下もう少し具体的な内容を書いてみます

#### キーの名前
MENTAで教えていて割と衝撃的でしたが、「タブ」「コロン」が通じないことがありました…

こうなると「Qの左隣」とか「Lの２つ隣」とか説明しなくてはなりません:fearful:

マニアックなキーまで知っておく必要はないですが、基本的な名前は押さえておきましょう（とりあえず以下は最低限かなーと）

* 「tab」（タブ）
* 「:」（コロン）
* 「;」（セミコロン）
* 「_」（アンダースコア）
* 「'」（クォーテーション）
* 「`」（バッククォーテーション）

自信ない方は[こちらのサイト](https://www.goukaku.ne.jp/kowaza_kyename.html)など参考にしてみてください

#### タイピング速度
エンジニアといえど常にタイピングしているわけじゃないですが、ある程度は早く正確にタイピングできた方が良いです

チャットでやり取りすることもあるので、PCで仕事をする必要がある時代のうちは身に付けておきましょう！

訓練さえすれば誰でもできます（逆にどんな天才も訓練しなきゃできません）

[寿司打](http://typingx0.net/sushida/play.html?soundless)の高級10,000円コースでお釣りがもらえるぐらいにはなっておきましょう！🍣

#### ショートカットはなるべく使う
ショートカットなんて大して時間の節約にならないと思うかもしれませんが、ショートカットのメリットは時間節約だけではありません

ショートカットが使えると**些末な作業の負荷が下がり、「面倒だからやりたくない」という気持ちを回避してやるべきことに集中できます**

コピーペーストのショートカットは当たり前に使うかもしれませんが、以下もコピペと同じくらい当たり前に使えるようにしましょう！

* **操作系**
    * 「command + Z」でひとつ前の操作に戻る
    * 「command + shift + Z」で戻した操作をとりやめ（次に進む）
    * 「command + A」で全選択
* **検索系**
    * 「command + スペース」でアプリ検索＆起動
    * 「command + F」で単語検索
* **ウインドウ操作**
    * 「command + tab」で開いてるウインドウ切り替え
    * 「command + R」ページリロード
    * 「command + T」でタブを新しく開く
    * 「command + W」で現在のタブを閉じる
* **カーソル移動**
    * 「control + P (or N or F or B)」で上（下、左、右）に移動
    * 「control + A(or E)」で先頭（末尾）に移動
* **おまけ**
    * 「Z + K (or J or H or L)」で上（下、左、右）の矢印（日本語入力時）


他にも便利なものがいろいろあるので、[こちらのサイト](https://ledge.ai/mac_shortcut_matome/)などを参考に少しずつ覚えましょう

#### エディタの便利な機能を使う
VScodeなどのエディタには便利な機能がいろいろあったりします

マルチカーソルや検索、一括置換などを使えば作業時間が短縮できるだけでなく、正確性が上がるので、無駄なエラーを出さずに済みます

[こちらの記事](https://qiita.com/koki_73/items/56d9cdcf9c9033dba45c)にVScodeのよく使う基本的な機能を載せてあるので、このぐらいは使いこなして欲しいところです

#### 用語を理解する
専門用語は少しずつ覚えていきましょう

用語の意味がわからないとドキュメントを読んでも理解することができず、解決したい課題を解決することができません。。。

覚えるべき用語がたくさんあって自分には無理だと思うかもしれません
しかし、あなたが知っている全ての知識と比べたら誤差みたいな量です

**必ず理解できるようになるので、着実に習得していきましょう**

### 🙋‍♂️ 質問をうまくする
質問するにもいい質問と悪い質問があります

質問の良し悪しとは、**問題の内容をいかに正確に、そしていかに早く相手に伝えられるか**です

ベテランのエンジニアは質問力がうまいので、Googleでうまく検索して自分1人でも課題を解決できるのです

また実際に質問はしなくても、質問を考えるだけで解決までいけちゃうケースもあります
（[ラバーダッキング効果](https://d.hatena.ne.jp/keyword/%E3%83%A9%E3%83%90%E3%83%BC%E3%83%80%E3%83%83%E3%82%AD%E3%83%B3%E3%82%B0)というやつです🦆）

以下のポイントを押さえて、質問力を高めましょう！

#### 解決したいことを明確にする
まずは何が目的か明確にしましょう

「なんとなくこんな感じにしたい」というのはダメです
なるべく解像度を上げてイメージするようにしてください

どんな細かい実装でも、最終的なゴールのイメージは具体的にしておきましょう

#### 何がわからないか明確にする
初学者で質問が下手な人はここが絶望的にできてません

「なんだかよくわからないけどうまくいかない」

ということは言わないようにしましょう

ここがうまくできない場合は、前のステップに戻って「何を実現したいんだっけ？」と問い直してみましょう

自分が実現したいことと、そのために足りないことが明確になったらOKです

#### わかりやすい文章を書く
伝えたいことを明確にしても、わかりやすくなければ伝わりません
（改行なしでずらずら書かれた文章は、見ただけで読む気をなくしますよね？）

相手にとって読みやすい文章を書くのは最低限のマナーだと思ってください
読みにくい文章を書いて無視されたとしてもしょうがないです（無視する方も悪いですが）

文章を書いた後は、読み手になったつもりで読みやすいかチェックするクセをつけておくと良いです
（ちょっとした手間ですが、長期的な効果は大きいです）

とりあえず以下のルールを守っておけば大きく外しません

* **お願いごと１つ**
* **お願いごとについての説明３つまで**（箇条書き）
* **補足は最後に**（ここから下が補足とわかるように）

例）

> MacBookを買ってください<br> 
・ MacBookがないと悲しいです
・ MacBookがあれば生産性が上がります
・ MacBookがあればオフィスの雰囲気が良くなります<br> 
---以下補足---
つらつら・・・

### 🏃‍♂️ 運動する
😠「えーっ、学習に関係ないやーん」

と思った方は考えを改めましょう

運動によるメリットはいろいろありまして、ざっくり書くと以下の3点です

* **脳の可塑性を高める**（記憶領域を確保してくれる）
* **メンタルを改善してくれる**（ストレス解消）
* **集中力を高める**

とまあ、効率よく学習したいのであれば運動しない理由はないことがわかるかと思います

運動習慣がない方は、まずはウォーキングから始めてみると良いかと
（歩くだけでもそれなりに効果はありますので）

運動のメリットについて詳しく知りたい方は「[脳を鍛えるには運動しかない! 最新科学でわかった脳細胞の増やし方](https://amzn.to/3vBQBmk)」を読んでみると良いでしょう💪


# 最後に
いろいろ書きましたが、どれも一朝一夕で身に付けられるものではありません

また、冒頭で人の能力の違いはせいぜい2〜3倍と書きましたが、これまで培った力についてはそれ以上に開きがある可能性があります:joy:

（↑未学習・未経験の状態といえども、深い思考習慣がある人/ない人、学習習慣がある人/ない人、やり抜く力がある人/ない人などなど、さまざまな人がいるので）

学習する上での基礎スキルが足りない人はそこも合わせて強化していく必要があるので、その分時間がかかるのはしょうがないです:sob:
（未経験からでも習得スピードに差があるのは才能以外にもこの辺の影響も大きいということです）

とはいえ、プログラミングをある程度習得することに関しては、国立大学に合格することに比べたら遥かに難易度は低いと思われますので、挑戦したい気持ちがあるのであれば簡単に諦めないほうが良いかと思います

また、筆者自身も日々改善したり反省したりしながら業務をこなしており、一度身についたら終わりというものでもありません

これまでの自分を呪って学習を諦めるのは自由ですが、**ちょっとした意識を変えるだけでそのへんに転がってる中級者たちは余裕で追い越せるはずなので、コツコツやっていきましょう** 🧗‍♀️

**補足**
何がなんでも諦めるなということではありません

こんな苦労してまでエンジニアになりたくないと思うなら諦めれば良いですし、どうしても市場価値の高いエンジニアになりたいと思うのであれば、多少の苦労はあってもやり抜いてみましょうというお話でした

---
ここまで読んでいただきありがとうございます。
ご意見やご質問などあればコメントしていただければと思います

Twitterでも日々本の内容やプログラミング関係の情報発信しているので、良かったらフォローしてください :point_right:  （[アカウントはこちら](https://twitter.com/koki_eng73)）

# オススメ書籍・外部サイトまとめ

#### 書籍
* [やり抜く力 GRIT(グリット)――人生のあらゆる成功を決める「究極の能力」を身につける](https://amzn.to/30GGNsX)
* [マインドセット「やればできる! 」の研究](https://amzn.to/3rhlVUR)
* [使える脳の鍛え方 成功する学習の科学](https://amzn.to/3s7SZiB)
* [リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック](https://amzn.to/38BhMDX)
* [脳を鍛えるには運動しかない! 最新科学でわかった脳細胞の増やし方](https://amzn.to/3vBQBmk)

#### 外部サイト
* [キーの名前](https://www.goukaku.ne.jp/kowaza_kyename.html)
* [寿司打](http://typingx0.net/sushida/play.html?soundless)
* [ショートカット](https://ledge.ai/mac_shortcut_matome/)
* [VScodeの機能](https://qiita.com/koki_73/items/56d9cdcf9c9033dba45c)
* [ラバーダッキング効果](https://d.hatena.ne.jp/keyword/%E3%83%A9%E3%83%90%E3%83%BC%E3%83%80%E3%83%83%E3%82%AD%E3%83%B3%E3%82%B0)