エンジニアはコンピュータサイエンスを学ぶべきかという話

maachan

この議論自体は広大なインターネットの海において、n回議論されている内容ではありますが、エンジニアをしながら大学院でコンピュータサイエンス(CS)を学んでいる私の見解を述べさせていただきたいと思います。

記事タイトルを文字通り受け取るのであれば、結論は学ぶべきであり議論の余地がないと考えています。なぜなら、CSはプログラミングの基本的な概念から始まり、オブジェクト指向プログラミングのような特定のプログラミングパラダイム、ソフトウェアデザインパターンなども含め、広範な範囲を包括しており、意識的に学んでいないだけでエンジニアは大なり小なりCSの領域に暗黙的に触れて学習しているからです。

エンジニアのタイプ

私が今まで観測した中で、エンジニアの勉強タイプはおおよそ以下に分別できると思います。

なお、完全にタイプごとに分別されるのではなく、タイプを跨っているエンジニアも多くいると考えています。

CSを重視するタイプ

技術が好きでこの分野に元から興味がある人、後天的に必要性を感じて勉強する人などがいる印象です。

業務で必要な部分を勉強していくタイプ

暗黙的に必要な領域のCSをキャッチアップしている可能性が高く、特定の領域に強い方が多い印象です。

最新技術に没頭するタイプ

技術力を培った上で最新技術をキャッチアップしている方や、技術者としてよりも利用者として最新技術に没頭するタイプなど様々いる印象です。

とにかくモノを作りたいタイプ

リリースまでとにかく突っ走っていく独学タイプで、必要に応じてCSの領域にも触れている印象です。

資格や称号を集めていくタイプ

キャッチアップ目的で資格取得や表彰プログラムの称号を取得している方や、取得を目的としている方など様々いる印象です。

上記いずれのタイプも多かれ少なかれCSの知識を養っていると考えていますが、私は「CSが全くわからないし触れたことがない」と自己認識している方は、ある程度まで意識的に学習すべきであると考えています。

そのため、本記事では意識的に学ぶ必要があると考える理由、学ぶと何が変わるのかについて記載していきたいと思います。

エンジニアの共通言語となり得るのがCS

一言でエンジニアと言っても、多種多様な職種が存在しますが、どの職種においても共通言語としてCSが存在するとコミュニケーションがスムーズになる場面があります。

CSの知識が一定ある場合とない場合では、言葉一つとっても得られる情報、そこから想定できることなどに情報量の差が生まれてしまいます。

DWSの得意領域であるAWSを例題にすると、AWSを知らなくてもCSの背景知識があれば以下のような状況が発生すると考えられます。

  • 「CPUインテンシブなので、コンピューティング最適化インスタンスを使用します」という一文を見た際に、言葉通りの意味に加えて、「OSのプロセススケジューラのアルゴリズムから違うのかな?ハードウェア的な違いだけかな?IOインテンシブ用のインスタンスもありそうだな」というような想像が膨らみます。
  • アーキテクチャ図にあるSimple Queue Serviceを見た際には、図におけるサービスの前後関係や名称から文字通りキューイングのサービスだろうなと想定でき、FIFOや優先度付きなどのオプションがありそうということも想像できます。

全くOSやデータ構造を知らない場合は、CPUインテンシブな場合とIOインテンシブな場合でプロセスの扱いがどう変わるか、キューというデータ構造がどうなっているかというキャッチアップから必要になります。悪い例では、CSにおける広義な技術の話と密接していると認識せずにAWSのこのサービスは、そういうサービスであるという理解で終わってしまったりします。

あくまで一例ですが、このような情報量の差で一を聞いて十を知るという諺の通りの状況が発生します。意識的にCSを多く学ぶという行為はこのアハ体験を増やすことになると考えています。

逆に知らないと10の説明をさせてしまう可能性もあるということになります。

CSを学ばないという選択も大事

とはいえ、CSの全領域を学び尽くすというのは難しいと考えているため、特定の領域は学ばないという選択も大事であると考えています。

商業的なソフトウェアを作る際において、仕様からコードに落とし込む際にCS力を試される機会は少ないと考えています。要件から仕様に落とす役割を持つ人はCS力が試される場面がありますが、業務内容によって領域が限られていたりします。

前述の通り、CSは広範な範囲を包括している分野であるため、業務に関連するCS領域のみを集中的にキャッチアップするという戦略は一定必要であると考えます。

AIの時代だからこそ意識的にCSを学習したい

  • 普段の業務でコピペや生成AIに頼りきってないですか?
  • インターネットの海に転がっているハンズオン記事や、生成AIの力を借りずに、独力で業務を遂行できる自信はありますか?
  • 公式ドキュメントやリバースエンジニアリングのみで自ら解を導き出し、設計や実装ができる素養や自信がありますか?

これからの時代、上記の質問に自信を持って回答できる人は少なくなっていくと思います。

割り切ってこれから生成AIと共に生きていくという戦略も良いと思いますが、生成AIに適切に指示を行い、その出力をレビューする能力が必要になりますし、広範な領域を俯瞰して考えられるようになることが生成AIと生きていく上で大事になっていくと思います。

CSを学び、意識的に自分の力を試す機会を設けて、生成AIに振り回されないようにすることで、本質的な能力の向上に繋がると考えています。

まとめ

意識的にCSに触れていないという人でも強い人を多く観測していますし、万人に推奨する話ではありません。

CSに限らず、正しいタイミングで正しいことを、好奇心を持って学び続けられるエンジニアに強い人が多いという印象です。

気になったことはすぐに調べ、わからないままにしておきたくないというマインドセットを持ち合わせているだけで、エンジニアとして申し分のない素養が備わっていると言えると思います。その延長線上でCSを学ぶ習慣が身についていれば、さらに強くなれると私は思います。

私のような凡人でもCSと触れ合えていますし、意識的に学び始めたことで成長実感があります。もし、停滞しているなと感じたり、興味を持たれた方はCSを意識的に学ぶということを始めてみると良いかもしれません。

AUTHOR
maachan
maachan
記事URLをコピーしました