見出し画像

エンジニアとしてのインプット方法をまとめる

※ この記事は、鹿児島高専インキュベーションプログラム「SPARK」の一つである「プロダクト開発」 (以降、単に SPARK と呼称します) におけるメンターLTの資料となります。SPARK は、monoDuki合同会社による鹿児島工業高等専門学校アントレプレナーシップ教育プログラムです。


この記事が目指すところ

Web アプリケーション開発を主戦場とする現役ソフトウェアエンジニア (以降、単にエンジニアと呼称します) の筆者が、日々実践している学習方法 (インプットを中心に) をまとめます。

以下の学習方法は基本的なものばかりであり、特別なものはありません。少し抽象的な話題が多くなってしまいますが、大切な部分なので割愛などはしていません。よく分からなかったら読み飛ばしてください。

学生の方にとって参考の一つとなるように、私の見知りできる範囲で偏りなく伝えられるように努めます。




自己紹介

yoshikouki (よしこ・吉本康貴) といいます。2020年からGMOペパボ株式会社でソフトウェアエンジニアになりました。元・理学療法士 (病院や介護施設でリハビリする人) で、前職は職員30名ほどの介護保険施設を家族経営していました。

エンジニアになるまで独学で学習しており、2年ほど前——エンジニア歴1年のころ——からGMOレンシュという新規事業の開発を行っています。周りからはキャッチアップ (情報収集や技術習得) が早いと言われることがあるような人間です。


学習の基本方針 - 知らないことを増やす

なぜ方針が必要なのか

早速学習方法の紹介と行きたいところですが、その前に私の学習方針について話をします。なぜ方針なのかというと、私が学習に使える時間は有限であり、学習したい対象は無尽蔵に増えていくからです。

方針や戦略を持たずに闇雲に学習したところで、高い効果は期待できません。とはいえ高い効果を求めるかは学習する目的にも依るため、例えば「ただ知りたいだけ」などのような知的好奇心を満たすための学習であれば、方針はなくても良いかもしれません。私の場合、「Webアプリケーション開発に必要な技術を素早く身につけたい」という目的があったため、方針を持っています。


さて、「Webアプリケーションを作る」という目的に限った場合でも学習範囲は膨大です。アプリケーションによっては、広い領域だけでなく深いところにまで踏み込まなければなりません。範囲を具体的に知りたい方は、Developer Roadmaps が参考になると思います。


「知らないこと Known unknowns」を増やす

このような前提を踏まえて、私の学習方針は「必要なときに素早くキャッチアップできるように "知らないこと" を増やそう」としています。「"知らないこと" を増やす」は、一部の界隈で "Known unknowns" という表現で知られています。

私たちは、ある知識に対して「知っている・知らない」という状態と、その状態に気づいているかどうかという状態があります。この2つの状態を軸として、4つのグループができます。

https://en.wikipedia.org/wiki/There_are_unknown_unknowns より筆者が作図


学習やインプットの文脈では、"知っていることを知っている Known knowns" を如何に増やすのか・深めるのかがフォーカスされがちです。もちろん、それが重要であることは言うまでもありませんが、私が身を置く環境では情報の流動と技術の変化がとても早いです。そのため、増加し続ける知識を常に "知っている Known knowns" 状態にするのは困難だと感じています。

ではどうするのか。取り得る選択肢を試行錯誤する内に「知らないことを増やす」という方針に至りました。その上で、必要性に迫られたときに「知らないこと」を「知っている」まで持って行けるように学習します。


学習概論: 全学習における共通の実践

全ての学習で共通して実践していることが2つありますので概論としてまとめます。学習する中で私が意識していることですので、難しく捉えずにこのような考え方もある、くらいにご認識いただけると。


1. 全体を意識しながら知識の地図を作る

まず、学習した知識は頭の中で体系的にマッピング (組み立て) します。私は、頭の中で絵や図を描くことで物事を解釈する方が理解・記憶しやすいため、このような方法をとっています。この思考方法はビジュアルシンキングと呼ばれているようです。


知識の体系的なマッピングでは、以下のような4つの視点を意識して配置していきます。これにより、知識同士が線で繋がり背景や文脈を掴めることで、対象領域の全体像を把握できます。

