あぶないプログラミング入門

おすすめの教科書

教科書をいくつか紹介しよう。ぼくが自分の大切な子どもに読ませるなら、この順で読ませる、という順番だ。

プログラミングの基礎 (Computer Science Library)
非常にわかりやすい教科書。タイトルがミソ!○○言語入門、じゃない。プログラミングを支える考え方はこれだ、ってことだよね。C言語入門なら、C言語の入門したことにしかならない。C言語はプログラミングの考え方を取り入れているが、その解説本は、あくまで言語の説明の本だ。プログラミング言語に共通な考え方というものがあるが、○○言語入門からは、プログラミング言語共通の考え方は、○○言語入門の解説からは透けて見えるだけで、はっきり見えない。この本は自信満々、挑戦的なタイトルだ。読めば、プログラミング共通の考え方が身につく。同時にOCamlも身につけることができる。

計算機プログラムの構造と解釈
これは超有名な本。略称、SICP。MITで使われてた教科書だよ。古典といってもよく、優れたプログラマはほとんど読んでいるだろうね。この本も特定言語の入門じゃない。プログラミングの普遍的な考え方、たとえば、抽象化、部品化などを学ぶ本だ。プログラマの必須の教養と言っても良い。

すごいHaskellたのしく学ぼう!
次はHaskellをもう少し深く学ぼう。特定の言語をひとつ学ぶのは非常に重要なことだ。この本ではモナドを学ぶことができる。直感的に説明し、他の解説よりすんなり入門することができる。

ここまできたら、君の中には、芯のようなものができる。いろんな本を読んでも、その芯のようなものを根拠に、いい悪いが判断できるようになる。あとは好きに進めばいい。

さらに興味がある人は、このへんをみてください。もっと参考文献

わたしのプログラミング言語遍歴と感想

大学で情報工学系の勉強をして、企業でソフトウェア工学関係の仕事をしている。
おもに使った言語は、C言語、Java、Standard ML、Prolog、Haskell、C++で、これは使った順だ。
C言語は、大学で初めて習った。ただ、題材の数値計算にあまり興味がなかったので、C言語の演習とかあまり面白くなかった。 一年たっても、voidの意味を知らなかったぐらいだぜ。
JavaはGUIのライブラリを標準で持っていたので、面白そうなので、使った。そこでvoidの意味を知った。よかったね。 同時にオブジェクト指向だったり、スレッドを知ったりした。卒論もJava関係で書いた。 オブジェクト指向とかゲームとか作れたり、ライブラリが充実していたから、一番使うようになっ。といってもC言語より使うという意味だが。何かを作りながらプログラムを書くのが一番早くプログラミング言語を習得する方法だ。作りたいものも自分で決めるのがよい。
大学でStandard MLも習ったが、存在意義がわからずやはり面白くなかった。 Javaを勉強したり、書いたりしているとC言語もわかってきた。 C言語でもライブラリはあるし、ゲームも作れるのではあるが、JavaはマルチOSで動くので(研究室で与えられたマシンのOSがTurbo Linuxだった)、やはりJavaを使っていた。
Prologは、会社に入ってから少し使ったが、合うところにはすごく合う。簡潔に書ける。
Haskellは数年前、なんとなく勉強したが、面白かった。遅延評価や関数渡しのテクニックに驚いた。 Haskellを勉強したら、同じ関数型言語のStandard MLのよさが理解できてきた。 オブジェクト指向に拡張したOcamlに興味を持っている。
C++は最近、会社で使っている。が、まあ仕方なく。

どの言語がいいか

好みもあるが、以下、家での話。仕事はプログラミングは丸投げしている。こんなはずじゃなかったのにな。
使った感じでは、Haskellがいちばんお気に入り。最近は関数型言語で書くのが一番美しいと思っている。
C言語は、メモリアクセスとしないといけない場合書けばよいかな。 どうしても性能出す場合とか。わたしはこれに当てはまらないから、あまり使おうとは思わない。
Javaは、オブジェクト指向はいいかもしれないが、関数型にはまっているので、つかわない。 関数型のほうが短く簡潔に書ける場合が僕の場合多いから。ある時期、オブジェクト指向にはまったが、関数型言語に移行したんだ。卒業ってやつか。
Prologは合うところでは使いたい。
C++は、あまり使わないかな。オブジェクト指向は要らない生活だ。ところで、オブジェクト指向が必要な場面って何だろう?それと、C++は複雑すぎて覚えられない。C++の言語仕様は肥大化してしまったんじゃないだろうか。Javaはもう少しシンプルだ。それにオブジェクト指向がどうしても必要なら、OCamlという言語がある。MLの一種だが、オブジェクト指向をサポートしている。
Haskellはわかる人が少ないかもしれないので、一人じゃないと使えない状況もあるでしょうが、許されるならHaskellである。 わたしの使った順が理由で、Haskellでたどり着いたかもしれないが(それと経歴)、プログラミング入門をHaskellでしてもいいと思う。
まあ、Haskellが最高とも限らない。 でも、Haskellみたいな世界があるってことを知っておくのは損じゃない。 だから、入門はHaskellというのは無理かもしれず、いつかは勉強してほしいということかもしれない。 PrologとかLISPも同じでいつかはその世界をのぞくといいよ。。

