エンジニア(ここでは主にプログラマー)に必要な知識や経験って、ざっくりベース、カテゴリ、実行環境というレイヤー分けられると思ってて、それぞれに対してはだいたい以下のような定義で考えている。
①ベース
- コンピュータサイエンス(CS)などの理論的なもの
- 低レイヤー
②カテゴリ
- フロントエンド / バックエンド / クライアントアプリなど
③実行環境
- 特定のプログラミング言語や開発環境やツール、フレームワークやライブラリなど
最近の潮流で言うと、③の部分から入る人が多いと思う。
③は比較的習得が楽なこともあって、初心者がプログラミングを始める際には一番コストパフォーマンスが高い。中身はブラックボックスであってもなんとなく動くものは作れるので、自己満足にしろ仕事にしろ成果として見えるものにはなる。
ただし、流行り廃りが速く、手を動かし続けないとキャッチアップしていけない。
①は習得するのに時間かかる。その分、ここがしっかりしていると、より上位のレイヤーは比較的楽に習得できる。
基本的にはすでに世の中に存在しているものなので、このレイヤーで新しいものを作るというのはとてもむずかしい。アウトプットも分かる人には分かるがわからない人には全くわからない。
②はその中間で、ある程度の学習コストはかかるが使える範囲、期間もそこそこある。
上から下へ降りるのは難しい
ライブラリやフレームワークに頼ってばかりだと設計力はなかなかつかないし、問題が発生した場合には中身を知らなければ対応できないときは来る。よって、経験を積めば③から入ってもいずれは②→①と降りていく必要は出てくる。
ただし、深いところに行けば行くほど習得に時間が必要となる。それに③のレイヤーは日々新しい情報が出てくるので、これにキャッチアップしていく時間も必要だ。
目の前の成果と日々のキャッチアップに追われてベースとなる理論や知識を理解出来ない。CSを学んでいないエンジニアが、経験が長くても成長出来ない場合は、このパターンに陥っているのだと思う。
下から上へは比較的容易
ベースの部分ができていると、まずはベースに近い領域の仕事が出来る。例えばLinuxがなくならない限りはLinuxのデバイスドライバを書く仕事というのはなくならない。Linuxのデバイスドライバを書くのはLinuxならではの知識、ここでいえば②のレイヤー含まれる部分もあるがCPUやメモリに関する知識はLinuxでもWindowsでも共通している。
アプリの不具合を追っていたらメモリの扱いに行き当たった、ということはなくはないが、これは低レイヤーの知識があってからこそそこまで追えるのであって、上から入って下、という習得はなかなか難しいと思う。
下から上は、新しい情報にキャッチアップする感度が必要なので、歳を取ると無理だという人もいるが、①、②のレイヤーをちゃんと積み上げていれば理解するのは難しくない。
基本的に、②以上のレイヤーというのは、①のレイヤーを、人がより理解しやすいために作り上げたものだからだ。
ただし、手が動くかどうかというのは別の話なので、ちゃんと手を動かすまでは知識としては理解できるというだけであって、出来る、使えるということにはならない。
上から下に学んでいくパターン
上から下に行くためには、まず上のレイヤーで複数の実行環境、カテゴリを経験して、それらの共通項からベースとなっている理論や知識に行き当たるという順番になるだろう。
例えばAndroidとiOSの両方をやれば、モバイルアプリに共通するものがなにかというものが分かるとか、ReactとAngularとVueのそれぞれの役割がわかっていれば、また新たなフレームワークが出てきたときに、それらとどう組み合わせて使うべきなのか分かる、といった感じ。
③→②はこのパターンのほうが楽な場合が比較的多く、②→①は少なくなる。
エンジニアの能力といまどきの難しさ
エンジニアの能力というのはこうした知識や経験の深さ*広さの総和だと思う。
深さに関して言うと、ベースレイヤーが圧倒的に値の幅が大きい。特定の領域だけに超詳しいスーパーエンジニアというのはまずいなくて、エンジニアとしての素養がかなり高い人が特定の領域に特化するとその領域でのスペシャリストになれる。
特定の環境における知識というのは幅は広いが深さはない。例えばpythonを日々使っていればpythonの実行環境において、どのプラットフォームだとどのバージョンが使えて、ローカル環境はこうやって切り替える、みたいなのをスラスラと言えるかもしれないが、それだけではスペシャリストとはいえず、当然ベースとなるプログラミング能力は必要だ。そして、言語に依存しないプログラミング能力があれば、Rubyを書いたことがなくても、ちょっと学べばすぐに書けるようになるだろう。
ベースの知識というのはその上に使える知識が乗って初めて評価されるので、マニアックすぎるもの、トリビア的なものは能力と言っていいのかわからない部分もあるのでその分は除外して考えたほうがいいかもしれない。ただし、こういった知識が突然役に立つこともある。
現代において、ベースの部分を社会人になってから身につけるというのはなかなか難しいと思う。昔は仕事を通して学べたものが、今はブラックボックス化されている。それを学ぶには、自らの時間を使わないといけない。
USでエンジニア職につくためにはCSでの学位が重視されているという話はよく聞くけど、これはこのことをわかっているからだろう。
技術が進歩した結果、それを学ぶパスがかなり限られてしまっていて、難しい時代になったよなぁと思う。