ソフトウェアエンジニアとして勉強する際にどこから新しい情報を収集して、どのように習得するように心がけていますか?情報源&量(言語やフレームワーク、ライブラリなど)が多すぎて効率よく習得する方法、またそもそも自分にとって優先順位が高いかわかりません。
この質問への回答 2件
相談室回答者
京都大学博士(情報学)、さくらインターネット研究所上級研究員、ペパボ研究所客員研究員、Forkwell技術顧問、ネットフォレスト技術顧問、情報処理学会各種委員、ITRC各種委員。第9回日本OSS奨励賞や2014年度情報処理学会山下記念研究賞など、その他受賞多数。2016年に情報処理学会IPSJ-ONEにおいて時流に乗る日本の若手トップ研究者19名に選出される。実績やキャリアの詳細は以下。 http://research.matsumoto-r.jp/
これは僕が経験的、かつ、エンジニアや研究者の教育を実践していく中で良いと思えた方法になりますが、まずは自分が少しでも興味を持てたことに対して小さなプログラムを作ってみることだと思います。余裕があればそれをちゃんとソフトウェアとしてGitHubなどで公開して、その使い方などをブログでまとめたりできるとより良いかもしれません。最初から網羅的に技術書や各種ウェブの情報から学ぶことは、大海に飛び込むようなイメージでなかなか成長が実感できず継続も難しくなることが多いかと思います。
まずは興味を見つけることが大変だと思いますので、少しでも思いついたツールを、既にあるかどうかはあまり気にせず作ってみます。すると、それを実装する中で必要な知識や関連するソフトウェアの情報、更には類似のコードを発見するなどして学ぶことができます。まずはそこで、自分の力でオリジナルのコードを書くのだと思うのではなく、既にあるコードを真似することを躊躇しないでください。そして、そのソフトウェアを公開する時は参考にしたコードをちゃんと明らかにして感謝を述べるようにするとより良いでしょう。
最初にハマりがちなのは、自分の技術力が追いついていない状態で自力でやろうとする考えやプライドがより成長を妨げることになります。まずは守破離の如く真似することから始めてください。真似をする中で少しずつ自分の選択肢が増えてきて、それの組み合わせがオリジナリティを生み出し、やがて自分自身のスキルへと昇華していきます。
そのためにも、興味の少しでもあることについてツールを作ってみて、公開されているコードについてライセンスも考慮しながらしっかりと真似をして、それらのツールや情報をアウトプットして公開しながら、そのツールをさらに育てたり、そこで得た知識を使って新たな近い領域のツールを作ってみてください。やがて利用者が現れ、フィードバックやパッチが送られてくるとしめたものです。さらにそこから改善のサイクルを回していくうちに、派生した様々なソフトウェアエンジニアリングの技術が自ずとついてくるはずです。
この段階で、改めて自分の知識として網羅的に知りたい領域が具体的に出てくると思いますので、そのタイミングで対象の専門書などを読むと良いと思います。知識がないときに読むよりも、随分と読みやすくなって、継続しやすくなっているのではないかと思います。
回答日:2020/12/23
相談室回答者
こんにちはhakといいます。就職、キャリアなどでお役に立てたらと思い登録させていただきました。 仕事としてはゲームプラットフォームや携帯電話のエンジニアリングを中心にしています。海外での就職、転職なども経験ありますのである程度ご相談に乗れるかと思います。 趣味は、ゲーム、SF、映画等です。面白い本、映画などありましたら是非おすすめ下さい。 なお。ご相談にあたりましては特定の会社についてのご質問等はお答えしにくい面もありますので、ご了承ください。
こんにちは、質問ありがとうございます。
学習法についてはそれぞれ自分にあった方法を見つける&習熟度によって変わってくるので一概に言えない点が多いですが、下記ご参考程度に自分の場合の小ネタです。
(なにか長くなってしまってスイマセン…)
1)基本方針
・コツコツとはやらない
自分はコツコツ積み上げていく事は苦手で
・その時々で興味あることをを中心に
・興味ないことは先送りに
・気が向いたときに集中的に、気が向かないときは別のことをする
という形にどうしてもなってしまいます(この点効率は悪い&王道とは言えず、多分毎日コツコツやる方が良いのだと思います)。
・出来るだけ原典に近い情報にあたる
二次情報、三次情報となるとどうしても質が落ちてしまうので、できるだけ参照元となる仕様や論文、信頼の置ける著者の書籍などを優先しています。
ソフトウェア業界の場合どうしても英語圏の情報が中心となりますので英語ドキュメントを読む必要も増えますが、質、量ともに基本的には英語情報のほうが充実しているかと思います。
・成果物を中心に
特にソフトウェアの場合失敗しても実害ありませんので、ある程度理解した(と思える)段階でもう実作業に入ってしまいます。その後失敗しながら必要な点を抑えていく方がなんとなく進んだ感も味わえて良いと思います。
2)優先度
覚えることの優先度としては、自分としては下記のように捉えています。
アルゴリズム > ドメイン・ナレッジ > 標準仕様、言語仕様 > 論文 > フレームワークやライブラリ、ツール
・アルゴリズム
基本的なアルゴリズムは何十年も前に発明され使われ続け、この先も生きていくかと思います。アルゴリズム学習は尽きることが無いと思いますので、まずはおすすめです。自分などもまだまだ学習が足りないです。
・ドメイン・ナレッジ
その分野ごとの知識を体系的にまとめた教科書的なカリキュラムや書籍があるかと思いますので、そういったものを(概要で良いので)なめておくと良いと思います
・標準仕様、言語仕様
ソフトウェアは仕様に始まり仕様に終わりますので、何かと仕様書を読む癖は身につけておくと便利です。特に言語仕様、RFC等の標準仕様を読んでおくと「仕様に基づいた議論」ができるようになります。
・論文
該当分野で論文が発表されている場合には論文読むのもオススメです。論文のフォーマットとしてそれほど分量も多くないので英語学習としても良いです。
・フレームワークやライブラリ、ツール
実際に開発するときにはフレームワークやツールを多用するかと思いますが、フレームワーク仕様などは頻繁に変わったり流行り廃りがありますので、調べてわかる範囲のことは都度調べるくらいで真面目に覚えなくても良いかと思います(例外としてgitの使い方は覚えておいて良かったです)。
3)手段
・動画
最近の自分の発見としては、特にweb系のフレームワークやIDE込みの分野などは動画コンテンツを見て学習するのが結構効率が良い点です。大抵の動画がコンパクトにまとまっている、ツールの操作過程を見られる、古いコンテンツが淘汰されて検索性が良い、等諸々理由はあるかと思います。
・書籍
前述しましたが既に体系が確立している分野については教科書的な書籍を読むのはおすすめです。小ネタとしては、目次を読んで概要把握したあとは(大体後ろの方に重要なことが書いてあるので)後ろから読んでいくと前の方の章の基礎部分を読まずに済んで時間節約できます。
・カンファレンス
技術カンファレンスも大小様々なものがありますが、自分の好みとしては大きめのカンファレンスで全然自分のカバーしていない分野の話を聞くことが暇つぶし&刺激になって気に入っています。
・仕様書、リファレンス
仕様書や開発元が提供しているリファレンスに関しては前述の通り、必要に応じて読むのが良いと思います。
・コード
オープンソースプロジェクトなど、コード自体を隅から隅まで読む必要はありませんがサンプルコードは「動いている状態がそこにある」という点で大変参考になります。プロジェクトをスタートするときもサンプルに手を入れつつ作っていくというのは楽で良いです。
・RSSリーダ
これは趣味としてRSSリーダに各種サイトを登録して週3,4回程度チェックしています。一日あたり300本くらいの見出しをざっと見て、気になる記事を何本か読む程度です。
・回答サイト
回答サイトについては良く参照してはいますが、回答内容に関しては50%程度のものは古いか正確ではない、程度に割り引いて考えたほうが良いかと思います。
このようなところですが、参考になりましたら。
回答日:2020/08/13

