C言語は難しいのか?
高木です。おはようございます。
先日から社内で話題になっているのですが、他社は未経験の新人にはJavaを教育しているところが多いようですね。
それに対して、弊社は主にCを教育しようとしています。
今日はこの辺りの話をしてみたいと思います。
新人にもいろいろあって、実務は未経験だけれど趣味などでプログラミングを経験している場合もあります。
そのような新人に対しては、すでに経験しているプログラミング言語から出発したほうが話が早いこともあります。
昨年入社した新人は、CもC++もJavaもC#も経験していましたので、一から教育するというよりはそれぞれを深掘りする方向で進めました。
今後、たとえば新卒社員を採用するような場合にも、本人の状況を確認してケースバイケースで進めていくことにはなると思います。
そんなに大量に採用する予定がないので、一律のカリキュラムで研修するのではなく個別の対応ができるのは利点だと考えています。
まだどんなプログラミング言語も習得したとはいえないほど経験が浅い新人に対しては、最初にも書いたようにCから教育していこうと考えています。
クローバーフィールドは、どちらかといえば組込みや制御を中心に扱う方向にシフトしています。
それであれば、ハードウェア寄りの知識が不可欠になるわけで、JavaではなくCを教材にするのが妥当だと考えます。
さて、ここからが本題です。
世の中には「Cは難しい」と決めてかかっている人も多いようですが、本当にそうでしょうか?
実際にはCというプログラミング言語自体はそんなに難しくはありません。
むしろ簡単な部類だと思います。
言語仕様自体がシンプルなので覚えることは少ないですし、初版のC(=C89)なら標準ライブラリを全部覚えてもたかが知れています。
難しいのは、Cを使って低水準(程度が低いということではなくハードウェア寄りの意味)なプログラミングをするのが難しいということだと思います。
ただ、それも考えようで、どこかの誰かが作った便利な部品をつなぎ合わせるだけのプログラミングばかりやってきた人にとっては、便利な部品がないので「難しい」ということになるのです。
私はいつもよくいうのですが、どこかの誰かが作った「便利な部品」をつなぎ合わせてアプリケーションを作るだけならCを覚える必要はありません。
そうではなく、その「便利な部品」を作るどこかの誰かになるための言語がCなのです。
ですので、Javaやスクリプト言語とはそもそもの用途が異なります。
ちなみに、Javaやスクリプト言語でハードウェアを直接制御するようなプログラムを書こうと思うと、とんでもなく難しいことになります。
おそらく不可能といってもよいでしょう。
出力ポートに1か0を書き込むだけでも、どこかの誰かが作った「便利な部品」の助けを借りないことには実現できそうにありません。
また、Cが難しいといわれる理由のひとつに、ガベージコレクションがないのでメモリの解放を自分で行わなければならないというのもあります。
確かにそうなのですが、JavaやC#なんかでも、メモリの解放こそガベージコレクションで済みますが、リソースの解放は自分で行わなければなりません。
それらの言語は入門の段階から「メモリの解放はしなくてもいい」というところから入っているので、リソース管理がまるでできていないクソコードの温床にもなっているように思います。
もうひとついうと、Cの主な用途である組込み、それも典型的な組込みといえるマイコンのプログラムでは、そもそもメモリの動的な割り付けや解放を行うこと自体が稀です。
メモリを静的に確保しておけば、面倒なメモリ管理を行う必要がありません。
もちろん、データベース管理システムや言語処理系などをプログラミングする際には動的なメモリ管理が必要になってきますので、その場合はがんばるしかないのですが。
逆にいえば、自分でメモリ解放のタイミングを制御できない言語では、かえって設計が難しくなる可能性さえあります。
決してCは特別難しいというわけではなく、Javaやスクリプト言語のほうが適した分野で単純に実装言語をCに置き換えようとすれば難しいというだけだと思います。
Cが適した分野で単純に実装言語をJavaやスクリプト言語に置き換えようとすると、難しいを通り越して不可能になってしまうわけですから、用途によって言語は使い分けるべきだというだけの話なのです。
クローバーフィールドの新人教育では、Cを軸足にしながら、必要に応じていろいろことを習得していってもらおうと考えています。
最終的にJavaやスクリプト言語を使うにしても、Cを使いこなせるかどうかで、そのプログラマーがどこまでやれるかの限界は違ってくると思いますよ。