💨

40代エンジニアの過去語り 懐古奇譚 ~やっぱりそこにはC言語 篇~

に公開
2026/01/04

エンジニアも40代となると、マネージメント分野へ進んでいくことも多いでしょうが、自分はひねくれているのか、技術を突き進んでいきたいといまだに思っています。
みなさんはプログラミング最初の一歩はなんだったでしょうか?

自分が一番最初に触れたプログラミング言語はN-88 BASIC。いまでも数学の教科書にあるのでしょうか?
一番最初に感動したのはHot Soup Processor。初めてEXEファイルが作れることを楽しいと思いました。
一番最初にきちんと学習したのはC言語になります。
業界にいる以上、C言語というのを聞いたことがないって人はよっぽどいないでしょう。それぐらい誰しもが知っている言語ですが、誰しもが完璧に書ける言語でもないと思っています。
もちろんそれは自分も例外ではありません。ポインタのポインタってなんやねん!

ちょっと学習して調子に乗った自分は、その経験から、もう少し新しい言語を勉強してみたい、と思うようになりました。そうです、C言語をインクリメントしたC++言語です。

結末がお分かりの方はおられると思いますよ。
自分はこのルートをたどってはいけない、と思います。

そりゃそうですよ、 printf("hello world\n"); が std::cout << "hello world" << std::endl; になり、「クラス」が登場します。

当たり前に「わかるかこんなもの!」と挫折。
いまでこそこれはストリームで、それに対して出力するんだなとか、(ひどい言い方をすれば)クラスは構造体をパワーアップさせたものなんだな、とそれっぽく理解をしています。

C++を放り投げた自分はJavaへ向かっていきました。ティータイムです。
JavaもC++に負けず劣らずクラス思考の言語です。
System.out.println("Hello World"); になりましたが、構造体+関数と思うとまだC言語の知識どおりに読むことができます。クラスのフィールド変数も、構造体+変数と思うと同じように理解もできます。
アクセス修飾子がなんだかわからず、クラスのメソッドをすべてpublicで書いてた人は、きっと自分だけじゃないでしょう。

ちょうどそのころ、新しく言語に触れました。C++をさらにインクリメントしたC#言語です。
一度書けばさまざまな環境で動き、Microsoft純正だし、書き方もJavaっぽいわけです。
これはいける!とのめりこんでいきました。
基本的にはJavaとそっくりなので、クラスのメンバ変数は構造体+変数だし、メンバ関数は構造体+関数へのポインタみたいなものなわけです。
そんななか、ユーザー操作で全体的に処理を切り替える処理を実装する必要があり、とんでもない量のswitch-caseを書き換えたわけです。当たり前に書き忘れを生じ、しっかりバグるわけです。
同様の修正を2回やったところで、ポリモーフィズムを勉強しました。
そうです、構造体へのポインタのすげ替えです。
わかってしまうと、「なにこれすごい!」となります。当たり前にオブジェクト指向言語に沼ります。
継承や委譲のパターンも同時に勉強しました。

当時は組み込み系のプログラムに近いところにいましたので、C言語やC++言語のヘッダーを使うケースもありました。すると、「解る」わけです、C++が。
クラスの概念はJavaで、カプセル化・ポリモーフィズム・継承はC#で勉強したことによって、ざっくりと理解が進んでいます。ぶん投げたC++が(ストリーム以外は)書ける!
そして、あれほど苦手だったポインタも、C#やJavaの「参照」を知ったことで、そういう動きなんだ!と自分の中にすとんと落ちる感じがしました。

すると、何が起きるか。

Visual Basic.NETもPHPもJavaScriptもTypeScriptもDartも、クラスだし参照だらけなわけです。
構造体+変数、構造体+関数、構造体・変数へのポインタと一緒の考えも適用できてしまうわけです。
(もちろん、単純に適用するわけではなく、言語によって制限の強いポインタだったりと扱い方は異なりますが)。
Pythonですら、いまはクラスにメンバ関数、参照を持った変数なわけです。

この言語の違いはなんなのか。C言語での概念がわかってしまうと、違いは単純に文法だけになってしまいます。
乱暴な言い方ではありますが、自分には、C言語を拡張したものがC++、あまりになんでもできすぎるので制限をかけていったのがその他の言語、のように見えてしまっています。

よく、「C言語はちゃんとやっておいたほうがいいよ」と言われませんか?
変数や関数はほかの言語であっても登場しますし、勉強します。
文法は当たり前ですが言語によって異なります。
ところがそれらの概念の根っこって、結局構造体+αに落ちていきます。これを安全に簡単に使えるようにしているのが新しく登場したプログラミング言語のように見えてしまいます。

自分はエンジニアとして多くのプログラミング言語を経験してきましたが、その根底にはやっぱりC言語だった、と感じています。
古いけど新しい。たくさんの言語を渡ってきたからこそそんなところに着地しているのかもしれません。
C言語をやっておけばOK、というわけではないですが、さまざまなプログラミング言語に通ずると思いますよ。

ここまで書くと、
「じゃあC言語を覚えていれば、あらゆる言語書けちゃうじゃん?」
と思うかもしれませんが、関数型言語の考え方や各言語特有のフレームワークやエコシステムは、
それぞれ個別に向き合う必要があります。
ただ、基本となる考え方ではあるので、新しく触れる言語を恐れることが少なくなります。

いままでわからなかった考え方が、「あ、そういうことなんだ!」と理解できる瞬間が好きである以上、技術者としては、どん欲に学習を続けていかないといけないのかもしれません。
自分にとって、その学習の原点にはやっぱりC言語がありました。

古いけれど、新しい言語なのかもしれません、C言語。

Discussion