pospomeが普段やってる新しい技術の勉強方法

株式会社カミナシで VPoE を務めている pospome です。 (´・ω・`)

先日新しい技術の勉強方法を質問されたのでまとめてみようと思います。

結論から言うと、自分は以下のステップで勉強します。

Step1. とりあえず動かす。
Step2. 体系的に知識をインプットする。
Step3. 実際に何かを作ってみる。

Step1. とりあえず動かす

学習対象がプログラミング言語であれば、公式のチュートリアルなり、単なる "Hello, word" なり、とにかく動かしてみる。 これは "ローカルで動かす環境を整える" と言い換えても良いかもしれない。

"ローカルで動かす環境を整える" という表現を使ったが、ゆーて結構手を動かす気がする。 時間にすると・・・数日くらいはなんだかんだで何かしら触って遊んでいる気がする。 基本的な機能や仕様は一通り触ってみて、なんとなく技術の特徴みたいなものを掴んだら Step1 は終了である。

TypeScript/Reactの勉強をしたときは以下をはじめとするチュートリアルや簡単なロジックを自分で書いてみた気がする。

チュートリアル:三目並べ – React

Step2. 体系的に知識をインプットする

ローカルで動かす環境が整ったら、体系的に知識をインプットする。 プログラミング言語であれば書籍で入門書を読んだり、公式のリファレンスを読んだりする。 クラウドであれば、利用するサービスの公式ドキュメントを一通り読む。

最初に体系的に知識をインプットすることで「こーゆーことできるんだ」とか「こーゆー機能があるんだ」とか、その技術に対する理解が深まる。 この知識のインプットはひたすら読み込むだけで、手を動かすことはあまりない。 インプットにかける時間の目安は特にない。 「もういいかな」と思うまで時間をかける。 インプットがクラウドの公式ドキュメントであれば、数時間あれば読み切れると思う。 入門書とかだと・・・数日程度で読み切れるものを選ぶのがいい。 分厚い本だと、読み切る前に力尽きてしまったり、手を動かすフェーズにたどり着くまでに時間がかかりすぎる(役に立たない知識をインプットしてしまうリスクもある)。

インプットした情報は、一言一句記憶に残す必要はない。 多少理解できないものがあってもいーし、「ここは不要そうだな」と思ったらスキップしてもいい。 困ったときに「そーいえば、これを解決する機能があったような・・・」と思い出して読み返せばいいのだ。 極端な話、書籍の目次に目を通すだけでも良い。

自分がTypeScript/Reactの勉強をするときは以下を読んだ。


「3冊も読むの? 読み終わるのに時間かかるのでは?」と思うかもしれないが、そのとおりである。 まあまあかかった。 ただ、これは必要経費だと思っている。

というのも、はるか昔の「jQueryを使っていればOK」な時代ならまだしも、最近のモダンフロントエンドはとても複雑であり、学ぶことが多い。 自分はエンジニアとしてのキャリアとしてバックエンドやインフラしか触ってこなかったこともあり、体系的に知識をインプットするには、それなりの時間がかかる。 というか、かける必要がある。 TypeScript, React の知識だけでもそれなりのボリュームになりそうなのに、ビルドツールやライブラリも学ばなければフロントエンドの実践スキルは身につかないだろう。

そう考えると、それなりの時間をかけて上記の3冊を読み、それらの知識を体系的に身に着けられるなら、安いもんである。 結果的に上記の3冊を読んだおかげでモダンフロントエンドについて広く学ぶことができたし、 "何をどの順番で学べば良いのか" という地図みたいなものをイメージすることができた。(この書籍があって本当によかった・・・)。

インプットにかける時間は学習対象と自身のスキルセットによって大きく変わる。 ちょうどいいところを狙いたいものである。

Step3. 実際に何かを作ってみる。

Step2で体系的な知識をインプットしたら、実際になにか作ってみる。 ひらすら作る。 作る過程で必要な調べ物をすることはあれど、基本的にはひらすら作る。

自分は最初にTODOアプリのような簡単なものを作ってから、次にもう少し難しいものを作る。 例えばLINEやXのような自分が仕様をよく知っているものである。 ここで変にオリジナリティのあるものを作ろうとすると、学習対象となる技術の勉強ではなく、アプリケーションの仕様などに凝ってしまい、時間が溶けていくので注意が必要である。

また、新しい技術と使い慣れている技術を組み合わせる場合、使い慣れている技術に労力はかけない方が良い。 例えば、Go言語を勉強するためにWebアプリケーションを作る場合、RDBに使い慣れているMySQLを使うとする。 ここでMySQLで変に凝ったテーブル設計とかをすると、そこに時間がかかってしまうので、MySQL領域は簡易的な実装で済ませた方がいい。 当然ながら「せっかくだからAWSのDynamoDBを使うぞー」という感じで使い慣れていない技術を使うのも避けたほうが良い。 学習対象を広げてしまうと、学習コストが高くなって、結果的に何も身につかずに途中で飽きて終わる可能性がある。 MySQLやDynamoDBの勉強をしたいわけではないのだ。

仮に複数の技術を学びたいのであれば、ステップ・バイ・ステップで学ぶことをおすすめする。 自分はTypeScript/Reactの勉強をする際に、まずはTypeScriptを学んだ(Reactは無視する)。次にReactを学ぶ。次にLinterやビルドツールの設定系を学ぶ・・・というように1つ1つやっつけていくと良い。これを全部一緒にやろうとするとエラーが発生したときにTypeScriptの問題なのか、Reactの問題なのか、ツールの設定の問題なのかがわからなくなって沼ったりする。

最近だとGitHub CopilotなどのAIエージェントにコードを書いてもらったり、 不明点を質問したりすると、効率よく学習できると思う。 上手く使ったほうが良い。

まとめ

今回は自分が普段やっている新しい技術の勉強方法を紹介しました。

Step2 で体系的に知識をインプットするのに、それなりの時間をかけるのが特徴かなと思っています。 自分が使う技術のことを広く浅く知っておくことで「そーいえば、こーゆー仕組みあったような・・・」という感じで、適切な設計方針や実装方針を選択することができるので、個人的には気に入っています。 というか、自分の性格みたいなところもあると思っていまして、 自分は知識をインプットすることに面白みを感じたり、 知らないことや不十分なことがあると気になってしまうタイプなので、 インプットに時間を割くことで、これらを解消しようとしているのかなと思っています(なので万人向けではないかもしれないですね)。

ただ、重要なのは "とにかく手を動かすこと" です。 手を動かすことによって、書籍や公式ドキュメントでは得られない知見を得ることができます。 目指せ脳筋プログラマー

宣伝

株式会社カミナシでは以下のポジションをすごく募集しています。 興味のある方は応募してみてください。