ソフトウェア開発の名著を読む

古人の跡を求めず、古人の求めたるところを求めよ。
松尾芭蕉
私の場合、電車の中では読書、駅までの徒歩時間はipodが通勤時のお供になっています。本は通勤時間以外はほとんど読まないのですし、速読ができるわけでもないですが、積もり積もれば結構本は読んでる方かもしれません。

さて、ちょっと前に話題に、これを読んでおくと読書スピードが速くなる。自己啓発書編。ついでに知的生産編 (俺と100冊の成功本)という記事が話題になっていました。
こちらの著者の方は、ものすごい勢いで本を読まれていますが、そのコツというか理由のひとつが、
  • 大抵の本には引用等で重複するところがある
  • すでにその話を知っていれば、その部分は読み飛ばせる。
  • だから、多くの本で引用されるような書籍を押さえておくと、他の本も早く読める
という話。確かに一理ありますね。
ということで、ここでは、自己啓発書の定番書籍として「人を動かす」「7つの習慣」「思考は現実化する」他数冊が紹介されています。これらを読んでおけば、他の自己啓発書を読む時の基本知識になるということですが、何より良い書籍なので、とにかく読んでおいて損はないでしょう。私もいづれ読もうと思っていて結局読んでいなかった書籍なので、これを機会に読み始めました。

4774140171 さて、私の場合、上のような自己啓発書も読みますし、小説やノンフィクションも読みますが、仕事柄ソフトウェア開発関連の書籍を読むことが多いです。では、ソフトウェア開発関連の場合、どういった本が定番なのでしょうか。私自身ソフトウェア開発本はいろいろと読んでいるので、いくつもおすすめしたい本はありますが、今回は「ソフトウェア開発の名著を読む (技評SE選書)」という本を紹介します。古今東西のソフトウェア開発の名著から8冊を選んで紹介している書籍です。新書なのですぐ読めますし、手軽です。
この本は古典を読む際のカタログ・道しるべとしても有用ですが、この本自体、名著とされる書籍の内容からかいつまんだエッセンスが書かれていますので、基本的な考えを知る上で非常に有益でしょう。

さて、この本で紹介されているのは8冊で、それぞれ概要は以下の通り。

プログラミングの心理学―または、ハイテクノロジーの人間学 ジェラルド・M. ワインバーグ
ソフトウェア開発の人間的側面に初めて正面から取り組んだ、ワインバーグの古典的作品。

人月の神話―狼人間を撃つ銀の弾はない フレデリック・P. ブルックス
見積もりとスケジューリングの単位のしての「人月」の危険性を指摘した不朽の名著

ピープルウエア トム・デマルコ ティモシー・リスター
ソフトウェア開発における人間的側面を重視し、人間中心に考えることとの大切さを説く

デッドライン―ソフト開発を成功に導く101の法則 トム・デマルコ
人間中心のプロジェクト管理について、デマルコが小説形式で表現した異色の作品

ソフトウェア職人気質 ピート マクブリーン
ソフトウェア開発を「工学」ととらえることをやめて、「職人気質」という基本に回帰せよと提唱する

達人プログラマー―システム開発の職人から名匠への道 アンドリュー・ハント
「割れ窓理論」「DRY原則」など、実践的なプログラマーとなるためのアドバイスを網羅

Code Complete ― 完全なプログラミングを目指して スティーブ・マコネル
より優れたコードを書くためのガイドラインを提供する、プログラマー必読の書

プログラミング作法 ブライアン・カーニハン ロブ・パイク
プログラマーにとって基本的かつ不可欠なことが述べられているが、すべてマスターしている人は意外に少ない

どの本も、特定のプログラミング言語に特化した話や細かいテクニックについて書かれているようなものではなく、ソフトウェア開発あるいはプログラミングに共通した内容になっています。分野によらず、今からプログラマを目指そうという人はもちろん、経験を積んだ技術者にも非常に有用な内容です。「ピープルウエア」等は、現場のプログラマだけでなく、むしろマネージャレベルの人に読んでいただきたいものです。

