【質問#171】 今からC言語を勉強することについて

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

質問

私は今年で2年目のWebエンジニアです。
LinuxやRubyやvimやgitが好きで、これらのソフトウェアの仕組みに興味があります。

これらは全てC言語で書かれてあるので、
仕組みを理解しようと思ったらC言語を真剣に勉強する必要があると思うのですが、
C言語は仕事では使わないし、
これらのソフトウェアの裏側の仕組みを理解しても実務に役立つわけではないと思うので
(教養は得られると思うのですが即効性はないという意味です)、
仕事でつかっている言語やライブラリの勉強のほうが優先順位が高くなり、C言語の勉強は後回しになっています。

C言語を実務で使わないWebエンジニアが「興味・関心のあるOSSを理解したい」
という理由だけでC言語の勉強を始めることは間違っていますか?
それ以前に前提としてなにか考え方がおかしいところがあれば指摘をお願いします。

回答

LinuxやRubyやvimやgitが好きで、これらのソフトウェアの仕組みに興味があります。

最近では高級な(ハードウェアから遠い)言語やフレームワーク、APIを組み合わせた開発方法が取られることが多いですが、その基礎を知っておくことは常に意味があるので良いことだと思います。なぜならば、基礎はなかなか変化しないため知識が長きに渡って役立つからです。

これらは全てC言語で書かれてあるので、
仕組みを理解しようと思ったらC言語を真剣に勉強する必要があると思うのです

そのとおりだと思います。

C言語を実務で使わないWebエンジニアが「興味・関心のあるOSSを理解したい」
という理由だけでC言語の勉強を始めることは間違っていますか?
それ以前に前提としてなにか考え方がおかしいところがあれば指摘をお願いします。

間違ってはいないと思います。前提もおかしいとろこは無いと思います。
そもそも、「興味があったから勉強してみる」とは人間に本来備わっている純粋な知的欲求であって、それによって人類は発展してきたのですから、「興味があることを勉強する」という行為は常に良いことだと個人的には思います。たとえその対象が犯罪や残虐な行為であったり非道徳的なものであってもです。当然、シチュエーションや本人の年齢によってはふさわしくない場面もあるでしょう(例えば小学生に風営法とその抜け道とその実際を講義するのは明らかに間違っていますね)が、知ること、勉強すること自体が悪であるような対象って無いんじゃないかと思います。何かありますかね?

なので「C言語」のところが何であっても答えはYESなのですが、おそらく今回の質問者様はそういうことを問うてるのではないように思います。

というのは、

(教養は得られると思うのですが即効性はないという意味です)、

これですね。

質問文全体から、「実務で役に立つかどうか」「自らのキャリアに役立つか」という前提が暗黙の前提としてあるように見えます。こうなってくると話はちょっと違ってきます。

まず、C言語は実務でも必ず役に立ちます。なぜならばC言語はハードウェアに近い言語(低級言語)であるからです1。C言語を使いこなすことで、OSは何をやっているのか?Linuxはプログラマに対してどんなAPIを提供してくれるのか?データ構造とは何か?ポインタとは何か?システムコールとは?等など、LinuxやGit, Vimのみならず計算機そのものに対する知識が深まるからです。

しかしながら、これは仕事という面で考えたときには「C言語を知ってる」ということがダイレクトに人事評価にプラスであったり、転職時にも有利に働くかと言うとそうでもありません。質問者様がおっしゃる通り、いろんな場面に効いてくる「教養」に近く、すぐに効いてくる何かではないです。ここが難しいところです。C言語は計算機そのものの理解や、LinuxやGitといった基礎的なソフトウェアの理解に非常に有効ではありますが、仕事でそれがダイレクトに評価されることは少ないのです。例外的に組み込み系のソフトウェア開発が存在しますが、日本の組み込み系ソフトウェア開発とは「ハードウェアの制御の延長」みたいな仕事が多いので、Linux上で動くソフトウェア群とはまた毛色の違ったものになると思われます。

なぜC言語のスキルは評価されないのか?私もはっきりとは分かりませんが、マネージャーや経営者が

  • 仕事であれば生産性の高い高級な言語・フレームワークを覚えているエンジニアのほうが有利と考えている
  • そもそもC言語を理解していることの利点をよく理解していない
  • C言語を理解していることの利点は理解できるが自社のビジネス展開においてダイレクトに役立つところではないので特別プラス評価はしないと考えている

あたりが理由でしょう。2番めは無知に基づくものなのでエンジニアからしたら残念ですが、1番と3番めは営利企業である以上考慮されて当然ではあります。

ですから、あとは質問者様が有限の時間の中で「計算機自体の知識が深まり、色んな所で役に立つが仕事上なかなか評価されにくい、しかし知的興味がある」という対象に対してどれだけ時間を割けるかという話になるように思います。

で、ここからはもうすこし大きな視点での話です。

「【質問#168】35歳システム経験2年。進むべき?退くべき?」でも記載したのですが、現在の世界のIT業界はOSSの成果にタダ乗りしていると批判されることがあります。RedisやMongo DBがAWSなどによるマネージドサービスとして展開できないようライセンス変更を行ったというのが分かりやすい例でしょう。OSS開発者らは相当な労力をかけて自分たちのプロダクトを成長させてきたのに、Amazon他、その利益を享受してきた企業はもっと開発コミュニティにお金を落とすべきではないか?ということです。

これも議論があるとは思いますが、OSSコミュニティの主張を完全否定する考え方の人は少ないのではと思います。

C言語、そしてLinuxやGitといった今やどこの企業でも使っているOSやツールについても同様で、我々はそれらOSS資産の恩恵を受けてはいますが、その開発に参加したり、企業がお金を落としたり、OSSの中心となる開発組織が運営するマネージドサービスを使用したりということをしない限り、彼らに直接還元することは無いのです。私はここをもうちょっと考えても良いんじゃないかな?とは思います。とはいえ、私自身何かできてるわけでもないですが。

ですから、そういう視点で言えばむしろC言語やC++を勉強して開発コミュニティの手伝いをするべきと言えなくも無いような気がします。もちろんこれはライセンスにそう書いてあってやる義務があるとかいうわけではないですし、OSSコミュニティが貢献した人が偉いというわけでもないですが。私自身うまく言えないですが、開発者は相応に敬意を払うべきですし、出来る限りで良いので金が落ちるようになるべき、そしてそれは強制されるべきではない、という気がしますね。そういう視点で言えば、GitHubスポンサーなどはとてもいい試みだと個人的には思います。

最後、ちょっと話がズレてしまいましたが、そういう諸々の事を考えながら勉強すべきかどうかを決めて頂けたらと思います。最後の話は書いといてあれですが、ITエンジニア2年目という人が積極的に義務感を持ってどうこうすべきという話でもないので、まぁ頭の片隅にでも置いといて頂けたらそれで十分と思います。


  1. C言語を低級言語の枠に入れてよいかというと議論の余地があると思いますが、ここでお伝えしたいのは「ダイレクトなメモリ操作やシステムコールを発行できるかどうか」なので低級言語に含めることにします