自分で考えない勉強法 一度にいろんなソフトウェア技術を学ぼうとして挫折しないために

リチャード 伊真岡 blog

自分で考えない勉強法 一度にいろんなソフトウェア技術を学ぼうとして挫折しないために

過去に私が新しく技術を学んだときに「この勉強方法は失敗したなー」というやり方の共通点がわかってきました。学生時代を合わせるとプログラマ歴15年を超えてようやく、挫折するとわかっている勉強法のパターンが明確に見えてきたので、同じ穴にハマらないよう誰かの助けになればと思いここに残します。

言いたいことは「急がば回れで、技術は一つずつわかるところから勉強しよう」です。これだけでわかってしまった人は、そっとページを閉じてください。

よくある挫折パターン

新しく何かを勉強するときに「小規模でもいいから動くアプリケーションを作りたい!」という目標を建てることはよくあると思います。しかしそのとき:

  • アプリケーションをつくりながら勉強し、自分の勉強したい技術を組み合わせてつくる
  • 理想の開発ツールチェインを最初から整えようとする

といったやり方で勉強していないでしょうか?それが今回テーマにしている挫折パターンです。

「よし、今までフロントエンドばかりやってきたから、今日からバックエンドの勉強しよう!言語はJava、そしてSpring Bootを使おう!本番環境で走らせること考えるとDocker化は必須でしょ。Amazon ECSと組み合わせて、あとDBも必要だから…MySQLをRDSでセットアップして…」「(2週間後)あれ…?自分はまだ20行しかJavaのコードを書いてないぞ??」

あるいは

「フロントエンドのときみたいに、バックエンド開発環境にホットリローディングの仕組みを取り入れよう!…としたら1週間溶けた!!」

こういった状況に心当たりのある人はいるでしょうか?そんな人にはこの記事が役に立つと思います。

公式ガイドにしたがって単一の技術要素を学ぶ

現代のアプリケーションはどんどん複雑化していっているので、たとえ小規模アプリケーションでも複数の技術要素を組み合わせることがほとんどでしょう。ここで私が技術要素と呼ぶのは単一のライブラリ、フレームワーク、クラウドサービス、あるいは単一のプログラミング言語といったものです。

学習の目的をアプリケーションの完成に置く時、複数の技術要素を新たに学ばないと完成にたどり着かないことがよくあります。しかし、勉強における挫折を防ぐために一つずつ技術要素を学びましょう。ここが今回最も主張したいポイントです

新たな技術要素を学ぶ時は公式の入門ガイド、もしくは定番のような評価の高い入門教材をもとに勉強しましょう。ここで選ぶべきはアプリケーションを作成するためのガイド、ではなくJavaならJavaの入門、Spring BootならSpring Bootの入門をする、ということです。こうした入門ガイドはそれぞれの技術要素のコア開発者らが、入門者の裾野を広げるため相当なリソースを割いている場合が多いので質も高い事が多いです。

「郷に入っては郷に従え」あるいは「守破離」の守といえるかもしれませんが、それぞれの技術要素にはそれぞれの背景思想や作法があり、まずは単一の技術要素についてそれを学ぶのが遠回りに見えて近道なものです。ココをすっ飛ばして複数の技術要素を組み合わせることを急ぐと「なんでこんな設定をしないといけないんだ」「ここが自分の思ったとおりに動かない」と、それぞれの技術要素の作法を無視した動作を実現するため四苦八苦する羽目になります。

こういった背景思想や作法を学ぶために、あるていどまとまった量の入門教材が適しているでしょう。もちろんJavaの入門書などといったら、400ページや600ページあるものはざらにあるので、全部を学ぼうとせず2割くらい理解できれば御の字くらいの気持ちでいると良いでしょう。