ちなみに、実際、私が通読したことがあるのは、「ピープルウエア」だけで、他の本は、直接読んだことはありません。しかし、その内容はいろんな書籍で引用されていますので、この本で紹介されていたような内容は、直接読まずとも知っていました。そういう意味では、先にこれらの本を読んでいれば、他の本を読んだりするときの理解の助けになったのかなとは思います。

なお、当たり前ではありますが、別に「本を早く読むこと」自体に価値はありません。その内容を理解し、実践することが大切です。私自身もそうですが、「ふむふむ」というのは誰もが感じることですが、なかなか実行にまで移す人は少ないものです。まずは実践。多くの本を読むよりは、そのほうがよっぽど大切です。

ちなみに、プログラマの場合は、技術書だけでなくソースコードを読むことも大切なスキルアップの手段です。同じように、定番のソースコードなんかもあるとは思いますので、また紹介できたらよいなと思います。まずは、LinuxやBSDのカーネル、Apache/X Windowなんかの有名どころのオープンソースが定番なのかな。おすすめあったらコメントやTBででもぜひ教えて下さい。

【関連記事】
C++関連書籍

【関連書籍】
ソフトウェア開発の名著を読む 【第二版】 (技評SE選書) 柴田 芳樹
改訂新版 コンピュータの名著・古典100冊 石田晴久 青山幹雄 安達淳
SEの読書術―「本質を読む」力を磨く10の哲学 浅海智晴/荒井玲子/後藤大地/柴田芳樹 他
Code Reading―オープンソースから学ぶソフトウェア開発技法 まつもとゆきひろ 平林俊一
ソースコードリーディングから学ぶ Javaの設計と実装 WINGSプロジェクト 佐藤匡剛 山田祥寛

【関連リンク】
これを読んでおくと読書スピードが速くなる。自己啓発書編。ついでに知的生産編 [俺100]
人力検索はてな - あなたが読んでためになった、またはプログラマなら読んでおくべきだと思うソースコードはなんですか?

博士の愛した数式 - 数学の美しさ

「だいたい、役に立たないものの方が楽しいじゃないか。音楽だって、芸術だって、何の役にも立たない。最も役に立たないということが、数学が一番人間的で純粋な学問である証拠です。人間だけが役に立たないことを考えられるんですからね」
410401303X 今回は久々に本の感想を。
その本は、小川洋子さんの「博士の愛した数式」。全国書店員が選ぶ第一回本屋大賞受賞作ということでベストセラーになった本です。どこかでこの本のレビューを読んでから、読んでみたいなと思っていたのですが、今回文庫化されていたのを見つけたので買って読んでみました。
知らない人にのために、内容紹介を引用。
記憶が80分しか持続しない天才数学者は、通いの家政婦の「私」と阪神タイガースファンの10歳の息子に、世界が驚きと喜びに満ちていることをたった1つの数式で示した…。頻出する高度な数学的事実の引用が、情緒あふれる物語のトーンを静かに引き締め整える。
記憶障害の数学者のという設定に理系心(?)をくすぐられましたが、内容はAmazonのレビュー等にもあるように「あったかさ」や「優しさ」の溢れる本です。記憶が80分しか持たない「博士」の純粋さと、主人公の息子「ルート」に対する無条件の愛情、数式や数字の美しさ、そこに阪神タイガースへの熱狂がからみあって、とても素敵な雰囲気が出ています。この本を読んで、友愛数完全数オイラーの公式を調べた人も多いと思います。

私自身も数学に美しさを感じたことは何度もあります。まず思い出すのは大学生の時、級数展開で得られたグレゴリーの公式。
π
4
1
1
1
3
1
5
1
7
+ ...
有理数の和から無理数、しかもπが出てくることに、何とも言えない神秘性を感じたものです。思わずプログラムを書いてπを計算とかしてみたり(πは多角形近似とかでもやったなぁ。。)。もっとさかのぼれば、「素数」や「虚数」を初めて知った時も、不思議な魅力を感じました。

