毎日のように新しいテクノロジーの話題が流れてるくる昨今。世の中には「それを使える人」と「それの仕組みが分かる人」がいると感じています。
使ってみることで理解が進む、仕組みを理解することでより上手く使えるといった相互作用はありつつも、AIで素晴らしい画像を生成するプロンプトを書ける人が必ずしも画像生成AIの仕組みを理解しているわけではありません。ビットコインで大儲けした人もブロックチェーンの仕組みを知らなかったりします。逆に、経済に詳しい人が自身の投資で失敗することもあります。
これはテクノロジーに限った話でもないので、身近に他に似たようなものがあれば読み替えてください。
自分の例で言うと、大学時代は情報工学科というところでいわゆるコンピュータサイエンスを勉強していました。高校生まではプログラミング経験は一切なく、「ゲーム好きだし、コンピュータの勉強をしておいたら将来食いっぱぐれることはないでしょ〜」くらいの温度感で進路を決めました。大学入学後も、授業以外では部活に精を出していたのでプライベートな時間でプログラミングをがんばっていたわけでもありませんでした。ちなみにゲームは作るよりやる方が好きという結論になりました。
ただ、講義はまじめに聴くし、レポートやテストに向けての勉強もけっこうちゃんとやる方だったので、学校の成績は良かったです。何が言いたいかと言うと、僕はプログラムを書くのが得意ではない、つまりプログラミングという技術を使えないが、コンピュータやその関連分野の仕組みはそこそこ分かる人だったということです。
その後就職活動をする中で、ソフトウェア開発に関わろうと思ったとき、「いずれ上流工程で設計や要件定義、プロジェクトマネジメントなどを主軸にするようになったとしても、キャリアの最初のうちは自分でコードを書くことを経験しよう」と決めました。
上流工程と下流工程を分ける下請け構造自体の問題を理解した今となっては、自分でコードを書くことを選んで本当に良かったと思っています。
話を戻して、そんなこんなでソフトウェアエンジニアになるわけですが、就活中や新卒でエンジニアになったばかりの頃の自分は、プログラミングを「使える人」に対してコンプレックスがありました。専門学校でソフトウェアエンジニアになるためにプログラミングを勉強してきた人や、文系ながらプログラミングを独学し自分でwebサービスを公開したりインターンで経験を積んだりしていた人たちは、プログラムを使って何かを作り出すことができました。
自分にはそのスキルがありませんでした。
とはいえ、はじめの方こそそんなことを感じていましたが、ソフトウェアエンジニアを何年かやっているうちに、自分もそれなりにコードが書けるようになってきました。そうなってくると、今度は「仕組みが分かる」ことの価値がじわじわ高まってきているなと感じています。
ただコードを書くのではなく、コンピュータの仕組みやアルゴリズムの理論から考えてこちらの書き方をした方がいい、など、日々の選択の中で過去に仕入れた知識が役立っていると感じるときも増えてきました。この文章を書く気になったのも、ビハインドしていた分を最低限くらいは埋められてきたかなーという感覚が生まれてきたからです。
「使える」ことはビジネス的な効能に結びつけやすかったり、比較的早く成果が得られます。一方で、「分かる」ことはそれが役に立つまでの期間が長いです。最悪、目に見える形では何の役にも立たないこともあります。
でもそれでいいのです。何かを使えるようになることよりも、その仕組みを知ることの方が楽しいんです。自分がそういう性格なので仕方ないのです。好きで学んでることがいつか大きくなって返ってきたらラッキー。
最近ではグローバルテック企業たちが展開するAIサービスをどうやったら使えるかみたいな話題が人気だし、まだ誰もやっていないような使い方をすれば世界に先駆けて新しいものを生み出せるかもしれません。
でもそれは結局だれかが作ったものを使っているに過ぎないので、他の人も真似できてしまいます。新しさで勝負するには常に新しいものを追いかけ続けないといけません。いつしか、なんかいろいろ知ってるけど知ってるだけの人になります。「この人流行り言葉ばかり使ってるけど薄っぺらいなー」と思われたくありません。僕はこれが一番怖いです。
仕組みを知り、原理原則に立ち戻っていくことで風化しづらい知識の柱を立てる。
ということで、Kubernetesに興味を持った結果、コンテナを学び始め、コンテナって結局Linuxカーネルなのでは?と思い、だんだん低レイヤーに潜りつつある自分が勉強の途中で挫折しないように、自分自身を鼓舞してこの文章を締めくくります。