Scribble at 2023-12-12 22:48:30 Last modified: 2023-12-13 22:30:29

ひとまず大きな仕事は片付いた。そして、ようやく C shell の参考書で最後に残しておいた SAMS の本を安く注文できたので、C 言語のおさらいをしたい。

会社にはプログラミングやシステム開発に本当に関心がある人はいないので、あまり聞かれる機会はないのだが、15年以上も前に HAL のインターンを暫く面倒見ていた頃は、「どういう本で勉強すればいいのか」という質問は何度か受けた。でも、そんなに驚くような秘訣みたいなものがあるわけではない。

簡単に言うと、できるだけ新しくて良い本を使うということに限る。まず、新しい本であるという条件にはいくつかあるけれど、現状で開発に携わっているプロが参照している言語仕様や規格にもとづいて書かれた本でなくてはいけない。C 言語で言えば、どれほど古典的な著作であろうと、現在の初心者が K&R に手を出すようなアドバイスは不見識だと思う。なぜなら、古い本に書いてある C のコードは、たいてい動かないからだ。main() { printf( "Hello\n" ); } などと書いてる教科書を読んで、gcc に通してみたところで、色々なエラーが出て動かない(最低でも整数型を指定しないといけない)。冒頭からそんなトラブルに巻き込まれると、初心者は一気に学ぶ意欲を失ってしまう。書いてあるのに、なんで動かないんだというわけである。すると、その本が間違っているか、あるいは何か動かすために特殊なことをしなくてはいけない(でも、本には書いてない)という推測が成り立つが、どちらにしても初心者はウェブで検索してまわる他にないだろう。

古い仕様や規格にもとづく本は、古いがゆえに致命的な弱点なり不足がある。それは、もちろん著者等の責任ではない。2020年に C 言語の仕様がどうなっているかを予測して1980年に教科書を書けた人間なんて、この宇宙には存在しないからだ。

もちろん、古い本にも良いところがいくつもあって、いま開発に携わっている人々も教えられるところが何かあるだろう。でも、それが理解できるのは C 言語を習得して何年も開発に携わっている人間だけであり、初心者に最初から、古くて現在の仕様に適していないという欠点だけを差し引いて C 言語やプログラミングとして学ぶべき点が抽出できるくらいなら、その人は既に C 言語のエキスパートであろう。よって、初心者が古い本をいきなり読んでエキスパート並の読み方ができるなどという想定は、はっきり言って論理的に矛盾しているとしか思えない。もちろん、結果としてそういう読み方や理解ができていたという幸運はありえるが、教育や指導というものはそんな幸運(そして大半は悲惨あるいは少なくとも無意味な結果に終わる)に身を委ねて他人を送り出すようなものではあるまい。実際、そんなアドバイスならしてもしなくても社会科学的な効果は同じ、つまりゼロであろう。人のアドバイスなど無視してデタラメに本を選ぶのと同じことだからだ。

さて次に、良い本を選ぶという話には、やはり人によって異なる基準があるため、一概にどれを読むべきだと無条件に言えるわけでもない。僕はダイテル親子の教科書で学んだため、単なる自分の経験からダイテルの本を勧めたい気分はあるが(それでも薦めるのは2021年に出た最新版であって、僕が読んだ前世紀の版ではない)、フォーラムなどを見ていると、ダイテル親子の教科書は「おすすめ」などとリストにされるようなブログ記事では滅多に見かけない。やはりオライリーや Apress や Manning など、技術書として有名な出版社から出ている本が圧倒的に人気を得ている。もちろん、そういうものを選んでも構わない。ただ、どれほど人気があると言われていても、僕は Amazon や LuLu などだけで販売されている自費出版や電子書籍だけの出版物には、手を出さないほうが無難だと言いたい。

理由は、まずなによりも、その本の原稿だろうとノートだろうと授業などで使われた実績がなければ、どれくらいの色々な初心者に対応できたのかがわからないからだ。たとえば LuLu などは大半の初心者は知らないマイナーな電子書籍の出版サービスであるため、ここから出ていることを知っている時点で、読者の予備知識に何らかの共通の傾向があるかもしれない(プログラミングの経験があるといった共通の傾向があれば、そこで人気があるとしても全くの初心者には適していない可能性が高い)。また、Amazon の KDP はご承知のようにスパムの温床になっていて、C 言語の教科書という体裁で販売されている、ただのメモ帳が山ほどある。そういう詐欺でなくても、かなりの割合の自費出版は子供が ChatGPT などを使って作文しただけのクズみたいなもので、ChatGPT が登場する前はアマチュアがデタラメな本を並べていた。

僕は、何度も言うようだが権威主義者である。大学教員とまではいかなくとも、ちゃんとした経歴のある人物が、それなりにまともな出版社から出している本を選ぶ方が無難であることは確かだし、そうでないマイナーなところから出ている本がいい本なのかどうかを初心者が判断できるわけがない。よって、判断する基準を説明できるほど C 言語に習熟しているわけでもないなら、さっさとメジャーな本を手にとって、読みにくかろうとざっと通読する方がよい。頭にすべて入らなくても、一読して言語の見通しなり概略を掴むことが重要だ。そういう意味では、少なくとも初等的な段階の勉強については「加速主義」が適しているのだろう。だからこそ初等教育を多くの国で貧しい人々にも普及させるのが効果的なのかもしれない。

