C言語の壁?

採用担当者BLOG

C言語登場の歴史

American National Standards Institute、通称「ANSI」=米国国家規格協会は、日本で言えば「JIS」に類する。JIS規格は日本政府が制定する事に対してANSI規格を発するANSIは米国政府とは一線を画す非営利団体。政治の思惑で左右されるJISよりも、「そんなの(政治の思惑)関係ねえ」と言えるANSIは一旦規格制定されたことは変更されにくい。つまり、ANSIが認めたら長く「標準規格」として続く。共和党政権が民主党政権に代わってもANSI規格はそういうことに左右されない。賄賂も通じないかどうかは知らんけど・笑

1940年以前に、チャールズ・バベッジさんが機械式コンピュータなるものを開発してしまった。この機械式コンピュータなるものをもっと「動かす」為に命令する言葉が『機械言語』。そして、1940年代のいつ頃か知らんけど(知らんのか!)Assembly言語が生まれ、機械語からAssembly言語で『プログラム』を実行することが可能になり、”単純な処理なら”コンピュータで実行することが可能になった。

“単純な処理”ではなく、もっと”難しいこと”をコイツ(コンピュータ君)にやらせて俺たち人間はもっと楽になろうじゃないか・・・と考える人たちは、取り敢えず、コンピュータ君に処理させたい物事の順序を色々と考えた。この順序に乗っかるものなら『プログラム』が可能ではないか?ということだ。この順序(順序通り=手続き通り)のプログラムだが、Assembly言語で書くよりももっと楽な書き方は無かろうか?と考える人たちも出て来て、『手続き型プログラム言語』が登場する。Fortran(1954年)ALGOL(1950年代中頃)、COBOL(1959年)、PL/1(1964年以前)、BASIC(1964年)などである。物事を成す為の手順通りに(コードを)書けば取り敢えずコンピュータ君は望んだ結果を出せるようになり、その精度も上がっていき『手続き型プログラム言語』凄い!となる。特に、COBOLやPL/1は手続きの書き方などで他言語を圧倒し、現在でも金融業界(銀行、証券会社他)や自治体など「計算数がけた外れに多い」基幹業務システムでの需要は続いている。

弊社の経営者などは、あまりの使い勝手の良さに「COBOLなんて誰でも書けるだろう」ってのが口癖である(オイ!)。「誰でも書ける」は言い過ぎにせよ(言い過ぎだ!)、『PG(プログラマ)』や『SE(システムエンジニア)』の仕事が多く誕生していく大きな要因になったことは間違いない。

そして手続き型プログラム言語にB言語(1969年)が誕生。この言語自体は有名にはなれなかったが、B言語から生まれた(息子か娘かは知らんが)究極の”名言語”が1972年に登場するC言語です。このC言語は、自動車がコンピュータチューンされていく時代に乗っかりECU(エンジン・コントロール・ユニット)や、同様に航空機や船舶その他ありとあらゆる動力エンジンをコントロールする(機械制御)プログラミング言語として各メーカーに採用された。また、コンピュータの小型化(メインフレームからの脱却)に伴い、PC時代が到来するとC言語需要は爆発的に加速し、あっという間に「ものづくり」プログラミング言語の王者に君臨し、そのプログラミング領域は機械の世界から飛び出し、業務システム分野にまで及ぶようになる。こうなると、C言語そのものをもっと使い易く出来ないものか?という動きにもなるのだが、それは兎も角、規格化=標準化の必要性の声が高まる。そして・・・

1989年に、いわゆるC89(C言語89年バージョン)がANSIの標準プログラム言語に既定された。翌年のC90も含めてANSI-C言語と云われている。つまり、米国でC言語が完全に市民権を得た年である。標準であるANSI規格のC言語でプログラミングされるようになっていった。ANSI-Cは、ISOの標準規格ともなり、当然ながら?JIS規格の標準にもなる。

という話であるが、世の中を大いに変えた(変えてしまった?)C言語は「エライ」とは言える。

C言語系のエンジニアはエライのか?

C言語は「エライ」かもしれないが、(この業界に於いては)C言語を使えるSE/PGは偉いのかと言うとそういう事はけっして無い。それは断言出来る。が、C言語権威主義みたいな独特の「匂い」が漂っている”場所”もこの業界の中にあるのも事実である。「組込み」「制御」を強調し過ぎていた弊社も、現在は兎も角、過去にはその独特な「匂い」が漂っていたよね?(笑)