現代のソフトウェア技術は複雑化していっているので、オンライン教材にしても本にしても、どうしても「見て学ぶ」量は多くなりますが、だからこそ手を動かして書くことも必要です。昔からプログラマ界隈に伝わる写経、つまり教材のコードを書き写すことは効果があります。ある程度経験を積んだ技術者はつい「自分は読んだだけでわかる」と思いがちですが、そんな人にも写経は効果があります。本当です。ただ、教材の全てのコードを写経する必要はなく、また時間がかかりすぎるためするべきでもありません。当然書くことは読むことの何倍も時間がかかるので、自分が気になるところを中心に書きましょう。そのさいパラメタを変えてみる、printfデバッグを仕込んでみる、ちょっと書き換えてコンパイルエラーに怒られる、といったことを試すとより理解が深まります。

単一の技術要素を学んでいきづまったら

一生懸命教材を見て、手を動かしてみても全然わからない、ということはあるとおもいます。そういう時試してもらいたいことは。

  • 手を動かす…本当に手を動かしましたか?手を動かせと言っても、面倒くさがって手を動かさない人はいっぱいいます。動かしてください。それでわかることは思った以上によくあります
  • わからない単語を調べる…それでもわからない場合、教材に未知の単語があるために全体がわからなくなっている可能性があります
  • 別の入門教材、ブログを探す…自分が選んだ教材の解説スタイルが合っていないのかもしれません。ぱっと探して出てきたブログなどがヒントを与えてくれるかもしれません
  • ビデオ教材を探す…最近はプログラミングに関するビデオ教材が盛り上がっています。その分質の悪い教材もたくさん出回っているのですが、わからないときに探してみる価値はあります。

ここまできてわからなかったら、あきらめるのもひとつの手です。残念ながら時を経て他の知識が増えてからでないと入門しづらい技術要素というのはあり、たとえばSpring Boogに入門するときに、Javaも全くわからない、データベースも触ったことがない、という状態だと入門は厳しいでしょう。そんな状態ですこしSpring Bootを触ってみて、わからなかったら諦めてJavaから学ぶ、データベースから学ぶという道のりが必要になります。

最初に勉強する技術要素の選び方

ここまで技術要素を学ぶときは、組み合わせ方を学ぶんじゃなくて一つずつ学ぶという話をしてきました。ここからはその最初に学ぶ一つ目の要素をどれにするか?という話をします。

自分が一番学びたい、ピンときたものがある!という場合はそれを優先するのが一番ですが、そうでない場合は

  • UIを持つアプリケーションを作りたいなら、UIを実現する技術要素から学ぶと完成品がイメージしやすい
  • とりあえず自分に馴染みのある要素、挫折しにくい要素をさわってみる
  • ランダムに始めて、ピンとこなかったら別の技術要素を試す

といった方法を勧めます。とはいえ正直、勉強し始めてしまえば進むものだし、技術の楽しさは触ってみたあとで分かるものなので、触る前に最適な選択を考えることはあまり意味がないと思っています。「これじゃない」と思ったときはいつでも戻って別の勉強をすればいいです。学んだことは無駄になりません。ソフトウェア開発技術は相互に関わり合っているものなので、学んで途中で放り出したことでも、後で役に立つことは結構多いものです。

自分で考えない勉強法

あらためてこの記事のすすめは、言い換えると「初心者のときは自分で考えない」ということです。最初から自分で理想の技術の組み合わせを考えてすすめるより、まずはひとつひとつの技術要素を公式ガイドや定番の教材で学んでからのほうが、より具体的で現実的な技術要素の組み合わせでアプリケーションを作成出来ると思います。

勉強をしているとついつい急いでアプリケーションなどわかりやすい形での成果物を作りたくなってしまいますが、自分が新たに覚えた知識もしっかりとした成果なので、そこを自分で認めてゆっくり学んでいけばいいんじゃないでしょうか。そっちのほうが長期的には早く学べると思いますし、どうせ5年とか10年とか長くソフトウェア技術者をつづけるつもりなら、今あせって知らない技術盛りだくさんで完成品を作る必要もないと思います。