この体系的な関係性を「解像度」などと呼ぶことがあります。この視点は学習文脈だけでなく有用ですので、興味をお持ちの方は書籍「解像度を上げる」をご一読されるといいでしょう。


また、体系的なマッピングを進めることは、自身の視座を上げ、視野を広げ、視点を鋭くするとも解釈できそうです。「学習」というテーマだけでも様々な見方ができるので面白いですね。


2. 価値観を磨く

もう一つの実践は、学習しながら自身の価値観を磨くというものです。

ここでいう「価値観」はキャリア・アンカー (キャリアや生き方でどうしても譲れない軸) という考え方を元にしており、この出典では価値観・能力・動機の3つの要素が重要であるとされています。

この3要素を「車」に置き換えて考えると、能力は「エンジンやタイヤなどの車体性能」、動機は「ガソリン」、価値観は「目的地や経路選択」と捉えることができます。こう考えると、どれだけ車体性能やガソリン (能力・動機) が立派でも目的地 (価値観) を間違えれば明後日の方向にいってしまうことに思い至ります。逆に、目的地を間違えずに着実に進み続けられると、例え本来の車のような速度でなくとも、目的は達成できそうです。


さて、ここまで抽象的な話が続きました。一方で、効率・効果の観点で学習をよりよくするためには、この概念な意識がとても大切なように思います。なぜなら、どの対象領域にも転用できるからです。エンジニアリングの学習であれ、ビジネス的な学習であれ、「同じ型」で学習を進めることができ、自分流の学習方法ができあがっていきます。


これからは、私が実践する具体的な学習方法についてまとめていきます。


効率的なのはやっぱり書籍

月並みですが、書籍はやはり良いです。その中でも、名著と評されるものや人気を博しているものを積極的に読むようにしています。そこら辺のリストはネットなど調べたら必ず出てきますので、興味が沸いたらとりあえず書籍を買うようにしています。お陰で積ん読が捗りますが。

先ほど知識を体系的にマッピングするという話をしましたが、体系立てられた知識とはつまり学問です。学問に入門するための良い教材は、最近ではネットにも良い教材は多いですが書籍の方が安定して多いという所感です。


ネット情報は必ず一次情報を主とする

一次情報とは、公式ドキュメントやソースコードのことです。ネット上の記事の内容を読むだけで一次情報を参照せずに情報収集することはほとんどありません。

Zenn や Qiita、ブログ記事などはあくまで個人の意見として読み、間違っている可能性や重要な視点が漏れ落ちている可能性を頭の片隅に置きながら読み進めます。

また、ソフトウェアエンジニアリングの領域においては、一次情報としてソースコードを読むのがとても良いです。時間を要する場合もありますが、研鑽を積んだエンジニアが書いたコードを読むことで、ときに書籍から得られる知識を超えるものを得ることができます。


最新情報のアップデート

例えば「最近盛り上がっているプログラミング言語は?」というテーマについて考えてみます。

私が働いている環境では、Ruby や TypeScript、一部のプロダクトでは Go や Rust などが使われています。これらの言語が盛り上がっていると言えるでしょうか? 「それ、あなたの感想ですよね?」と指摘されたら、私は「はい、そうです」と答えるしかありません。自分の周りの状況を述べることはできますが、逆に言うと自分が見知りする範囲外のことは語れません


このような場合、私が「自分の感想」の壁を越え、見知りできない範囲の知識を得る方法の一つとして、メタ的な情報に当たるというのがあります。例えば、世界規模のプラットフォーマーが発表する調査です。


この GitHub の調査によると、2023 年のオープンソースにおけるプログラミング言語の使用率は JavaScript が1位です。AltJS である TypeScript が第3位であることを考えると、JavaScript の人気が伺えますね。Python も第2位なので世界でも (少なくとも GitHub 上では) 人気なことが分かります。

https://github.blog/2023-11-08-the-state-of-open-source-and-ai/#the-most-popular-programming-languages


一方で、成長率の観点では様相が変わります。TypeScript は変わらず3位ですが、1位と2位がすげ替わります。使用率ではランキングに載っていなかった Rust ですが、成長率では1位です。

