コンピュータサイエンスの基礎を学ぶと何ができるようになるのか
今日、Facebookに「プログラマだったら当然知ってるよね?という知識一覧」という記事で、「データ構造」や「計算量」から「理論計算機」など幅広くコンピュータサイエンス(CS)の基礎をプログラマ知っているべきという論が展開されています。
私は経営学部だったのでコンピュータサイエンスについて学校で習ったことはないのですが、高校の頃から趣味で色々調べていて、この中だとグラフ理論と機械学習系以外は大体理解しています。
「Web系の人って、新技術ばっかり追いかけてCSの基礎とかちゃんと学んでないよね」っていう話は他でも時々聞く気がします。
一つがWeb系のエンジニアは情報系の大学を出てない人も多いことと、実際あまり役に立つシーンがないのではないかと思います。
実際、CSの基礎ができると多くのエンジニアにとって何のメリットがあるのでしょう?
一番は「先の技術を読めるようになる」ことです。
ITの世界では日々新しい技術が開発され、エンジニア向けにも様々な手法やライブラリがリリースされています。
そのうち、どれが使え、どれが伸びていくのか、こういう評価をするのにCSの知識は大事になります。特に計算量、理論計算機やソフトウェア工学などを理解していないと、今出ている技術を正しく評価することはできません。
そうすると「みんなが使っているから」とか「流行ってるから」「新しいから」ということだけで、新技術を採用することになります。
そのため、用途に合わないのに無理して使って開発や実行パフォーマンスが出ないことが起こります。
「寿命の長いコードを書けるようになる」事も大きなメリットです。
CSの中でも、理論計算機科学はコードを書く上で直接役に立ちます。しかし、別に知らなくてもコードは書くことができます。
コードの寿命は抽象度の高さにある程度比例します。
一発作って更新しないようなWebサイトの場合は問題になりませんが、サービスサイトなどの場合、数年単位で運用されることがあります。
その場合、自分が最後まで関われないケースも多いですし、そもそも自分のコードだとしても1年前のコードは理解が難しくなります。
そういう時に抽象度の高い、見通しの良いコードが書けているかどうかが生産性を分けます。
なので、特に設計に近い人は理論計算機科学を学ぶことは、長期的にメンテをしやすいシステムが構築ができるようになります。
総論
「〇〇というツールが使えます」「〇〇言語の経験あります」というアピールは分かりやすく単価が上がったり、転職が容易になります。しかしCSを理解していることはプラスになりにくいでしょう。
CSを学ぶことはキャリアに対して即効性はありませんが、「〇〇さんの技術選択は正しかった」「あとからコードの変更が楽だった」という評判が長期的に評価されることになります。
「エンジニアは常に最新技術を勉強続けないと死ぬ」というのは定説ですが、CSは一度きちんと学べば長期的に効果があるため、時間の投資対効果が高くなります。
プログラムがある程度書けて、これからさらに長い時間、IT分野で働こうと思うならCSを勉強しておくことは必ずプラスになります。