取り敢えず、弊社の事はさて置き・・・

手続き型プログラム言語の攻勢は続き、Pascal(1970年)、Ada(1983年)、MATLAB(1984年)、Perl(1987年)、ColdFusion(1995年)、VisualBasic(1991年)、VBScript(1996年)その他が誕生するが、手続き型プログラム言語には決定的なデメリットがある。そう、再利用が出来ない。作りの手順(手続き)を変えるには、また一から作り直さねばならない。(詳しく書かないけど)

比較的短いコードならそれくらい(一から書き直し)我慢するけど、長い手続きを一から書き直すのは面倒だ。何とかならんのか?

それを何とかしたのがAda。1983年に手続き型言語として登場したAda(元々、米国国防総省の仕様要求の入札に勝ち残った”優秀な”組込みシステム向け言語)。プログラム言語とかソフトウェア、ハードウェア、何々システムとかいうものは、軍事や兵器の発展と共に進化・歩んできたわけであり、Adaもそういう中の一つ。そして、Adaの「開発チーム」は手続き型プログラム言語であったAdaに対し様々な機能を付け加えていき、そして1995年にAdaはオブジェクト指向言語へと進化した。

(※但し、世界初のオブジェクト指向言語は、1972年に登場したSmalltalk(1980年代に、C言語にSmalltalkのオブジェクトシステム機能を取り入れたObjective-Cが登場する))。

このAdaが世界標準のプログラム言語にならなかったのは、米国国防総省の思惑があっての事かもしれないなと穿った見方も出来ないではないが、Adaの追加機能の一つである汎用プログラミング機能を取り込んで世界的オブジェクト指向言語として大きく飛躍したのがC++

C++は、C言語に対してクラス機能を付けた『C with Classes』(1979年)として登場していたものを1983年にC++と改称させたプログラム言語。そして、1989年に多重継承と抽象クラスその他の機能が追加。この時点でC++は、オブジェクト指向言語として世界的に認知されていた。が、まだまだオブジェクト指向プログラム言語がC言語の王者としての牙城を脅かすまでにはなっていなかった筈。

因みに、C言語は、C++やObjective-C、Perlを含め、13のプログラム言語を生んだと云われる。中でも、現在最も需要の高いプログラム言語を列記すると以下の通り。
Java」(1995年)「LiveScript」(1995年)「C#」「Python」「PHP

Javaは、現Oracleのサン・マイクロシステムズが開発。そのサン・マイクロシステムズと業務提携していたネットスケープ社が短期間で開発したのがLiveScript。「Java」という名称が急速に高まり、ネットスケープ社は合意の下でLiveScriptの名称を「JavaScript」へ変更。という経緯なので、JavaからJavaScriptが派生したわけではない。JavaもJavaScriptも現在最も需要の高いオブジェクト指向言語として世界を席捲している。

以上のように、C言語は、多くの手続き型プログラム言語やオブジェクト指向プログラム言語を派生させた、或いは強い影響を与えた。つまり、「C言語、エライ!」は正しい。が、繰り返すけれど、「C言語系のエンジニアはエライ!」と言うのは正しくない。もしも同じ会社に属していて、人事評価に於いて、非C言語系の社員が、C言語系の社員よりも不当に低い評価を受けているのであれば、その会社は「C言語権威主義」のようなものに毒されている。かもね?

C言語とC言語から派生したオブジェクト指向言語。学ぶならどっち?

C言語をベースにして、C++やJava、C#、Pythonなどが生まれた。その事を根拠にして、「C言語を先に学んだエンジニアは他の言語も学び易い」と云われている。ところが、その逆は聞かない。つまり、「他の言語を先に学んだエンジニアにとってC言語はけっして学び易い言語とは言えない」。

その理由は何だろう?

弊社の経営者はその理由を次のように単純明快に答えた。「C言語は(他言語に比べたら) 難しい」。なるほど。でも、それ以外の答えはないものかね?

私は、弊社の経営者に比べれば明らかにアホなので、足し算は割と得意でも引き算は苦労します。

