【質問#177】プログラマーの低レイヤー層の知識について

質問・悩み相談の回答です。

質問

いつも楽しく拝見させて頂いております。
withpopさんのお考えを聞かせて頂ければと思い質問をさせて頂きました。

私は地方で常駐プログラマーとして働いています。簡単に経歴を説明しますと音楽専門学校を卒業後8年ほど販売員として働き、その後未経験でプログラマーとして就職しました。現在は主にJavaとC#、PHPを使っています。
バンド活動しているときにホームページの更新を担当しており、ホームページをいじっているとあっという間に時間を過ぎることから向いているんじゃないかと考え28歳の時に思い切って転職しました。

プログラマーに転職してみてコードを書く(ロジックを考える)のが好きということと勉強した分だけ自分に給料として返ってくることにやりがいを感じ、プログラマーになってよかったと思っています。
私には妻と子供が4人おり、家族を養うために稼ぐということをモチベーションに一気に走り抜けてきたように思います。プログラマーになり5年ほど経ち、給料も落ち着いてきたのと、仕事もある程度1人で出来るようになってきたので今後は自分がしたかった勉強にウェイトを置いて技術を磨こうと考えています。

ここから本題です。プログラミングをするのであれば低レイヤーのことも知っておかなければダメだと聞きます(主にネットで)。私は情報系の学校に通っていなかったこともあり低レイヤー層に対しての知識が乏しいです。ここでいう低レイヤーとはメモリとかCPUとかアセンブラとかOSとかコンパイラとかこの辺りです。
プログラマーなのに低レイヤー層のことを知らないのは例えるならF1レーサーなのになんでアクセルを踏むと車が動くのかわかっていないのと同じような気がしており、これではいかんと勉強を始めました。

ここまでした勉強したことを羅列すると、基本情報やLPIC level1を取得したり、「30日で出来るOS自作入門」を読みながら実際にコードを書いてブログでアウトプットしたり(半分くらいでやめてしまった)、「CPUの創り方」を買ってきて「オームの法則ってなんだっけ?」と思い電気や抵抗を調べ始めているうちに脱線していることに気が付きやめてしまい、「プログラムはなぜ動くか?」を読んで「へーそうなんだ」で終わってしまいました。そして何故かどうもしっくりきません。

扱っている言語がそこまで低レイヤーを意識しなくてもいいからかもしれませんし、難しく終わりのない領域だと感じていますが、withpopさんは『この為に低レイヤーの知識が必要だったのか!』と思うような瞬間がありましたか?私自身OSがどう動いているかコンパイラが何をしているか等は興味はあるのですが、実際にコーディングが変わったりまではしていません。

まだまだ勉強不足は感じておりますが低レイヤーは自分にはしっくりこないということがわかったので他のことをしています。
今はAtCoderの問題を解くのにはまっているのでC++を勉強してコンテストに参加したり、今年中にはiOSのアプリをリリースしたいと考えているのでアプリ開発&勉強をしていますが、どこか低レイヤーの呪縛から逃れられずにおります...。

回答

簡潔に私の考えを回答しますと、困ってなければ低レイヤー層の知識はいらないと思います。言い方を変えると、困ったときに覚えればそれでいいと思います。

コンピューターの基礎、特に理論計算機科学や低レイヤー層の技術的な知識などは、通常の現代的なソフトウェア開発に仕事で携わっている限りは広範にゆるやかに役に立つといった感じなので、すごく優先して今すぐ覚えるべきものだとは思いません。もちろん、どちらかと言えば勉強した方がいいとはおもいますが。

以降、ご質問の具体的な記述を見つつコメントを書いていきたいと思います。

現在は主にJavaとC#、PHPを使っています。

こういった高級言語を現在お使いで、今後もそうする予定ならばそこまで優先して低レイヤー層の知識を勉強しなくてもいいと思います。高級言語ではそういった知識が要求される実装は標準ライブラリによって既に実現済みであることも多いからです。

F1レーサーなのになんでアクセルを踏むと車が動くのかわかっていないのと同じような気がしており

このたとえは中々的を射ているように思います。

F1レーサーはもちろんレシプロエンジンの基本的な構造であったり、ハンドルを切るとなぜ車が曲がるのかというダイナミクスをある程度は知っています。ハンドルについている燃料マップの切り替えボタンやデフの調整ダイヤルを使いこなすには理論をある程度知る必要があります。ただし、一般的にF1レーサーは自分でエンジンやフォーミュラーカーを設計できる程度の知識が要求されるわけではありません。

ここまでした勉強したことを羅列すると、基本情報やLPIC level1を取得したり、「30日で出来るOS自作入門」を読みながら実際にコードを書いてブログでアウトプットしたり(半分くらいでやめてしまった)、「CPUの創り方」を買ってきて「オームの法則ってなんだっけ?」と思い電気や抵抗を調べ始めているうちに脱線していることに気が付きやめてしまい、「プログラムはなぜ動くか?」を読んで「へーそうなんだ」で終わってしまいました。そして何故かどうもしっくりきません。

上記のようなことをやっていれば、教養(覚えた知識を使うあてはないが、覚えておいた方がいいという知識)としては十分だと思います。ただ、「しっくりこない」という言葉はちょっと不安ですね。「なぜ動くか」シリーズはいずれも良書だと思いますので読んだ本が良くなかったとは思わないですが、もしかしたら実際の経験が無いから片手落ちな気分になっているのかもしれません。しかしそこでアセンブラやC言語をちょっと触ってみるとかいう経験が今必要かというとそれもちょっと違う気がするので、今は「いつか完全に理解できると気がくる」で良いかな、という気もします。

扱っている言語がそこまで低レイヤーを意識しなくてもいいからかもしれません

これはおっしゃる通りです。高級言語は一般に低レイヤーの知識があまり要りません。要ることももちろんあります。

withpopさんは『この為に低レイヤーの知識が必要だったのか!』と思うような瞬間がありましたか?

沢山ありますが、ぱぱっと思い出すのは中々難しいですね…。広範にまんべんなく役立つ、という感じなので自分自身で役に立ったと思うことが少ないです。

なんとか頑張って思い出すと、例えばHTTPでうまく通信できなくてtcpdumpで中身を見るとか、うまく動かないプログラムをstraceで調べるとか、サーバー・PC上のパフォーマンスのボトルネックはどこにあるのか調べたりだとか、Linuxでデバイスが動かないのを動くようにするとか、家やAWS上のネットワークを設計するだとか、C言語での大規模なプログラム開発をするだとか、そんなかんじでしょうか。トラブルが発生した時の問題解決に役立つことが多いような気がします。

今はAtCoderの問題を解くのにはまっているのでC++を勉強してコンテストに参加したり、今年中にはiOSのアプリをリリースしたいと考えているのでアプリ開発&勉強をしていますが、どこか低レイヤーの呪縛から逃れられずにおります...。

ほかに意欲がわくものがあれば、無理していつか必要になる教養科目を勉強しなくても良いと個人的には思います。