プログラミング入門にはいくつも道がある。

ぼくは最初C言語から勉強した。大学1年のときに、電気科の授業であったからね。学部時代には、論理回路やコンピュータの中身のことも勉強した。ぼくは、ここが重要なポイントではないかと思う。
効果的にプログラミングを習得するには、同時にコンピュータのことも学ぶ必要があると思う。今思えば、大学のカリキュラムはよくできていて、コンピュータサイエンスを学ぶなかで、プログラミング入門することは、非常に効果が高かったと思う。
C言語は、コンピュータのつくりと密接に関係した言語なので、コンピュータの仕組みを勉強しながら、相補的に勉強するのによい言語だ。だから、C言語から勉強するのは、ある意味王道だ。
でも、時代が変わったかもしれないな。WEBアプリやスマホアプリなんかがよく話題になる時代。そんな時代なら、アプリを作りながらが楽しいかもしれないね。そうすると、Ruby、Perl、Python、javascript、Objective-Cとかではじめるのもいいかも。やっぱり楽しみながらはじめるのは効果的だ。ぼくは数値計算ではじまったC言語の授業はつまらなかったからね。ある意味、王道だったのだが。
そして、関数型言語も流行の兆し。Haskell、OCaml、Lisp、Scheme。選択肢はたくさんある。関数型言語は、学校でならう数学と近いかもしれないから、ある意味とっつきやすい。関数型言語でプログラミングを始めた人を知らないから、どうなるか知らないが。ぼくがたどり着いた場所、そこから始めてもいいかもしれない。挫折したって、ほかの言語をやってみればいいのだからね。

職業プログラマのキャリアパス、将来

職業人としてのプログラマの将来は明るいだろうか? プログラマは、日本だと、将来、プロジェクトマネージャーとか、プログラマまとめとか、管理者になる。 しかし、みんながなれるわけではない。プログラマのままの人もいる。 管理者は給料がいいけど、プログラマは給料が低い傾向にある。 それに、プログラミングは誰でもできる、と思われているから、低く見られる。 プログラミングは誰でもできるが、いいプログラミングは誰にでもできるわけじゃない。
それにプログラマは重労働になる場合がある。残業とか多い場合がある。 給料低くて残業多いのはやだよね。プロマネとか管理者も残業が多い場合がある。 それは、ソフトウェア開発がまだ難しい仕事だということだろう。 プログラミングは失敗すると、ほんと大変なことになる。プログラミングはあぶないんだよ。
だから、そういうのが嫌な人は、職業プログラマになるのはおすすめではないかもしれない。
でも、打開する道がひとつある気がする。 それはやはり正攻法。
プログラマとして、ずっとたのしくなるには、 とびきり優秀なプログラマになる、とか方法が必要だと思っている。 ではどうやって?答えはそう簡単にでないし、わたしも持っていない。
ひとつはいいプログラムをするとひとに認めてもらうこと。 そのためにはプログラミング技術を磨くことだろう。 あるいは、ソフトウェア工学の勉強をする? どちらにせよ、とにかく技術なんじゃないかと思っている。

プログラマの勉強

プログラマの技術って簡単にいうけど、それは何だろう? バグなく、コーディングできること?C++をよく知ってること?
たしかにそうだ。しかし、まだ次がある。プログラマの技術って、例えば、アーキテクチャ(プログラム構造)を設計できること、とかじゃないだろうか?なんというか、プログラムの作り方の一歩先というか。
そういうのって、知識がないとできない。いくら、他人に言われて、ずっと関数を実装してても、わかるようにならないことじゃないだろうか?
プログラム構造って、なかなか設計するのは難しい気がする。具体例は、スレッド分割とかかな?そういうのって、並行プログラムの設計の仕方、検証の仕方をちゃんとわかっていないとできない。日常の業務をただやってれば、身につくものじゃない。誰かに教えてもらうとか、本を読むとかじゃないと、わかってこないことじゃないかな。
こういう技術って、ただ自分が出世するためとかじゃなく、世の中にいいプログラム、いいプログラマが増えるためには、どんどん習得していくべきものだと思っている。
だから、リンク集を作って、ヒントを集めているんだ↓

残業プログラマのためのスキルアップリンク集

2011.8.29 のち適宜加筆