https://github.blog/2023-11-08-the-state-of-open-source-and-ai/#the-most-popular-programming-languages


このように "State of ~~~" のようなキーワードで気になるテーマについて調べると、最新情報だったり新たな視点が得れたりします。私はWebアプリケーション開発を主戦場としているため、State of JS には毎年目を通します。


最新情報のキャッチアップはSNSと通知を活用する

とはいえ、上記のような情報は年次で発表されることが多く、数ヶ月内の新鮮な情報をキャッチアップするには不向きです。そのような流動性の高い情報やトレンドは、X (旧名: Twitter) のタイムラインを中心に、Zenn や Qiita などの記事を見るようにしています。

また、生成AIのニュースレターや Zenn の RSS を LINE へ通知し、情報のキャッチアップを習慣化しました。LINE への通知は、IFTTT を活用しています。


最近だとAI分野の論文などに目を通すようなこともありますが、私は論文による情報収集について語れるほど馴れていません。ここでは「最新情報を追うなら論文もあり」ということを頭の片隅においておくと良いと思います。


モダンな技術選定を知るのに役だったT3 App Recommendations

名指しの資料になりますが、T3 App の Recommendations は、世界で使われているモダンな技術選定を知ることができて便利でした。いまでも時々目を通していますので紹介します。


テキスト生成AIの活用は効果的 (ただし使い方次第)

言うまでもないかも知れませんが、ChatGPT などのテキスト生成AI (以降、単に生成AI) の活用は積極的にやっています。個人的に効果的だなーと思った使い方は以下になります。

  • 対象領域の全体感を得たり登場人物を整理する

    • 例:「Ruby on Rails のアプリケーションにおいて、リクエストを受けてレスポンスを返すまでに登場するクラスを体系的かつ網羅的に教えてください」

  • 学習時に浮かんだ疑問を質問する

  • サンプルコードの生成。複数パターンで比較・解説

    • 例: オブジェクト指向と関数型プログラミングで比較


ただし、生成AIだけに頼るのは避けるべきだとも考えています。これまで紹介したような学習方法を踏まえた上で、生成AIによって理解を促進・強化するように活用しています

同様に、生成AIの出力を一次情報とするのは、少なくとも現段階では避けています。理由はいくつかありますが、一番は得られる知識が狭くなってしまうからです。特定の対象領域に明るい他人がまとめた知識をインプットできる書籍と比べ、生成AIの出力は、自分の興味範囲に収束してしまう傾向があるように思います。それにより、全体性 (知識の地図) を獲得しづらくなるのです。

ハルシネーション (幻覚) による誤った情報を得てしまう危険性 (これは書籍やネット情報にも言えた話ですが) も併せて考えると、やはりまだ一次情報として信頼するのは避ける方がよいと思います。


一言でいうと適材適所で積極的に使っていこう、ということですね。


※ アウトプットを忘れずに

この記事はインプットにフォーカスしたものであるためアウトプットについて言及してきませんでしたが、インプットだけでは真に学習できたと言えないと考えています。それではすぐに忘れてしまいますし、上っ面だけの理解だったり誤解をしたままになったりします。

なので、インプットした知識を自分なりに解釈した上でアウトプットする習慣はとても大切です。私は note で日記を書いていますが、これもアウトプット活動の一つです。

エンジニアリング領域のアウトプットでオススメなのは、学習したものでプロダクトを作ることです。しかもそれを GitHub などで公開するのが良いですね。


さいごに

この記事では、Webアプリケーション開発を主戦場とするソフトウェアエンジニアの筆者が実践するインプット方法についてまとめました。

前半の抽象的な話はともかく、後半の具体的なインプット方法は当たり前とも思える内容だったので、退屈に感じる人もいたかもしれませんね。ただ、それでいいのです。退屈に思えるほど当たり前の基本を、どれだけ忠実に積み重ねることができるのか。私が見知りする範囲では、その継続の有無こそが人の成長を別つように見えます。

読者の方にとって、私の学習方法が少しでも参考になれば幸いです。



最近読んだ中で、LayerX 事業部執行役員 中村龍矢さん によるキャッチアップの話がとても良かったので、学習方法に興味ある方は是非ご参考ください。


この記事が気に入ったらサポートをしてみませんか?