よく虚数やsin,cosといった三角関数は、普通に生活する分には役に立たないものの代名詞として使われることがあります(勿論、理工学では大変役に立つのですが)。この本に登場する友愛数や完全数も実生活に役に立つものではありません。しかし、役に立たないものに魅力を感じるのが人間というもの。音楽や美術のように、学校教育でも数学の持つ「美しさ」を伝えるようになれば、もっと数学好きや人も増えるだろうにと思います。「手段」としての数学ではなく、「芸術」としての数学。とりあえずは、この本を中高生にも読んでもらって、数学の美しさや楽しさを感じてもらえたらいいのになと思います。
# ドラゴン桜でも東大志願者が増えるんだし(^^;)。

せっかくなので、美しいなと思った数字を一つ紹介。「ご冗談でしょう、ファインマンさん」という本に登場する、ファインマンが見つけたという数字。
1/243=0.004115226337448559・・・
無限に続く少数の列に不思議な規則性を見出すことができます。

数学の美しさはプログラミングにおける美しさに通じます。同じ証明であっても、簡潔で美しいものを求めるように、プログラミングも動けばいいというものではなく、やはりソースコードに美しさを求めるものです。プログラミングや数学は手段でもありますが、時にはそれ自身目的(楽しみといった方がいいか)であることもあります。

ちなみに私は、吉田武氏の『オイラーの贈物―人類の至宝eiπ=-1を学ぶ』という本と2ヶ月程前に買ったものの、まだ最後まで読了(という表現が正しいのかどうかわかりませんが)していません(^^;)。年末年始の休みの間、ペンと紙を片手に読んでみようかなと思います。

【関連リンク】
美しい数の世界
数学の美しさ

【関連書籍】
博士の愛した数式(文庫本) 小川 洋子
世にも美しい数学入門 藤原 正彦 小川 洋子
放浪の天才数学者エルデシュ ポール・ホフマン
フェルマーの最終定理 - ピュタゴラスに始まり、ワイルズが証明するまで サイモン・シン
ビューティフル・マインド - 天才数学者の絶望と奇跡 シルヴィア・ナサー
オイラーの贈物 - 人類の至宝eiπ=-1を学ぶ 吉田 武
虚数の情緒 - 中学生からの全方位独学法 吉田 武
ある数学者の生涯と弁明 G.H.ハーディ C.P.スノー
プログラマの数学 結城浩
夜のピクニック 恩田陸 (第二回本屋大賞受賞作)
笑わない数学者―MATHEMATICAL GOODBYE 森博嗣 (天王寺博士が魅力的)

始まりはいつもゼロ? - 0オリジンと1オリジン

ポーランドの大数学者、ヴァツワフ・シェルピンスキーは・・・荷物を一つなくしてしまったのではないかと心配していた。「そんなことないわよ、あなた!」と妻は言った。「六つともここにあるじゃないの」。 「そんなはずないよ」とシェルピンスキーは言った。 「何度も数えたんだ。ゼロ、1、2、3、4、5」
415208524X今でこそ私たちの生活に入り込み、普通に使われている0(ゼロ)。しかし、中世まで0は当たり前の存在ではなく、むしろ忌むべきものとして排斥の対象ですらありました。アリストテレスを戦慄させ、近代科学の祖デカルトが否定し、天才アインシュタインが挑んだゼロ。。。最近読んだ「異端の数ゼロ―数学・物理学が恐れるもっとも危険な概念」という本は、ゼロが数学・物理学・宗教・哲学の歴史の中でどのように扱われてきたかについて書かれており、非常に面白かったです。この手のポピュラー・サイエンスものが好きな方にはお勧めです。古代ギリシャでは数学が幾何学と密接に関連していたために0がなかった話など、なるほどという話がたくさんありました。

さて、身の周りには0から始るものと1から始まるものが混在しています。西暦は1年から。西暦0年はありません。西暦1年の一年前は紀元前1年です。カレンダーで言えば月や日も1から。でも時間は0から。年齢は数え年は1から、満年齢は0から。ものを数える時は1からですが、カウントダウンは0で終わる。。。それぞれに歴史的経緯や意味が隠れています。。