それはそうと、こんな話題で議論していながら、全くお勧めの教科書を紹介しないというのも変な話なので、ひとまず僕が目を通した範囲でお勧めできるテキストをご紹介しておこう。

C How To Program (Deitel and Deitel, 9th edn., Pearson, 2021, https://deitel.com/c-how-to-program-9-e/)

既に述べたように、僕がお勧めしたいテキストの筆頭だ。ITパスポートくらいの初歩的なコンピュータの話から始まって、プログラミングの初心者でも読めるようになっていて、実際に書いて動くプログラムを掲載するだけではなく、仕事として書くときの注意事項などまで詳細に解説されているので、学習用としてだけでなく業務に携わるようになった後でも読み返す価値があると思う。なお、サポートしている C のバージョンは C18(実は C17 だが、人によって C18 と書くことがある)。

Beginning C (Gonzalez-Morris and Horton, 6th edn., 2020, Apress, https://link.springer.com/book/10.1007/978-1-4842-5976-4)

来年にも改訂版が予告されているけれど、現行版でも構わない。現実のエンジニアが準拠している C17 にもとづいて書かれているからだ。アイヴァー・ホートンは C や Java の概説書では長い実績のある著者であり、最近になって共著者と組んで内容を充実させるようになった。昔から手堅いテキストとして人気がある。

ということで、この2冊をお勧めしておく。残念ながら、僕は日本語の C 言語の教科書で初心者にお勧めできるものは読んだことがないので、ご紹介できない(経験者に勧められる日本語の本は、H&S の翻訳といった本が何冊かある。C Primer の古い翻訳もそうだ)。でも、いまどきの高校生は英検2級ていどに合格するくらいの勉強をしているのだから、こういう本は小説などと違って複雑な文法や難しい単語や慣用句は使わないので(ちゃんと編集者が削ぎ落としている)、さほど苦も無く読めるだろう。というか、繰り返しておくが、システム開発ベンダーや IT ベンチャーなどでエンジニアとして働くつもりなら、会話できる必要はなくとも、英語での読み書きは必須だ(読むだけではなく、書く力は検索するときに必要だ。LLMs に質問して調べたりコードの例を示してもらうなら、やはり的確に英語で文章を書けなくてはいけない)。もちろん、趣味的に K&R の翻訳だとか、1980年代から1990年代に書かれた古典的な日本語の教科書や解説書は何冊か持っているが、それは飽くまでもエンジニアとしての関心で読んでいるものであって、初心者には勧めない。

洋書では他にも多くのテキストがある。手持ちの本に加えて、僕が Google Books や出版社で公開されているサンプルなどに目を通した限りで論評しておく。

C Primer Plus (6th, Pearson, 2014): 非常に読みやすくて好きなテキストなのだが、準拠しているのが C11 であり、やや古い。

Computer Programming in C for Beginners (Springer, 2020): お勧めしない。コードを動かす環境として Windows だけで動く特殊なアプリケーションを使っていて、いわゆる「コーダ」になるならともかく、「プログラマ」になろうというなら、こんな特殊な処理系の環境で学ぶのは感心しない。処理系によるデバッグなどもプロのエンジニアにとって重要な知識や技能だからだ。

Head First C (O'Reilly, 2012): これもお勧めしない。イラストや写真をふだんに使った「わかりやすい」本のシリーズとして売れてはいるようだが、これでプロのエンジニアになる人はいないと思う。また、表面的な分かりやすさはともかく、実はかなり初心者にとっては不親切な本だと思う。たとえば、コードを動かしたりコンパイルする環境の準備は、たいていの C 言語の初心者向けの本なら何ページにもわたって説明されているが、この本では数行しか書かれていない。

それから、現実の問題として洋書のテキストがどれほど優れているとは言っても、円安に加えてアメリカでの急激なインフレという影響で、洋書はこの数年で2倍近くの値段に跳ね上がっている。わずか300ページたらずの初心者向けの通俗本ですら1万円に迫るような価格で、こんな値段では気軽に本など買ってはいられない。もちろん、クズを掴まないように慎重に選ぶ必要はあるが、日本で出版されている本なら図書館で事前に目を通したり、あるいは借りて勉強すれば無料だけれど、洋書は事前に目を通したり借りるというわけにはいかない。もちろん、海賊版の電子書籍をアーカイブしているサイトはいくつかあるが、そういうもので済ませるという発想は良くない。僕は教科書というものは手元に置いて好きなときに開いたり書き込んだりするような、つまりは道具として使うものだと思うので、電気がなければアクセスできない電子書籍は、そのときに読めようと読めなくとも大半の人の生活にとってはどうだっていい漫画や小説だけにしておく方がいい(もちろん漫画の評論家にとっては重要なことだから、漫画や小説が「読めても読めなくてもどうだっていいもの」だと言っているわけではない。僕は、そういうのは「悪いアカデミズム」や「悪い権威主義」だと思う)。ということで、洋書を他人に薦めるときは、もちろん僕はそれなりに日本語の本を薦めるときよりも評価を厳しくしている。だから、せいぜい上記の二冊くらいしか勧められないのだ。

  1. もっと新しいノート <<
  2. >> もっと古いノート

冒頭に戻る


※ 以下の SNS 共有ボタンは JavaScript を使っておらず、ボタンを押すまでは SNS サイトと全く通信しません。

Twitter Facebook