エンジニアは何を学ぶべきなのか
会社でネットワーク勉強会をやった。ネットワークの具体的な話をする前に、なぜネットワークあるいは低レイヤ、基礎技術を学ぶべきなのかという話をした。これは我ながら非常に良い話で、エンジニアという職業に対しての考え方をいい感じにまとめることができた。以下は原稿の一部。
自分が直接触れる、あるいは触れる可能性を想像できる範囲においてのみ学習や能力の向上を試みる人も少なくない。これはエンジニアが単なるIT技術に対して詳しいスペシャリストであるという見方からすると、それほど問題のある傾向とは思えない。一方で、一般論として、エンジニアの本来の仕事は「問題解決」である、とも言う。私は、「問題解決」をしない仕事などというものはほとんどないと思っている。すべての職業は何らかの問題を解決しており、労働という行為自体が問題解決の性質を持っている。その中でエンジニアの仕事を「問題解決」である、とするということは、他の職業とは一線を画すほどに、自分が触れる範囲であるかどうかどころか、専門としている「IT技術」に限らず、類まれなる問題の解決能力を提供することに価値があるとの主張であると認識している。この点については私も強く賛同するが、エンジニアの本質が技術知識だと考えている人はともかく、「問題解決が第一」という主義を掲げながら自分が見える範囲のIT技術しか学ばないというエンジニアがあまりにも多すぎるように私は感じている。そのような人の傾向としては、技術的な世のトレンドを追うことが技術力を高めることだと盲信し、基礎技術やさらにその根本である基礎学問を省みることがない。つまり、表面的な技術に執心しているのである。これは非常にもったいないことである。何がもったいないのかと言うと、時間である。
人生は有限である。トレンドになっている技術はキラキラしていて、あるいはお金の匂いがして魅力的だというのは理解できるところではあるが、そのような世界で戦うことを選ぶと非常に短期的な競争を何度も繰り返すことを厭わない精神が必要である。こういった表面的な技術は、移り変わりが激しく、ニュースを追っているだけで一日が過ぎてしまっていてもおかしくない。また、習得しても上位互換となる代替技術がすぐに出てきて、自分のスキルは陳腐化する。
基礎を学ぶことのメリットは大きい
一方で、低レイヤを含めた基礎的な技術や基礎学問を学ぶことは長期的に大きなメリットがある。まず、このような分野はめったに陳腐化しない。前述の表面的な技術は、すべて基礎の上に成り立っている。表面は陳腐化しても、基礎の重要性は変わらない。そのため、表面的な技術を日々一生懸命に学んでいる人が専門としていることを、基礎を怠らずに学習している人が学び始めたらすぐに習得し前者を軽々と追い越してしまった、ということも起きる。また、基礎的な技術や学問というのは、一見ジャンルが違うように見えてもどこかで繋がっている。これは技術的な知識に限らない。我々のWeb開発がネットワークの上に乗ってるとか、そんな事は言われなくてもわかっているかもしれないので、一見関係ないように見える例を上げておく。セキュリティは政治や戦争、法律に深く関わっていたり、昨今話題のAIの原理になっているニューラルネットワークのように脳科学と関係している場合もある。サイバー空間という非常に歴史の浅い分野がここまで広く浸透し、発展しているのは他分野も含めた基礎的な学問や技術が存在しているためである。そのような世界でプロとしてしのぎを削るのに、表面的な技術しか学ばないことの恐ろしさをぜひ感じてほしい。
クラウドの知識じゃだめなのか
ネットワークを学ぶ意義はわかったが、クラウドの知識でいいんじゃないかと思う人もいるかもしれない。確かに、例えばAWSを使っているならAWSの知識だけあれば業務はこなせるかもしれない。だが、AWSがわかっているがネットワークがわからないというのは、Wordpressでサイト構築はできるが、プログラミングはできないという状況に似ている。AWSに喉元を掴まれている状態である。せめてクラウドに依存するにしても、AWS、GCP、Azule、オンプレ、いつでも乗り換えられる、あるいは乗り換えるだけの知識を短期間で得られる自信がないといけない。ちなみに、こういったクラウドベンダは面接の際にクラウドサービス関連の知識をほとんど重視しないようだ。クラウドベンダに対抗したり肩を並べることも視野に入る人材を目指すか、クラウドベンダのありがたい製品を使わせていただくことしかできない人材になるか、どちらを目指すかは個人次第だが、エンジニアとして長期的に高みを目指すなら、ネットワークを学ぶべきだ。
基礎に踏み込むこと自体が重要
散々表面的な技術に対して批判的な事を言ってきたが、表面的な技術を学ぶことが悪いことではない。むしろ私は、表面的な技術も含めて広く興味を持つことは大変重要なことだと考えている。悪いのは、表面的な技術だけに固執したり、深堀りしないことである。前述の通り、技術や学問同士はつながっていることも多い。一見関係ないようなことでも、突き詰めると他の多くの分野に応用でき、また広い視野で問題に対して相対することができる。エンジニアという幅広い問題を取り扱う職種においては、ジェネラリストを目指すと自然とスペシャリストにもなる。スペシャリストを目指すのであればこそ、幅広く、かつ深く学ぶべきだ。もちろん、これを目指すと学ぶ対象領域がかなり増えて辛く感じるかもしれない。有限な時間をどう使うかは自分で考える必要がある。我々エンジニアは怠け者である。どうすれば効率よく自身のスキルアップができるかを考えることはどのようなスキル習得ルートを歩むにしても変わらないことだろう。重要なのは、効率を考える際に短期的な考慮ではなく、長期的な考慮をすることだ。この考慮をすること自体が、限られた資源を効率的に使うというエンジニアとして最も基本的な問題解決能力を底上げすると信じている。私は長期的な考慮の結果、基礎を重視するべきだという考え方に至った。今回の主題はネットワークだが、それ以外の分野も、自分が深く理解できていないことを自覚した分野は基礎から体系的に学ぶ機会を自分で作ることを奨める。フロントエンドの開発者の身近な例で言うと、Reactがわからないと感じたら、それはJavaScriptがわかっていない場合が多い。( 基礎から学ぶReact/React hooks帯より )