プログラミングにおいても同様の問題が顔を出します。0オリジン/1オリジン(0 origin/1 origin)や0基準/1基準(0 base/1 base)と呼ばれているものです。最も分かりやすい例は配列の添え字でしょう。C言語系の言語(C++やJava)では配列の最初の要素はa[0]と書きます。FORTRANやCOBOL、BASICではa[1]と書きます。何番目の要素という意味合いを考えれば、添字は1オリジンが自然な気もします。しかし、C言語系の言語では、配列はポインタと強く結びついているために、a[0]は「aの0番目」というよりは「先頭からオフセット0の要素」「*(a + 0)」いう意味合いになっています(※1)。

最近は、C言語系の言語が主流なので、大抵のプログラマは0オリジンの頭になっているでしょう。私も1オリジンのプログラムを見て、「何だこれは」と感じたことはあります。この0オリジン/1オリジンの問題は、混在させると非常にややこしくなるので、少なくともプロジェクト単位くらいでは統一するようにした方が心の平穏を保つためには重要です。

私は大勢と同様、0オリジンが好きですが、最近は1オリジンも見直しています。見逃されがちですが1オリジンのメリットは0を使わない点にあります。よく変数を見初期化のまま仕様して0が入ったりすることがありますが、このように偶然入る0を0オリジンの場合はそのまま使用してしまいますが、1オリジンでは不正規な値として弾くことができます。偶然の動作を防ぐというのはデバッグ効率を考えると非常に重要な点です(参考:バグを潜伏させない工夫)。この点を考えると、1オリジンも捨てたものではないなと思う今日この頃です。

ちなみに、プログラミングにおける0は、0除算(zero devide)やヌルポインタ(null pointer)等、特殊な意味合いを持っています。

※1 C言語ではa[-1]も*(a-1)という意味になり、文法的に間違いではありません。

【関連記事】
バグを潜伏させない工夫
デバッグ指向のススメ

【関連書籍】
異端の数ゼロ―数学・物理学が恐れるもっとも危険な概念 Charles Seife
数の本 J.H. コンウェイ R.K. ガイ
零の発見―数学の生い立ち 吉田洋一
プログラミング言語C ANSI規格準拠

フェルミのパラドックス

この世にはわれわれだけだと思うこともあるし、そうではないと思うこともある。いずれにせよ、そういうことを考えるところがすごいことだ。

宇宙の歴史は長く、そうして宇宙は限りなく広い。とすれば、地球外にも知的生命体(ETC)は存在するはずだ。でも、その気配はない。「みんなどこにいるのか?」二十世紀最高の天才物理学者エリンコ・フェルミは問いました。

479176126X 最近読んだ「広い宇宙に地球人しか見当たらない50の理由―フェルミのパラドックス」は、この「フェルミのパラドックス」について書かれた本です。本書のあとがきにもありますが、宇宙人がいる、いないという話になると、「いないはずがない」「いるはずがない」という二者択一論になりがちです。勿論、いるかいないかのどちらかしかないのですが、そういってしまうと議論が終わってしまいます。本書は「はずがない」ではなく「なぜそうなるのか」をいろんな観点、宇宙論から物理学・生物学・数学から社会学・SF的発想までを総動員して、その理由について科学的に検証しており、知的好奇心を刺激する一冊でした。

私自身は「地球や人類が特別と考えるのはおかしい。宇宙は限りなく広いんだから、他にも知的生命体はいるはずだ。(地球に来ているとかいうのは別にして)」という考えでした。いわゆる平凡原理というやつです。しかし、実際宇宙は「限りなく」広いわけではなく有限です。時間的にも空間的にも(勿論、現在の宇宙論が正しいとしてですが)。よって、ETCの発生確率が、宇宙の大きさを相殺して余りあるほど低ければ、ETCが地球外に存在しないと考えるのが自然です。雨の中を走って、一滴の雨粒にもあたらない可能性も0ではないでしょうが、事実上0です。では、ETCの発生確率はどれくらいなのでしょうか。

宇宙の大きさといった規模になると、ついついその大きさに圧倒されて、考えることを放棄してしまいがちです。しかし、既存の理論や知識でも、それらを丁寧に積み重ねていけば、ある程度妥当な推論を導けることがあります。宇宙の神秘に思いを巡らす時もそうですが、仕事における工数見積もり等でも、似たようなことは言えるかもしれません(^^;)。

その他、この本の中では、フェルミ推定やデルタt論法などの考え方、なるほどといった論理の展開方法等も紹介されており面白いです。

