人類は気づいていた。この勉強の仕方が1番早いということを。

# はじめに

**多くの勉強方法を試してきて、最後にたどり着いたのが問題駆動プログラミング法という学習方法でした**

世の中では[独学大全](https://www.amazon.co.jp/%E7%8B%AC%E5%AD%A6%E5%A4%A7%E5%85%A8-%E7%B5%B6%E5%AF%BE%E3%81%AB%E3%80%8C%E5%AD%A6%E3%81%B6%E3%81%93%E3%81%A8%E3%80%8D%E3%82%92%E3%81%82%E3%81%8D%E3%82%89%E3%82%81%E3%81%9F%E3%81%8F%E3%81%AA%E3%81%84%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE55%E3%81%AE%E6%8A%80%E6%B3%95-%E8%AA%AD%E6%9B%B8%E7%8C%BF/dp/4478108536/ref=sr_1_1?adgrpid=72300894944&dib=eyJ2IjoiMSJ9.YQZfJ4DHBh2JHi27OfOQArxGT9cVtErd2Y4y-brE-23zE6MADKUeSO_6qc__QGLU6dnxKmfQNX_dHpiJUEKRxXqoYiW85uIxc5ESe1psIfJ3TticDrlkf1rLzjigRLO7hmIeB1ZjbQFSAw-ibesQ1FvCjFrWNWBEQEB4d-ok5RQqdblKyP_29Sn7MWCWJqkxbAPB63lImzgVd5X_dWyvgg_8BgY77mGTdK3gMKh0ro0AiKG9JGbN2DcyHF4_5r2jb5imA47pkYl9nI7NO03W6hFsU3ZZLFvus0RL1E6aW9E.aeJc9HR8IidperUzoiBdhsduFAzXRssRpvqldmVrb7o&dib_tag=se&gclid=CjwKCAjwl4yyBhAgEiwADSEjeKAyhuDH1GuhYDZlrJskI8L4v3JMyfAX3ZysN-hTyxaVBji2zVJuZRoCU6oQAvD_BwE&hvadid=679003506238&hvdev=c&hvlocphy=9053361&hvnetw=g&hvqmt=e&hvrand=8687431828618939728&hvtargid=kwd-617795568440&hydadcr=16034_13711636&jp-ad-ap=0&keywords=%E7%8B%AC%E5%AD%A6%E5%A4%A7%E5%85%A8&qid=1715687513&sr=8-1)という本がベストセラーになるなど、学習内容ではなく、「勉強方法」を学びたいという人はとても増えています。

せっかく勉強するなら効率よくやりたいと考えるのは当たり前のことです。

<font color="red">**成果を出したいならその分野の努力の仕方を学ぶのが１番効率的で賢い**</font>

それは誰もが理解していることだと思います。

**「では、プログラミングの勉強の仕方を学んだことはありますか？」**

おそらく多くの人が自分なりに勉強をしていると思います。
なぜかというと勉強方法などの経験的な記事を書こうとすると「考え」を書くことになるため記事を書くのがとても大変でなかなか世の中には「これをやれば確実」という勉強方法を紹介している記事は少ないです。

これはエンジニアが基本的に「技術」を発信することが多くなるので仕方がないと思います。

しかし「勉強方法」を間違えてしまうとそれは効率に大きく影響してキャリアにも大きく影響することになります。

私はよく**自己流の自己は事故である**と言っているくらい自己流でやると失敗することは多いです。

そんな私も過去に数百時間を無駄にした経験があります↓↓

https://qiita.com/Sicut_study/items/cff86da10b8ee0809ccb

**そもそも世の中に同じタイミングで勉強を初めて開発力がつく人とつかない人の差が生まれるのでしょうか？私はプログラミングの学び方に違いがあると思っています。**

今回は**問題駆動プログラミング法**という私がたどり着いて学習の仕方を紹介していきます。

# 役に立つことでなく必要なことを学べ

問題駆動プログラミング法を説明する前に、「インプット」と「アウトプット」についての説明をすこししていきます。

あなたはインプットが多いでしょうか？アウトプットが多いでしょうか？

私がみてきたエンジニアでキャッチアップが早い人はとにかくアウトプットベースで学習を進めています。
問題駆動プログラミング方もこのアウトプットの理論を取り入れた学習法なので、**インプットではなくアウトプットが大切なのかをまずは理解してもらおうと思います。**

インプットとアウトプットの違いを理解するには、「知識と知恵」の違いを理解する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/507a06d9-beb8-2ec5-aeb2-c341d563bc2e.png)

あなたは車の免許を取得したときに学んだ「応急救護」を今目の前に人が倒れていたとしたら適切にできるでしょうか？

