
【IT教育】C言語を大学のプログラミング教育で使うのをやめるべきだ
プログラミング初心者のときを振り返って
自身が大学1年のときプログラミングを始めてみて、最初に使ったのはC言語だった。
自分は北海道大学に入学したのだが、1年次は「全学教育」と称したいわゆる教養課程であり、実際のプログラミング演習は専門課程に入る2年次からであった。そのため最初は自分でC言語の本を買って自習したものである。
既に複数回改訂がされているので今とは表紙も内容も変わってしまったが、当時はブックオフで中古で買った『明解C言語』を使って自習した。
これでC言語のプログラミングの初歩は理解できたものの、結局C言語を使って何を作ればいいんだ?というのは分からずじまいだったのだが。
プログラミングを自習をするほかには、北海道大学の全学教育で開講されている「誰でもプログラミング」という授業を受講したりもした。

この授業ではプログラミング言語としてRubyを採用していた。当時使っていたのはRubyのバージョン1.8.7(!)であり、まだ2.0も出ていない頃だった。
自習でC言語を触っていた時のような面倒くささはなくて、結構使いやすい言語もあるんだな~と思いながら楽しんで課題をやっていた記憶がある。この点については、この授業は非常によくできていたと感じる。
しかし、その後の2年次に進級して専門教育が始まったあとは典型的なC言語とJavaを使ったプログラミング演習ばかりで、それ以外の言語を授業で扱うことはなかった。
初心者にC言語を教えるときの問題点
自分は最初に予習していたのでプログラミング演習中につまづくことはあまりなかったが、C言語は初学者にとってはかなり難しい言語と言える。初心者に対して概念を伝える段階からしてすでに難しい。
ヘッダファイルの #include<stdio.h> は「おまじない」としてとりあえず書けばいいと教えてお茶を濁しているが、そのほかにも初心者が躓くポイントが盛りだくさんである。
論理演算
変数宣言、型の概念
プリミティブ型と参照型
再帰関数
構造体 (struct)
ポインタ
メモリの動的割り当てと開放 (malloc/free)
これらの概念を半年足らず、15回のプログラミングの授業でプログラミング初心者の学生たちに理解させることは難しい。そしてちょっとした表記ミスでもセグメンテーション違反のエラーが多発する。なんとかこれらの内容を理解してもらえたとしても、すぐに実用的なアプリを作れるようになるわけでもない。
コンソール(黒画面)上に "Hello, World!" を表示させるまでは難しくなくても、その後に何ができるのかがよくわからないと言われる所以だ。これらは特にゲームを作りたいと意気込んで情報系に進学した人にとってはガッカリするような事実だろう。
自分もC言語の入門書を読み終わった後、「で?この後は何をしたらいいの?」と疑問に思ったものだが、入門書ではその疑問には応えてくれなかった。
もしも今の自分が大学1年当時の疑問に答えるのなら、「C言語など捨てて、他のプログラミング言語(C#,Python etc.)をやれ」ということになろう。
C言語を理解すること自体が簡単ではないのに、ある程度理解できたとしても何も作れないのでは教育するだけ時間の無駄ではないだろうか。これにより、ただでさえ適性のある人が少ないプログラミングの分野で辛うじて残った人たちの学習意欲を削ぐ結果となってしまっている。
そんなことになるくらいなら、文法がシンプルで、実用的なアプリが作れて、実務でもよく使われるプログラミング言語を最初に教えた方が良いに決まっている。わざわざわかりにくくて使いにくい言語を初心者に対して教えるべき合理的な理由が全く見当たらない。
第一、仕事や研究でC言語がどうしても必要というならそのときに勉強するのでも十分間に合う。一番最初の段階からC言語でなければならないユースケースなどないはずだ。
時代遅れの大学のプログラミング教育
未だにC言語主体のプログラミング演習って・・・
北大のプログラミング演習のシラバスを久しぶりに見てみたのだが、自分が大学の学部に在籍していた10年前から何一つ変わっておらず、いまだに旧態依然としたカリキュラムのままC言語を使い続けているようだった。もしかすると30年くらい前から内容がほとんど変わっていないのかもしれない。


いまや、Go言語やRustといった次世代を担うプログラミング言語が台頭し、GAFAのようなビッグテックはもちろん、LinuxのようなオープンソースでもRustが新規開発プロジェクトに採用されている。
そしてポストC/C++と呼ばれる言語としてD言語のほか、ZigやCarbonのような新しい言語もここ数年で続々と登場している(広くエンジニアに定着したかどうかはともかく)。
このように目まぐるしく変わるプログラミング言語のエコシステムの中にあって、日本の大学のプログラミング教育ではいまだにカビの生えたようなC言語を使い続けている。
この状況はどうかしているし、教育関係者はプログラミング教育を時代に合わせて改善しようという気概が無いとしか思えない。プログラミング教育に限らず、どうも日本は教育カリキュラムの改訂が下手なのではないか。
アメリカの大学のプログラミング教育においてはプログラミング入門者向けにPythonが使われることが多く、C言語を使い続ける状況は生じていないようなので、日本固有の問題なのだろうか?
いや、C言語は現役で使われているから・・・という擁護の声もあるかも知れないが、それは単に昔のコード資産がC言語であったからである。
新しい開発にあえてC言語を使うようなことは組込み系でもなければまずない。もしかしたら近い将来には組み込み系ですらC言語を使わなくなる可能性だってある。
C言語はすでにレガシーと化した言語であり、選択肢がなかった4, 50年前であればともかく、今となっては古臭くなった構文の数々はプログラミング入門の教育に適しているとも思われない。
ほとんどの場合、大学のプログラミング演習で未だにC言語を使い続けているのは、昔に作ったカリキュラムや教材を今更作り直すのは面倒だからという教育側の都合ではないのか。
自分がプログラミング演習のカリキュラムを作るなら
もしも、自分が大学におけるプログラミング教育のカリキュラムを作れるなら以下の言語が候補となるだろう。
Go
Ruby
Python
Go言語は変数や戻り値の型指定をしなければならない難しさはあるが、文法が簡素でC言語よりも幅広い実業務で使いやすいメリットがある。動作もかなり高速な部類に入る。
エンジニアを目指すにあたってはそのままGo言語でプログラミング(コーディング)の知識を深めてもらうことも可能だし、C/C++やRustへの接続もしやすいという点でこの言語を初学者用に使う意味はあるだろうと思う。
ただし、Go言語もC言語と同様型指定のわずらわしさがあるので、これを避けて手軽にプログラミングを楽しんでもらうのであれば、PythonかRubyということになろう。個人的にはPythonよりもRubyを入門用のプログラミング言語として推したいところだ。
RubyはPythonほどの機械学習やデータサイエンス等の幅広い範囲への対応力はないものの、より直観的に使えて文法の縛りが緩いのがよい。筆者の主観的な意見にはなるが、コーディングの楽しさという点ではRubyの方がPythonより上であると感じる。
開発者のまつもとゆきひろが日本人であり、開発コミュニティに日本人が多いという点もプラスだ。ただ、実務で使う場合はほとんどRails環境が前提になってしまうという問題はあるが・・・
C言語の信奉者(とくに大学教員)への反論
下記の記事のような、"いかにも" もっともらしい意見もあるにはある。
しかし、「C言語の利点はよくわかりました。では、それは一旦置いてC言語以外でプログラミング演習のカリキュラムを組んでみて下さい」と言われて、この記事の筆者はできるのだろうか?
残念ながらそれが可能とは思えないし、それだけの知見も知識もないし必要性も感じていないことだろう。せいぜい "新しい" 言語としてJavaを持ち出すくらいが関の山ではないか。
結局のところ、この期に及んでC言語を未だに教え続けているという現状を、もっともらしい言葉で正当化しているに過ぎない。
Cはその後現れた多くのプログラミング言語に影響を与えているため、Cを学ぶことで他の言語の習得が容易になる場合が多いためCから習い始めることは有用です。特にC++は、Cと切っても切れない関係にある言語であり、C/C++のように一体に語られます。macOS/iOSの世界で使われてきたObjective-CもまたCと極めて深い関係にある言語です
Cは現在使われている言語の中ではかなり古い言語にあたりますが、未だに広く使われており、今後も広く使われ続けることが確実です。
macOS/iOSの世界においては、Objective-Cでの開発が廃れてSwift中心になっていることには触れられていないし、いろいろなオープンソースプロジェクトでC/C++のメモリ管理に起因する脆弱性が顕在化しており、Rustの使用が徐々に広がってきていることにも触れられていない。
そもそもC言語が多くのプログラミング言語に影響を与えているのであれば、C言語的構文が一般化しているということであり、どのプログラミング言語から始めるのでも問題ないことになりはしないか。
また、C言語が未だに使われているのは昔から広く使われてしまってリプレース自体に多大なコストがかかるからという消極的な理由でしか無い。間違ってもC言語が今日におけるベストの選択肢ということではないのだ。
例えばC言語の他にも、かつてはメインフレーム、特に銀行の勘定系システムでCOBOLが広く使われていた。しかし各所で膨大なコストおよび工数をかけてJavaによるオープンシステムへの移行が進んだ結果、いまや絶滅危惧種となっている(逆にCOBOLが出来るシニア世代のエンジニアが一部で重宝がられることもあるようだが・・・)。
C言語が今後も広く使われ続けるというのはあまりにも楽観的な未来予測だ。とくにWebサービス開発の現場ではC言語など目にする機会すらない。
もし使われるとすれば多くの場合は、古くからあるOSやデバイスドライバ、極端にリソースの少ない組込みシステムやレガシーシステムの開発においてであろう。
今やC言語による開発自体がセキュリティ上のリスクと認識され始めているのである。このような状況ではC言語も遠からずCOBOLと同じ衰退の道を歩むことになるだろう。
そんな衰退が約束されたC言語を未だプログラミング教育の場で使い続けているのも問題だが、それ以上に問題があるとすれば、日本にはIT業界のトレンドや実務に疎い大学教員が多すぎるということではないだろうか。
自分が出た北大情報系のような、時代遅れのカリキュラムがIT教育から一掃されることを願う。