【関連レビュー】
情報考学 Passion For The Future
Amazon

【関連書籍】
宇宙に隣人はいるのか ポール・デイヴィス
もしも月がなかったら―ありえたかもしれない地球への10の旅 ニール.F.カミンズ
奇妙な論理〈1〉―だまされやすさの研究 マーティン・ガードナー
人はなぜエセ科学に騙されるのか カール・セーガン

C++関連書籍

C言語を使うと自分の足を誤って撃ち抜いてしまうことがある。 C++を使えばそのような間違いを犯しにくくなる。しかし、やってしまったときには足全体が無くなる。
Bjarne Stroustrup

C組み込み系ではまだまだC言語が主流ですが、オブジェクト指向とともにC++も徐々に広まってきています。最近も知り合いから「プロジェクトでC++を使うことになったんだけど、おすすめの本ってない?」と聞かれることがありました。Webだけでも十分情報は集まりますが、活字の形の方が便利なこともあります。
そこで、今回は個人的におすすめのC++本を紹介したいと思います。

Effective C++ 原著第3版 スコット・メイヤーズ
4894714515 C++のバイブルとして評判の高い一冊です。その評価は、私も過言ではないと思っていますので、C言語の経験のある人にC++本を紹介する時は、必ずこの本を薦めています。
CからC++への移行する時のポイント、new演算子のオーバーロード、コンストラクタの挙動、オブジェクト指向設計等、C++プログラマなら知っておくべき内容で、かつ他の書籍では意外と触れられていないことが多い内容が、非常にわかり分かりやすく書かれています。
アスキーのHPでページサンプルのPDF(序章、第一章 CからC++への移行、第二章 メモリ管理)がダウンロードできます(※1)。

More Effective C++ ― 最新35のプログラミング技法Scott Meyers (アスキー)
4894714760 Effective C++の続編です。前回と比較してよりつっこんだ内容になっており、どちらかと言えば中級者以上向けとなっています。placement new、仮想コントラクター、スマートポインター、参照回数計測、プロキシークラス、二重ディスパッチなどの応用テクニック、例外機構の留意点等が詳しく解説されています。取り上げられている応用テクニックをそのまま使用することはないとしても、そのコーディングのテクニックや設計思想は、非常に参考になります(※2)。

プログラミング言語C++ 第3版Bjarne Stroustrup
プログラミング言語 C++これもまたC++言語のバイブルとされる一冊です。C++言語の開発者であるBjarne Stroustrupによって書かれたもので、C言語で言えば、K&Rのプログラミング言語Cのようなものと言ってもいいのではないでしょうか。ANSI/ISO C++の最終標準仕様について、templateに例外、STLコンテナからalgorithmまでC++仕様が網羅的に解説されています。
但し、内容が濃い分、非常に分厚い本なので、電車の中で気軽に読むなんてことはできません。内容もある程度の知識を前提として書かれているため初心者向けでもありません。しかし、文章は分かりやすく、内容も充実していますので、C++をある程度理解したら、是非とも本書を読破してほしいところです。 リファレンスとしても机の上に是非置いておきたい一冊です。

独習C++ ハーバート・シルト (翔泳社)
独習C++ 独習C独習Perlと同じ独習シリーズのC++版。著者も独習Cと同じです。私は独習シリーズを通読したことはありませんが、周りの評判が良さそうなのでとりあげておきます。このシリーズの特徴は、分かりやすさです。ですので、初心者の方は、まずこの本で概要を理解して、ある程度使えるようになったのちに、上の書籍でステップアップというのがいいかもしれませんね。

C++プログラミングの処方箋―ひと味違うコードを書くための99の鉄則 Stepehn C. Dewhurst
4798106321 プログラミングを学ぶ最もよい方法は、優れたコードを読むことです。しかし、逆に悪いコード、あるいは失敗例から学べることもまた多いものです。本書は、いわば陥りがちなアンチパターンの紹介と、そこから導かれる原則、テクニック等を紹介しています。自分で失敗すると身にしみて学習することはできますが、それには長い年月がかかります。まずは、人のふりみてわがふり直せということで、ここから学べることは非常にたくさんあります。ここで紹介している他の書籍程、紹介例を見かけない気がしていますが、もっと評価されてもよい良書だと思っています。
C++中心ではありますが、Cプログラマをはじめその他の言語を使うプログラマにとっても参考になるところは多いと思います。

