「C言語書けます」のボーダーラインはどこか?

C言語を覚えると組込み系の採用に有利」みたいな就職・転職向けの文言を見る度に、世の中そんなに甘くないと言いたくなるのです。

多分、組込み開発に限らず、例えばLinuxコンソールアプリ等でC言語を散々使った人も同意するのではないかと思うのだけど、Cプログラマは他のCプログラマに厳しいものだ。

そもそもC言語自体が鋭い刃物に例えられる代物で、メスにもドスにもなりうる取り扱い注意な言語だ*1。だからCプログラマは誰しも、C言語について一言居士となる。

そんな連中からすれば、C言語の基本文法を知っていて簡単な課題を解ける程度の人は、「C言語を書ける人」には含まれない。

では、どのレベルの人が「C言語を書ける人」に該当するのか?

よくよく考えてみると、次の点をクリアしているか否かがポイントではないかと思う。

  1. C言語の各種文法の「効率的で理にかなった使い方」をある程度知っている。
  2. C言語とメモリモデル(スレッドじゃなくてハードウェア・アーキテクチャの方)にまつわるアレコレをある程度把握している。

(1) は、例えば普通のCプログラマは関数の引数として構造体の実体ではなくポインタを指定するように実装するものだが、そういう癖を身に着けていているか、そうする理由を知っているか否か――ということだ。

この辺は、師匠となる本や人に揉まれながら、C言語でそこそこの大きさの実用的な何かを実装した経験によって成長する部分だろう。

ぶっちゃけた話、(1) はC言語に限らない話で、他のどの言語でも同じだ。C言語が特異なのは (2) の存在だ。

(2) は、要するに『Cプログラミング専門課程』で語られているような、C言語とメモリに関する諸々をどこまで体得しているか、という話だ。

プログラミング言語はハードウェアに対するある種の抽象化層として機能するのだけど、C言語はその抽象化層が薄くて且つ容易に穴をあけることができる*2。で、穴の中にはメモリ空間が広がっている*3

穴は簡単にあいて容易に拡がる代物であるし、Cプログラマもまたよせばいいのに好き好んで穴をあけようとする連中なもので、どうしても穴の中のメモリとの付き合い方を覚える必要がある。うまく付き合えないCプログラマは翌朝顔にひっかき傷をこさえて出勤する定めにある。

そもそも組込み以外のソフトウェアであっても、ファイルやTCP/IP経由で外部とバイナリデータ*4でやり取りすることになった時点で「メモリ上のデータの形式」というメモリとのお付き合いが始まるものだ。組込みでなくともC言語を使うなら、メモリとの上手な付き合い方は必須の教養だ。

抽象化層の薄さと穴のあけ易さはC言語(とC++)の特異な部分だ。他の言語はもう少し厚い抽象化層を持っているし、穴があきにくいように工夫されている。だから大抵の言語では抽象化層(言語機能とその有効な使い方)を学べば大半の物事が済むのだが、C言語では言語機能という抽象化層を学ぶだけでは不十分で、穴の中のメモリを知る必要がある。

で、メモリとの付き合い方を毎年指導するのがしんどいので他人任せにしたいのだが、唯一使える本だと思っている『Cプログラミング専門課程』は入手困難なのである。

Cプログラミング専門課程

Cプログラミング専門課程

代わりの本、何か無いかなあ?

*1:この例えの元ネタは藤原博文氏の『Cプログラミング診断室』である。

*2:だからこそドライバのような「ハードウェアを直接叩く」系のソフトを書くことができるのだが。

*3:組込みソフトウェアの場合は物理メモリだし、WindowsLinuxなどのアプリの場合は論理メモリだ。

*4:ここでは「テキスト形式ではないデータ」ぐらいの意味で使っている。