おそらく医療関係、消防署関係などでなければ自信をもって適切にできないと考える人が多いはずです。

**まさにこれが知識なのです**

知識と知恵の違いを検索すると以下の説明がでてきます

>『知識』は情報を知っていることを指すのに対し、『知恵』は知っているだけでなくそれを活かす能力だと言われています。 

つまり**身についているか身についていないか**が違うわけです。

知識は「役に立ちそうなこと」を指します。
応急救護も将来的に役に立つから教わります。しかし、「役に立ちそうなこと」は役に立つことがそもそもなく、必要なときには再度学ばないといけません。

では、消防署に務める人からみた「応急救護」はどうでしょうか？
おそらく現場でもかなり高い確率で使う必要があるため、誰もがしっかりと適切に行うことができます。**知恵は「必要なこと」** なわけです。

これがインプットとアウトプットの大きな違いになります。
インプットは基本的に役に立ちそうことを学んでいるだけで、実践する理由がないため身につけることができません。

<font color="red">**アウトプットを中心に学ぶことは起きた問題に対して必要なことだけを学んですぐに実践できるためしっかりと身につけることができます**</font>

# インプットばかりになるのは日本の教育が悪い

もしあなたがインプットで学習をしているのであれば、それはあなたのせいではありません。

**日本の教育のせいです**

学校では教科書を読みながらインプットを進めていくような学習方法を当たり前にやっており、疑問を思うことは少ないです。

しかし、世界をみるとこの学習方法をするところは少ないです。
アメリカなどではアクティブラーニングという、行動して学ぶということを中心に教育が行われます。

**学ぶ→わかる→気づく→行動する**というのがインプットの考え方ですが、ぜひとも逆の**行動する→気づく→わかる→学ぶ**という順序で学習を進めていけると効率よくプログラミングを学習することが可能です。

# 実務経験がなぜ成長できるのか

「実務経験をすると成長できるから、とりあえず転職して実務経験を積もう」

こんな言葉耳にしたことありませんか？

なぜ実務経験をすると成長できるのかは、知識と知恵の違いを理解視することができれば簡単に理解することが可能です。

実務経験は仕事でプログラミングをやることです。
仕事ということは「仕事で求められることだけをやること」つまり「必要なこと」に当たるわけです。

なにか仕事をしていてわからないことに遭遇して、いろいろ調べて実際に試してみるという**アウトプット中心の学び**をしているのです。

このように考えると、**実務経験を積んだほうがいいと考える人がいますがしっかりとアウトプット中心の学習を進めていれば実務経験に勝るような効率の良い成長は可能なのです。**

# 問題駆動プログラミング学習法

ここまでの話を理解したあなたであれば私が行っている「問題駆動型プログラミング学習法」がどのように行っているのかもわかるはずです。

この学習法では**いきなりアプリケーションを作るところから学習を始めていきます**

例えば新しい言語であれば、そもそも環境構築がわからない問題にぶつかるはずです。

**問題にぶつかったときに初めてインプットをして学び、試す**このサイクルを繰り返してアプリケーションを作り上げていくという学習方法です。

これは<font color="red">**必要なことを最低限だけインプットするため最速で学習ができ成果物もしっかり出来上がります**</font>

この学習方法をしっかりと実践するだけで無駄なインプットが減りどんどん成長が可能です。私は「問題」を「ギフト」と考えています。人は問題が起きることで成長する機会が与えられるのでそのギフトをたくさん受け取れることは大きなメリットになります。

ちなみにこの学習方法は**テスト駆動開発(TDD)から由来しています**

この学習方法はTDDとかなり似ていると思っています。
まずはテストを書いてエラーを起こし、そのエラーを解決するだけの必要最低限の実装をしてアプリケーションを作成する。

まさにこの考えと問題駆動型プログラミング学習法は同じです。
アプリケーションを作って、問題が起きたときにだけ調べてインプットすることができる。

この学習を意識するだけでものすごく効率良く学習が可能になりました。

# おわりに

世の中ではアウトプットを良いことはわかっていても実践できていない人がたくさんいます。頭ではわかっていてもできないのは理解がしっかりとできていない、つまり言語化ができていないことだと考えます。

今回の内容を読んでアウトプット中心の学習が大切と理解して成長していく人が1人でも増えたらアウトプットガチ勢としては嬉しい限りです。

ここまで読んでいただけた方はいいねとストックよろしくお願いします。
@Sicut_study をフォローいただけるととてもうれしく思います。

また明日の記事でお会いしましょう！

# JISOUのメンバー募集中
プログラミングコーチングJISOUではメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？

気になる方はぜひHPからライン登録お願いします👇

https://projisou.jp