はじめに
最短かつ効率的にプログラミング学習をしたい
プログラミングをこれから学びたい人、あるいはすでに学び始めている人にとって、どのようにプログラミング学習を進めていくべきかは興味があるところだと思います。 「プログラミング学習のためのオススメロードマップ」 は検索すればたくさん出てきますし、私もそのように示されたロードマップを参考に学習を進めてきました。最短かつ効率的にプログラミングを学んでいきたいと思うからです。
しかし、学習を進めた中で明らかになったのは、本当に重要なものはロードマップではなかったということでした。
この記事では、具体的な学習ロードマップはお示ししません。その代わりに、最短かつ効率的に学習するために、これだけはオススメしたいことがたった 1 つだけありますので、それを伝えたいと思います。
プログラミング学習を進める上でもっとも大切なこと
結論:
「プログラミング技術習得自体を目的とした学習をしない!」
です。
「えっ?どういうこと?」となった方も多いと思います。プログラミングを最短でかつ効率的に学びたいのなら 「プログラミングを学ぶことを直接の理由としない」 方がいいのです。
遠回りのようですが、これがプログラミング学習最短のルートです。
それでは、具体的にどのような目的をもって学習をしていくべきか、答えは
「プログラミング技術を使わねばならない課題を見つけ、その解決を目的とする」
ことだと思います。
プログラミングを学ぶこと自体を目的としてよいのは、完全初心者の基礎習得部分のみ
本当のとっかかりの部分、プログラミングをまったくやったことのない方が基礎の学習をする時のみ、プログラミング習得を目的とした学びをすることは有用だと思います。たとえば、Python プログラミングをゼロから学びたいという人ならば、最初の基礎作りとして Progate やドットインストールなどの Web サービスは有用です。YouTube や Udemy などの Python に関する超初心者向け動画を見ることから始めることも良いでしょう。何もわからないところからのスタートですから、この選択自体は当然です。私自身を振り返っても、Progate と Udemy を利用して Python や機械学習を学ぶことから学習を始めましたし、その選択は今振り返っても良い選択だったと思っています。
ただし、問題はその後です。
なぜプログラミングを学ぶことを目的とした学習ではダメなのか
私自身のプログラミング学習の歴史をお伝えすることで、なぜプログラミング学習自体を目的とした学習ではなく課題解決型の学習が最善なのか、その理由を説明したいと思います。
Progate と Udemy を使い Python と機械学習の基礎知識を身につけた私は、当時、
「最近話題になってる Python、機械学習だけど、Progate と Udemy でちゃんと勉強したからだいぶ理解したな」
と思っていました。
そして、せっかくできるようになったのだからと、自身の職業(救急医)に関連した課題の解決に挑戦しました。具体的には「心臓が止まって蘇生治療を受けながら病院に運ばれた患者さんの、今後の予後を予測する機械学習モデルを開発する」という課題を設定しました。手元で得られる医療データを用いて、学んだ Python、機械学習の知識で挑みました。そして、課題解決に挑み始めてすぐに気づいたのです。
「まったく何もわかっていなかった」
ということを。
Progate や Udemy などの学習教材はわかりやすいですし、プログラミングの基礎知識はたくさん学べます。しかし、それをどうやって、どこで、どのように使うべきかが実際の課題ではまったくわからないのです。
スポーツで考えるとわかりやすいかもしれません。一生懸命練習をして、どんなに技術を磨いても、実際の試合で活躍できるかはまた別ということです。もちろん練習が大事ではないというわけではありません。ただ、試合でどう振る舞うべきかは、実際に試合をする環境に身をおかないとわからないことが多いんです。とくにプログラミング習得に関してはそれが顕著だと思います。プログラミング技術の習得にばかり目を向けて知識ばかり習得しても、実際にはそれを使いこなせないんです。
インプットのみで得られた知識だけでは課題解決がスムーズにできないことに気づいた私ですが、それでも課題は解決しなければなりません。そのため、個々の疑問点に関して、逐一 google 検索を行い、関連する学習動画をみて、本の該当箇所を読みながら、1 つずつなんとか疑問点を解決していきました。そして、すべての課題解決を完了した時、自身が本当の意味で python について、機械学習モデルについてその片鱗に触れることができたと感じることができました。「敵の実力がわかるのも実力のうち」 とはよく言ったものです。
その後の自身のプログラミング学習の歴史は、常にプログラミング技術を使わねばならない課題との出会いとその解決とともにありました。解決しない問題にぶち当たり、調べながら解決することの繰り返しです。しかし、課題解決をしていく中で、下記に示すように実に多くのプログラミング周りの技術をいつの間にか学習することができていました。
私が出会った課題とその解決策、得られたプログラミング周辺知識・技術
- 課題 1: 完成した機械学習モデルをぜひ実用化したい(アプリ化したい)
私の解決策: Streamlit での簡易アプリ化
課題解決の中での学び: Streamlit、エディター(Visual Studio Code)、フロントエンドとバックエンド、GitHub、Heroku。
- 課題 2: Streamlit のアプリはできたけど、アプリで入力してくれたデータがデータベースとしてそのまま保存できれば便利なのに。
私の解決策: Goole Cloud Platform の Google Spread Sheet API を使ってのテータベース化
課題解決の中での学び: GCP(AWS,Azure の存在も知る)、API、SQL、データベース
- 課題 3: Streamlit のアプリを実際に現場で使ってみると、レスポンスが遅すぎて実用的じゃない。
私の解決策: React ベースのアプリ実装
課題解決の中での学び: HTML、CSS、JavaScript、React、Next.js、Tailwind CSS
苦労して学んでいくことが、遠回りのようで1番の近道
元メジャーリーガーのイチローさんの言葉にこのようなものがあります。
「結果は困難を伴って出すべき。」
「遠回りすることってすごく大事ですよ。ムダなことって結局ムダじゃない。遠回りすることが一番の近道。」
プログラミングを効率よく学びたいからといって、わかりやすい教材を利用して、直接的なプログラミング学習ばかりやっていてはダメなのだと思います。プログラミング周辺技術を利用しないと解決できない自身の課題があり、それを解決するため必要に迫られてプログラミング技術をわからないながら学んでいく。気づいたら多くのことができるようになっている。ひどく遠回りのようですが、実はこれが一番の近道なのだと思います。
おわりに
いかがだったでしょうか。結局、自分ごとじゃないと人は覚えないんですよね。プログラミング習得を効率的にしたいのなら、是非とも自身の課題を必ず何か見つけ出し、その解決手段としてプログラミングを落とし込むことを心がけてみてください。課題を解決していく過程で、いつの間にかプログラミングが習得できているはずです。さらに、何らかの現実的な成果までも得られているはずです。そして、プログラミングがもっと好きになっていく。いつの間にか、良い学習循環が回り始めているはずですよ。
筆者について
平野 洋平
医師(救急専門医・集中治療専門医)
救急医療の現場に身を置きながら、起業家としての第一歩を fwywd 1 期生として歩み始めました。
すべての人がそれぞれの思う人生を最期まで十分楽しむことができる社会。医療の立場からそんな社会を実現したいと思っています。
心停止患者の予後予測モデルの医療現場での活用や、医学生・初期研修医教育に関するアウトプット思考型教育の推進についてなど、医療に関する課題をテクノロジーと協働して解決すべく活動しています。私の記事に共感してくれた方は、是非フォロー 👍 をお願いします。