Boost C++Librariesプログラミング 第2版 稲葉一浩
Boost C++ Librariesプログラミング 「C++標準」であるSTLは洗練されてはいますが、いまひとつかゆいところに手が届かない。物足りない。ということでC++言語標準化委員会メンバーが、さらに強力なライブラリを求めて作られたtemplateライブラリが「Boost」。本書はその「Boost」の日本語リファレンスといった内容です。気が付けば第二版がでていました。
まずSTLから、という方に関しては、「Effective STL―STLを効果的に使いこなす50の鉄則 (Scott Meyers)」あたりが定番でしょうか。

Modern C++ Design―ジェネリック・プログラミングおよびデザイン・パターンを利用するための究極のテンプレート活用術 Andrei Alexandrescu
4894714353 この本は入門書ではありませんのでご注意を。C++のtemplateを使いこなしたいという中・上級者向けの内容です。タイトルにも「究極のテンプレート活用術」とありますが、templateの特性を最大限に引き出すテクニックが満載です。しかし、あまりにトリッキーなため、実装を一読しただけでその意味するところを理解するのは常人では不可能です(できあがったパターンを利用するのは可能でしょうが)。よって、実際のプロジェクトで使う時には注意が必要かもしれません (^^;)。
本書については、templateを使った実装上のテクニカルな内容も圧巻ですが、ポリシーを基にしたクラス・デザインといった設計上の考え方等も一読の価値があります。C++、特にtemplateを極めたい人にとっては必読でしょう。

C++の設計と進化 Bjarne Stroustrup
C++の設計と進化私自身この本はまだ読んでいませんが、是非読んでみたいと思っていますので挙げておきます。C++の設計者であるStroustrup氏がC++言語自身の設計思想と開発経緯に関して語った本です。C++は非常に複雑な言語仕様から敬遠されることも多いですが、私はその強力な記述能力は好きです。多重継承も使い方によっては非常に便利な仕様です。ようは道具の使い方の問題です。
言語設計の背景と経緯を知ることは、言語を使う側にとっても有益でしょう。


※1 最初に紹介したときは第二版でしたが、第三版がでたので更新しました。
※2 2007/7に新訂版もでています。

ゲーデル・不完全性定理

最近読んだ本を紹介します。

ゲーデル・不完全性定理―理性の限界の発見 ゲーデル・不完全性定理―"理性の限界"の発見
吉永 良正

大学生の頃に買った本ですが、家を片付けている時にたまたま目について読み返してみました。
不完全性定理については、名前は聞いたことはあるけども、具体的な内容については知らない方も多いと思います。本書は、「はじめに」に、『この定理の証明のアイデア自体は、いたってシンプルで明快なものであり、きちんと説明すれば中学生でも理解できるものなのです。本書では実際に、そのような説明を試みてみました。』とあるように、馴染みやすいパラドックスの例を紹介しながら、不完全性定理にいたる説明がされています。しかし、実際はそんなに平易な内容とは言えません。さらに、アマゾンのレビューを見ると、ところどころ間違った表現も散見されるそうですので、今から不完全性定理に触れてみたいといかたは別の本(例えば、ゲーデルの哲学―不完全性定理と神の存在論 (著者:高橋 昌一郎))の方が良いかもしれません。

本書では、嘘つきのパラドックス(クレタ人のパラドックス、エピメニデスのパラドックス)からラッセルのパラドックス、リシャールのパラドックス等多くのパラドックスが紹介されており、この点だけも結構楽しめます。そういえば、チューリングマシンの停止問題もひとつのパラドックスですよね。
パラドックスというのは人を惹きつけるものがありますね。

【関連リンク】
エピメニデスのパラドックスの真の解法
チューリングマシンの停止問題 (Wikipedia)

本のおすすめ

4274065979

4844337858

482228493X

4904807057

4873114799


プロフィール

  • Author:proger
  • 組み込み関係で仕事してます

ブログ内検索