C言語+オブジェクト指向=オブジェクト指向プログラム言語(Java/C#/Python、他)

以上のことは、先述して来た通りです。つまり、C言語さえ先に学んでおいたら、後からオブジェクト指向さえ理解出来たらJavaでもC#.NETでもPythonでも理解出来るのでは?と思うのですよね。 逆算しますと・・・

オブジェクト指向プログラム言語(Java/C#/Python、他)ーオブジェクト指向=C言語

なのですが、この引き算って、その前の足し算に比べたら何となく(物凄く)歪に感じませんか?めっちゃ難しそうな引き算です。

とってもアホである私には、弊社の賢い経営者の単純明快な答えに「そうですね!」と同意するしかないですけど、確かにC言語は難しいプログラム言語でしょうが、その難しいプログラム言語を知らずにいきなり「オブジェクト指向」を覚えてJAVAかPythonかのコードを覚えることは、もっと難しい事のように思えます。上述の計算式では・・・足し算ではなく、方程式になりそうです。

(ⅹ)+オブジェクト指向=オブジェクト指向プログラム言語(Java/C#/Python、他)
(X)が何か答えよ・・・答え= C言語

みたいな。つまり、C言語の存在を方程式のように後から導き出す(知る)よりは、最初っからC言語ありきの足し算学習した方が、急がば回れじゃないけどよっぽど良さそうな気がするわけで・・・

あくまで個人観だけど、当社に入社してくれた未経験や新卒者で考えてみると、情報処理資格(昔で言えば、二種、一種…。現在で言えば、基本情報、応用情報…)を保有して入社した人、或いは、入社後にそのような資格を得た人は、先に他の言語を学習しても、後からでもC言語は習得出来ていた。

C言語習得に対し最難関の一つが『ポインタ』(特に、ポインタへのポインタ=ダブル・ポインタ)。「ポインタ」を理解するには、『メモリ』とか『領域』、『アドレス』を難なく理解出来るかどうかが鍵となる。特に『メモリ』。『メモリ』が理解出来なければC言語は理解出来ないという理屈になる。

そして『アルゴリズム』。アルゴリズムというものは紀元前3世紀には既に確立されていた『解』を導き出す為に必要な『手続き』であるが、つまり、手続き型プログラム言語であるC言語を習得する人が、アルゴリズムを組み立てるのが苦手であったり疎かにする人であってはならないわけだ。これは、コンピュータ以前の資質の問題である。なんせ、紀元前3世紀にコンピュータなんて無かったのだから。そして、手続き型プログラム言語が登場し、『解』(答え)が分かっていることへの処理をコンピュータに任せることが可能になった時、アルゴリズムの重要性が殊更強調されるようになった。間違ったアルゴリズムによって構築されたプログラムは誤った答えを出してしまうのだから当然のことだ。

ところが、オブジェクト指向言語に於いてのアルゴリズムは、オブジェクト指向の特徴でもある『カプセル』の中に仕舞い込まれて”見えない化”されてしまう対象ともなる。表現が正しいかどうかは分からんけど、手続きの簡素化が起きる。手続きが簡素化されることが当たり前のプログラミングに慣れてしまうと、それ(手続きの簡素化)を許されない手続き型のC言語は面倒でややこしく難しいとっても嫌いなプログラム言語になってしまうのではなかろうか?

エンジニアを”言語差別”する事ほど愚かな行いはない

この文章、長いやろう?長いよね?読む気無くすよね?

つまりそういう事ですね。長文嫌い!長時間の野球の試合嫌い!長時間映画嫌い!・・・兎に角、時間が長くかかることが嫌いな人が凄く増えてます。そして、「IT業界だと楽に・・稼げそうだ」みたいな誤解もあるみたいで、IT系民間スクールで手っ取り早くオブジェクト指向プログラミング言語を学び転職!という人も増えている。でも断言出来ますが、しっかりとアルゴリズムを考えて、その手続き通りの”長い”ソースコードを書く・・・なんて「私には(俺には)似合わない!」という人達にとっては、C言語系の仕事は出来ないわけです。尤も、C言語系の仕事をしようなんてサラサラ思っていない転職者も大勢いるでしょうけどね。

ちょっと忘れたけど、何処かの大学の偉い教授が「ちゃんとしたプログラミングを身に着けようとするのであれば1000時間は必要です」と述べられていた。1000時間、毎日2時間自己学習しても500日が必要だ。500日って1年以上である。でも、逆に言えば、1年半あればC言語であろうとJAVAであろうとC#であろうとC++であろうと習得出来ることになる。C言語の他にオブジェクト指向言語をもう一つ。というプログラム言語を身にまとって就職活動したら、恐らく、殆どのシステム会社は「採用!」って言うでしょう。そういう人、弊社にも来てくれないかな・・・

さて、「C言語は難しい」が、知識ゼロからでも、1000時間くらい本気で学べば習得出来る筈である。情報処理の学習をしている人なら、500時間くらいで完全にモノにするかもしれない。しかし、情報処理の学習はしているのに「C言語、分かりません」という人は、そもそもプログラミングそのものを理解することに適性がないのかもしれない。それでもC言語系の仕事をしてみたい人には、数学から再勉強することをお勧めします。これ書いている人も、『やり直し数学基礎講座』みたいなものを受けてみてから再度、情報処理の勉強してみたら意外と理解出来たから。

因みに、弊社では最も古株のC言語系のSEであるD氏は、「国語力があればプログラマにはなれる」と言っている。正しい文章が書ければ大丈夫って事なんだろうけど、心当たりは物凄くある。これ書いてる人は国語力が無い人だから(苦笑)

「組込み、或いは制御系の仕事をしたい。けれども、C言語は分かりません」という人に対して、「大丈夫ですよ。入社後に学習出来ますから」とはけっして言いません。弊社程度の小規模企業では、入社後に何年もプログラム言語学習に時間を割くことは出来ません。現在、新入社員や経験の浅い人に対するプログラム研修はJava、若しくはPythonで行っていて、C言語は新人研修には用いていません。(C言語の経験者(学習経験者含む)には、復習を兼ねてC言語研修を行っています)。ですから、C言語系の仕事を希望するのであれば、C言語を入社前から分かっていた方が絶対にいいです。組込み・制御系などの現場に行ったら、プログラミングで余計な苦労を負います。

ところで・・・

C言語が使える人たちに対する提灯記事っぽく書いたけど、組込み・制御系エンジニアには、DBに苦労している人が多いことも付け足しておきます。大体さ、データを扱う事に長けている筈の情報処理業界にいて、DBが弱いなんて威張れる話じゃないだろう?でも彼らはそれを然も当然の如く言う。「組込み・機械制御・通信制御・基盤構築・・・に、DB関係ないですから」と。C言語系の仕事以外やる気はないですよと言っているわけだ。つまり、C言語以外のプログラム言語を覚える気はサラサラ無い、ということだ。完璧に、「C言語権威主義症候群」に罹っているね。

組込み系、機械制御系、通信制御系、基盤構築系などのエンジニアの殆どは、C言語のプログラミングに関しては達者な人たちであることは認めよう。しかしである。C言語が達者な彼らは、C言語を使う事が極めて少なくなった業務系システムなどを下に見ているのではないか?とも感じているわけである。

C言語を学んだ人は他の言語を覚えるのが比較的容易に出来ている。と書いたが、つまり、業務系システムなどのエンジニアには、「C言語出来るけど、JAVA、或いはC#、或いはVB、或いはJavaScript、或いはCOBOL、他も出来るよ」という人達が結構いる。この業界には、どんな言語だって怖くないっていう猛者が結構いるわけだから。

組込み系、機械制御系、通信制御系、基盤構築系の仕事は、主たるプログラム言語としてC言語が用いられる。C言語を学習したことのない人にとっては敷居の高さを感じることは間違いない。が、C言語を学んだ後に別の言語を知った人たちにとっては「何故、そこまで偉ぶっている?」的な思いが生じるのも確かだ。

“ものづくり”的なプログラミングスキルも、”お客様の業務を円滑にする”為のプログラミングスキルも、IT業界に属する企業にとってはどちらも必要なのである。共により良い社会の為にコンピュータと向き合っている同志であるべきなのに、「仕事」「分野」によってエンジニア格差を付けようとすることは愚の骨頂である。

仕事で使用するプログラム言語とかシステム分野などで優劣を付ける?そういうことを社員に感じさせるような会社は、必ずやエンジニアリング企業としての存在意義を失うのである。特に、部下を監督する立場にある人達は、絶対にそのようなことを口にしてはならないのである。口はわざわいの元である。

社員募集!

というわけで、恒例化してきた「独り言」の後の社員募集です。

C言語に自信有りの、組込み系(下回り系)、機械制御系、通信制御系、基盤構築系のSEさん、C言語系のPGさん、随時募集中です。

詳細は、キャリア採用ページをご参照ください。どうぞ宜しくお願い致します。

尚、C言語未経験だけど、この記事読んで興味を持った人(いるかな?)、遠慮なくご相談ください。