プログラマだったら当然知ってるよね?という知識一覧の補足

補足

以下の記事の補足です。

プログラマだったら当然知ってるよね?という知識一覧

なんか適当に書いたんだけど思った以上に読まれてるので補足します。

この記事の要点は プログラマならコンピュータサイエンス(以下CS)の基礎くらい知っててほしいよね という私の気持ちです。みんながCSを勉強してれば、今よりもバグは減り、デスマーチプロジェクトも減り、日本のIT業界のレベルも底上げされると思うのです。そして、 多くのプログラマが程度の差こそあれそれに同意していただけるのでは 、と信じています。

CS系の学部を出て活躍しているプログラマが全てではなく、文系や理系でも非CS系の学部学科を出た人でない人たちが活躍していることももちろん知っていますが、彼らの殆どは 独学でCSの基礎を学んでいるか、もしくは知らず知らずのうちにCSの基礎相当のことが理解できているケースがほとんど だと思います。私が今まで出会った人たちは少なくともそうでした。たとえばCS系の学部学科を出ていなくても、社会人になってから基本情報処理技術者試験とか受けた人も沢山居ると思いますが、あれだってCSの基礎が結構出題されています。

また、活躍してるプログラマの中には、特定の分野ですごく秀でた尖った知識・才能を発揮しており、反面実はCSの基礎をあんまり分かってない人もたぶん居るでしょう。そういうケースがあるのを踏まえた上でも、一般的にはプログラマならCSの基礎くらい知っててほしいよね、と言い切ってよいと思ってます。

これは絵描きによるデッサンに似ていると思います。世の中で活躍している絵描き・イラストレーター・漫画家の全員が石膏人形その他を見ながら鉛筆でデッサンしたことは無いでしょうけど、デッサンくらいはやった方が良いよね、という意見の方が多分多数派じゃないでしょうか。中には、いや、デッサンよりも重要なことがあると主張する人も居るでしょう。たとえば、イラストレーターではクライアントの意見を具現化する想像力だったり、流行りの絵柄に追従してく能力だったり、漫画で言えば絵の上手さよりもストーリーのほうが重要だ、とかね。

プログラマの世界におけるCSも同じで、CS勉強しとけって人は全員では無いでしょうけど、殆どの人が同意するはず、ということです。中には、いやそんなことよりもこういう技術のほうが必要だ、こういうスキルがあれば必ずしもCSを勉強する必要はない、とか主張する人も居るでしょう。イラストにおけるデッサンの関係ととても良く似てます。

じゃあCS勉強してると何が嬉しいのよ

下記の記事で先の私の記事を引用して書いてくれました。恐縮です…。

コンピュータサイエンスの基礎を学ぶと何ができるようになるのか

私も思いつくものを列挙してみます。

  • 新しい技術に振り回されなくても良くなる。新しい技術の本質を見抜いて、過去あった手法のどれを基礎としてどこから発展していったのか分かるようになる
  • だから新しい技術の習得が早い
  • 新しい技術は凄くて良いものだ!!と信じ込む以外の視点を与えてくれる
  • すごく遅い、すごくメモリを食う、必要以上に複雑なコードを書かなくなる
  • ググっても出てこないコードやアルゴリズムを自ら考えて実装させられるようになる
  • あるべき設計について語れるようになれる
  • あ!これ進研ゼミでやったやつだ!的体験を数多く体験できる

とかでしょうか。全般的に効いてくるところだと思うので、書こうと思ったらあんまり関連性がなさそうなものまで列挙してしまいそうですね。

あとは、過去の記事で以下も多少参考になるかもしれません。

【質問#130】プログラミング言語の覚え方について

上記のような事柄について「CSなんて学んだこと無くても理解できてますけど?」と感じる人が居たとすれば、それはおそらくあなたはCSの基礎が経験的に理解できてるのだと思います。それは凄いことだと思います(煽り抜きで)。

ただし、それは既に人類の知恵として体系的に獲得されてきたものでもあります。最初からCSを勉強していれば自分で再発見しなくともよかった知識ではあったのも事実です。

別に堅苦しく考えてCSを勉強するぞおおおお!!!って気張って勉強しろと言ってるわけではないです。CSを修めて無ければプログラマとして生きていけないわけでもないです。自分で人類が得た知識を再発見していく過程は論理的思考力を養い、満足感や達成感も高いと思います。だから再発見が悪いわけでもないです。

しかしとても重要なことは、 そのどの事実もCSを学ぶ価値を減ずるものではない ということです。

あなたの目の前にあるのはPCだったりスマホだったりするでしょうが、その中にはCPUとメモリがあり、それは紛れもない計算機です。アラン・チューリングがチューリングマシンを考え、フォン・ノイマンがノイマン型アーキテクチャを考えたからそれらが存在しています。計算機科学を基礎として沢山の技術が生まれ、世の中に応用されていったのです。HTML DOMは木構造で、CSSのz-indexはスタックコンテキストで順序が決まり、データやりとりするパケットには誤り検出・訂正が組み込まれ、JPEGやMP3が圧縮できるのはフーリエ変換があるからだし、サーバとクライアントをE2Eで暗号化できているのはP≠NPなはずだからであって、ひとつのWebサイトをロードするまでにたぶん100回くらいソートアルゴリズムが動いてるでしょう。

それらを職業として(もしくは趣味として)扱うのに対し、大本にある系統だった学問が役に立たない、なんてことはあるわけがないのです。だから、私はCSを勉強してたほうが良いし、プログラマを名乗るなら自分の目の前にあるコンピュータとは一体何者なのか?について興味があって然るべきだと思うのです。

しつこいですが、もちろんそんな意識高くなければプログラマをやっては行けないというわけでもないし、うるせぇコンピュータに興味なんかねぇよ、仕事のためにプログラマやって必要なところだけつまんで勉強してそれで食ってけるんだから別に良いだろ、という人が居るのもわかりますし、そういう考え方も理解できますし、私自身そういう部分もありますし、実際そういう人と仕事をしたとしても私はその人に対して辛く当たったり、ニコニコしながら心の中で軽蔑したりとか、そういう変なことはしません。ただ、一般的に「CS勉強すべきだよね」と言い切る程度の価値はあると私が思ってる、ということなんです。おわり。