久保清隆のブログ

ライフハック、健康、旅行など、役立つ情報を書きます。

「ハッカーと画家」を読んで学んだ、良いソフトウェアの創り方

ハッカーと画家 コンピュータ時代の創造者たち

ハッカーと画家 コンピュータ時代の創造者たち

本書は、基本的には良いソフトウェアを創るためにはどうしたら良いかについて書かれている。
画家、建築家、数学者、研究者などとハッカーを比べることにより、その共通点から、ハッカーになるためにどのように勉強すればいいのか、どのようなマインドでソフトウェア開発に取り組めばいいのか、が分かりやすく書かれている。
「良いソフトウェアを創るにはどうすれば良いのか」と「ハッカーの素晴らしさ」の2点を中心にまとめた。

目次

第一章 彼ら(オタク)はゲーム(人気取り競争)に乗っていない。
第二章 ハッカーは、画家や建築家や作家と同じ、ものを創る人々だ。
第三章 異端的な考えに思いを巡らせ、それをどう使うか。
第四章 ハッカーはルールを破ることで勝つ。
第五章 Webベースソフトウェアは、マイクロコンピュータの登場以来最大のチャンスだ。
第六章 裕福になる最良の方法は富を生み出すことだ。そしてベンチャー企業はその最良の方法だ。
第七章 収入の不均一な分布は、広く考えられているほど問題ではないのではないか。
第八章 最近まで、専門家の多くはスパムフィルタは成功しないと考えていた。この提案がそれを変えた。
第九章 素晴らしいものを創るにはどうすればよいか。
第十章 プログラミング言語とは何か、それははぜ盛んに話題になるのか。
第十一章 百年後にはどういうふうにプログラミングをしているだろう。今からでもそれを始められないだろうか。
第十二章 Webベースアプリケーションでは、自分の使いたい言語を使うことができる。ライバルも同様だ。
第十三章 技術の分野では、「業界のベストプラクティス」は敗北へのレシピだ。
第十四章 良いプログラミング言語とは、ハッカーがやりたいことをやれる言語だ。
第十五章 研究は独自性が必要だ。デザインは良くなければならない。
第十六章 ほかより飛び抜けて優れたプログラマがいる。そんな素晴らしいハッカーたちはどういう人物なんだろう。

要点

念のためハッカーの定義を書いておく。コンピュータ犯罪行為を行う人のことではない。

ハッカー (hacker) とはコンピュータや電気回路一般について常人より深い技術的知識を持ち、その知識を利用して技術的な課題に対して最小限の手間で最大の効果を生み出す人々のこと。
(wikipediaより抜粋)
第二章 ハッカーは、画家や建築家や作家と同じ、ものを創る人々だ。
  • ハッカーと画家の共通点
    • どちらもものを創る人間である
    • ハッカーと画家がやろうとしていることは、よいものを創るということ
    • よいものを創ろうとする過程で新しいテクニックを発見することがある
    • ハッカーが実際にやろうとしていることは、美しいソフトウェアをデザインするということ
  • 絵画の例から学べることは、ハッキングをどうやって学んだらよいかということ
    • 作家や画家や建築家が創りながら作品を理解してゆくのと同じで、プログラマはプログラムを書きながら理解してゆく
    • 先例から学ぶ。良いプログラムを見ることでプログラミングを学ぶことができる
  • 絵画はたいていスケッチから始まる。そして次第に細かい部分が埋められてゆく。ハッキングもそうであるべき。次第に詳細化しながら創ってゆく。プログラムを書いている最中に仕様が変わっていっても、それを受け入れられるような書き方をすべき
  • レオナルド・ダ・ヴィンチにとって、絵のある部分にどれだけ手間をかけるかは、誰かがそこを見るかどうかには関係なかった。見えない細部も、組み合わさることにより見えるようになる。妥協しないことはこの点で重要。偉大なソフトウェアも同じように、美に対する熱狂的な没頭を必要とする。良いソフトウェアの中身を見てみれば、誰も見ないような箇所でさえ美しく創られているのがわかるだろう。妥協してはいけない
  • 協調開発の正しい方法は、プロジェクトをはっきりと定義されたモジュールに分割し、各モジュールの所有者を決め、そして注意深く、明快に設計されたインタフェースをモジュールに定めることだ。
  • 絵画と同様、ソフトウェアも多くは人間が見て使うものだ。だからハッカーも、本当に偉大な仕事を成し遂げるには、共感する力が必要だ。ユーザの視点からモノを見られるようにならなくちゃいけない。
  • 共感能力は、おそらく良いハッカーと偉大なハッカーの、たったひとつの最も重要な違いだろう。非常に賢いが、共感するということにかけては全く自己中心主義の人々がいる。そういう人が偉大なソフトウェアをデザインするのは難しいだろう。ユーザの視点でものを観ることができないからだ。
  • 良いソフトウェアを書くには、ユーザがどれだけ何も知らないかということを理解する必要がある。
  • ユーザはなんの準備もなくやってきて、いきなりソフトウェアに向かい、マニュアルなんか読もうともしないだろう。ソフトウェアはそういう人が期待するように振舞うべきだ。
  • ユーザに対する共感だけでなく、コードを読む人に対する共感も必要だ。それはあなた自身のためでもある。あなた自身もあなたのコードの読者だからだ。
第四章 ハッカーはルールを破ることで勝つ。
  • ハックとは、醜い解答をさしたり、独創的な解答をさしたりする。共通しているのはどちらもルールを破っているということ。
第五章 Webベースソフトウェアは、マイクロコンピュータの登場以来最大のチャンスだ。
  • ユーザを観察する必要がある。ユーザが何を期待しているかなんて、実際にユーザを観察してみるまでは見当もつかない。
  • ビジネスに関しては2つのことだけを知っておけばいい。
    • ユーザが気に入るものを創るということ
      • 自分でも使いたいと思うような明快で簡単なものからつくりはじめること。
      • 最良のソフトウェアは、簡単であるものだが、それはデフォルト設定がそうなっているためで、ユーザが望めばその選択に限界があってはならない。
    • 使った金より多くの収入を得るということ
      • 最初のうちは収入より支出が多くなるだろうけれど、その差額が十分に速く縮まっていけば大丈夫。
第六章 裕福になる最良の方法は富を生み出すことだ。そしてベンチャー企業はその最良の方法だ。
  • メディアで報道されるような成功者は、明晰な頭脳と強固な意志、それに宝くじに当たるような幸運を併せ持った人である。
  • プログラマはコンピュータの前に座って富を創りだすことができる。例えばどこかのプログラマが軽快なWebブラウザを書いたとしたら、世界はその分だけ裕福になる。凄腕のプログラマは半月で百万ドル相当の仕事をすることだってできるだろう。
  • 裕福になるためには、測定と梃子が必要。測定とは、自分の生産性が測れるということ、梃子とは、自分の決定が大きな効果を持つこと。ベンチャー企業は、測定と梃子のある環境を提供してくれる。
  • 歴史を見れば、富を創ることで裕福になった人々の多くは、新しい技術を創ることでそうしたとわかる。
  • 多くの人々が関心を持つ技術上の問題を解けば、その解法を使う全ての人を助けられる。これが梃子だ。
  • ベンチャー企業が大企業と戦うとき、攻撃こそが最大の防御になる。小さな集団は困難な問題を解くことに適している。競争相手が真似するのが難しすぎるような技術を作りさえすれば、他の防御に頼る必要はない。難しい問題を選ぶことから始め、決断が必要な場面では常に難しい方を選べばよい
  • 単に問題を解くだけじゃいけない。ユーザが解いて欲しいと思っている問題を解くべきだ
  • バージョン1.0を可能な限り速く出そう。ユーザを獲得しない限り、手探りでの最適化からは逃れられない。
  • 顧客が欲しがるものに近づけば近づくほど、生み出せる富は大きくなる
第七章 収入の不均一な分布は、広く考えられているほど問題ではないのではないか。
  • 世の中には富が決まった量しかないわけではない。産業革命が、裕福になる最良の方法を、汚職から富の創出へと決定的に置き換えた。ジョブズとウォズニアックは、自分が裕福になるために残りの人々を貧しくする必要がなかった。むしろ逆で、彼らは、私たちの生活を豊かにするものを創りだした
  • 物質的にも社会的にも、技術は富める者と貧しい者の格差を縮めている。
  • もし富を創り出している人々がその富に対する対価を得られなかったら、OSをインストールし、サポートの電話を受け、顧客がそれを使えるようにする、といったやっても楽しくない種類の富の創造は劇的に減少するだろう。
第九章 素晴らしいものを創るにはどうすればよいか。
  • 良いデザインは単純である
    • 数学であれば短い証明ほど良いものである傾向があり、建築家にとっては、美とは厳選された少数の要素から組み立てられる物だ。
    • 文章においては、言いたいことを簡潔に言うこと。単純でなければならないと強制されれば、本物の問題と向き合わなければならなくなる。
  • 良いデザインは永遠である
    • 数学では間違いがない限りすべての証明は永遠だ。もし未来の世代にも気に入られるものを作りたいなら、過去の世代にも気に入られるものを創ろうとするのもひとつの方法だ。現在の人々に好まれ、過去の人にも好まれたであろうものなら、未来の人にも好まれる可能性は高い。
  • 良いデザインは正しい問題を解決する
    • 悪いデザインの多くは、念入りであるが勘違いした仕事の結果だ。解と同じように、問題も改善してゆける
    • ソフトウェアでは、追跡不可能な問題を等値でしかも解決可能な問題へと置き換えることが出来る場合がある。
  • 良いデザインは想像力を喚起する
    • 建物や品物は人々が使いたいように使えるべきである。
    • ソフトウェアにおいては、ユーザが自分の思うとおりに使えるべきである
  • 良いデザインは簡単に見える
    • 偉大なデザイナーはデザインをいとも簡単に見せる。一見簡単そうなことは練習によってもたらされる。練習の効用とは、意識しなければできなかった事柄を無意識のうちにできるようにすることだ
  • 良いデザインは対称性を使う
    • 対称性には二種類ある。繰り返しと再帰だ。再帰とは、葉脈の模様のような、部分構造への繰り返しと言ってもよい。
  • 良いデザインは再デザインだ
    • 最初からうまくできるということは滅多にない。ここまでできたのなら、もっとできるはずだ、と考えることができなくちゃいけない。
  • 良いデザインは模倣する
    • 最初は知らず知らずのうちに模倣する。志ある人は単なる模倣では満足しない。センスの成長の次の段階では意識的に独自性を出そうとする。最後に独自性よりも正しくあることが重要だと気づく。正しい答えの一部がすでに誰かによって発見されていたら、それを利用する。誰かの答えを借りても自分のビジョンは曇らないという十分な自信を持っている。
  • 良いデザインはしばしば大胆だ
    • 美しいものを作った人々の多くは、彼らが醜いと思ったところを直していったのだと思える。
    • 偉大な仕事をするためには、醜いものを許せないだけでは十分ではなく、どこを直せばよいのか知る嗅覚が必要。それを得るにはその分野を十分理解していなければならない。ちゃんと勉強しなければならない。そして、もっと良い方法があるはずだ、という声を無視せず、それを追求する。厳しい味覚と、それを満足させる能力。それが偉大な仕事のためのレシピだ
第十一章 百年後にはどういうふうにプログラミングをしているだろう。今からでもそれを始められないだろうか。
  • 100年後のプログラミング言語がどうなっているかを考えたい理由は、それによって現在の(プログラミングの系統樹の)どの枝に賭けるべきかを知りたいからだ。
第十二章 Webベースアプリケーションでは、自分の使いたい言語を使うことができる。ライバルも同様だ。
  • エリック・レイモンドはエッセイ「ハッカーになろう」の中で、ハッカーになりたい人はどんな言語を勉強すべきかを述べている。まずPythonとJavaから始めよ、学ぶのが容易だから。真剣なハッカーはさらに、UnixをハックするためにCを学び、システム管理とCGIスクリプトのためにPerlを学ぶべし。そして本当に真剣なハッカーはLispを学ぶことを考慮すべきだ。Lispは、その後の人生でより良いプログラマとなる手助けとなるはず。
  • 技術を選択するときは、ほかの人がどうやっているかなんて無視して、何が最適かを見極めることだけを考えるべきだ。
  • ビジネスでは、競争相手が理解出来ない技術的アドバンテージを持っていることほど価値あることはない。
第十三章 技術の分野では、「業界のベストプラクティス」は敗北へのレシピだ。
  • 基本的にアプリケーションの要求が高ければ高いほど、力のある言語を使って得られるものは大きくなる。
  • 一般的であることのコストは、例えばコードの長さに現れる。長いコードが必要だと開発にかかる時間も増える。
  • 管理職者は会社が多少どうなろうと自分の責任にならなければよいと考える。彼にとって安全なプランとは、なるべく群の中心に近い位置にいることだ。大きな組織ではこれを「業界のベストプラクティス」と言う。その目的は管理職者を責任から守ることだ。彼が業界のベストプラクティスである何かを選んでそれで会社が競争に負けたら、悪いのは彼じゃない。彼が選んだのではなく、業界が選んだのだから。
  • 業界のベストプラクティスはあなたをトップにするのではなく、単に平凡にするだけだ。
  • プログラミング言語はその力に差がある。たいていのマネージャはその事実を無視する。
第十四章 良いプログラミング言語とは、ハッカーがやりたいことをやれる言語だ。
  • 良い言語であるためには人気がなければ駄目だ。人気への影響力は、優れたハッカーの意見が最も強力だ。
  • ハッカーが好む要素の1つは簡潔さだ。ハッカーは怠惰だ。余分なものは嫌われる。
  • 簡潔さは、言語をより抽象的にすることで得られる。
  • 長い名前が問題になるのは書くときだけじゃない。読むときにもコストがあるのだ。長い名前は画面上で大きなスペースを占有してしまう。
  • ハッカーにとって、簡潔さより大事なのは、自分のやりたいことがやれることだ。可能なかぎり、プログラマが内部をいじれるようにしておくべきだ。
  • 究極の簡潔さとは、欲しいプログラムが既に書かれていてそれを呼ぶだけ、というものだ。未来のプログラミング言語は、言語の核と同じくらい慎重に設計されたライブラリを備えているだろう。プログラマが、どのライブラリが欲しい機能を実行出来るかを推測できるようになっていなければならない。
  • 最も良い書き方は書き直すことだ。良い作家は皆これを知っている。同様に、デザインの最も重要な段階は再デザインである。
  • イノベーションにおいて、最初のフェーズでは、自分はその問題を解決できるという確信に押されて問題に取り組む。第二フェーズでは、自分のやったことを冷静に見つめ、その欠陥をはっきりと目にする。この、希望と心配のバランスをうまく取れれば、プロジェクトは二本の足で自転車をこぐように前に進む。
第十五章 研究は独自性が必要だ。デザインは良くなければならない。
  • デザインと研究の違いは、「新しさ」対「良さ」の問題だ。デザインは必ずしも新しくある必要はないが、良くなくてはならない。研究は、必ずしも良くある必要はないが、新しくなくてはならない。この2つの道は頂上で一緒になる。最高のデザインは新しいアイディアでもってそれまでのものを凌駕するだろうし、最高の研究は新しいだけでなく、解くに値する問題を解くのだ。
  • 良い建築家は、デザインを先に作ってから住む人に押し付けるのではなく、住む対象となる人を研究して、それらの人々が必要としているものを見つけることから始める
  • ユーザが必要としているものを創るというのは、ユーザの言うとおりに創るということとは違う。ユーザは本当に欲しい物が何かということについてよく間違う。ユーザはすべての選択肢を知っているわけじゃない。
  • 各ユーザの希望の最小公倍数みたいなものを目指すのが良いデザインではない。あるユーザの集合を決め、そのグループにとって良いものを創る。特定のグループのユーザ向けの良いデザインは、別のグループ向けとしては良くないかもしれないが、大事なのは、特定のグループのユーザを対象にすることだ。ユーザを特定しないことには、デザインの良否さえ議論できない
  • 良いデザインが出てきやすいのは、対象とするユーザがあなた自身を含んでいるときだ。自分自身を含まないグループに対して何かをデザインしていると、対象ユーザ層は自分より上ではなく、下だと思ってしまいがちになる。ユーザを見下すことは、いずれデザイナーをダメにする。
  • 絵画の教師は、正確な線画を得るには輪郭を順になぞってはいけないと教えるだろう。誤差が積み重なって最終的に線が合わなくなる。そうではなく、いくつかの線を大体の位置にざっと置いて、そのスケッチを次第に詳細化してゆくのだ。同じように、何か新しいソフトウェアを創るときは、できるだけ早くプロトタイプをユーザの前に出すべきだ。それから詳細を作っていく。長い時間をかけて完全な最終形の製品を作り上げてからユーザの前に出すやり方で、数えきれないほどのベンチャー企業が自滅していった。
  • プロトタイプから次第に詳細化してゆく方法は士気に良い。なぜなら、常に没頭していられるからだ。良いものを作りたいなら、いつも「うーむ、こいつは素晴らしいぞ」と思い続けていなくちゃ
第十六章 ほかより飛び抜けて優れたプログラマがいる。そんな素晴らしいハッカーたちはどういう人物なんだろう。
  • プログラミングでも、最も難しいのは問題を解くことではなく、どの問題を解くかを決めることだ。
  • 技術は生産性の差を拡大する。プログラミングの世界で起こっているのは、単に技術による梃子の効果が非常に大きく効いているってことだ。
  • スーパーハッカーを特徴付けている資質は、プログラミングを本当に愛しているということだ。
  • ハッカーは良い道具が好きだ。良いハッカーは、悪い道具を使うことに耐えられない。
  • 素晴らしいハッカーは一般的にオープンソースソフトウェアを使うことを主張する。そちらのほうが良質だというだけでなく、自分で多くをコントロールできるからだ。良いハッカーはコントロールしたがる。それが彼らを良いハッカーたらしめている理由の1つだ。
  • 良いマネージャは問題をより面白いものに再定義してやることができる。スティーブ・ジョブズはこの点が特に長けている。高いスタンダードを持つというのもその一部だ。彼は問題をこう定義した。美しいコンピュータを創ろう。
  • ハッカーは高い基準を持っている人と働きたがる。
  • 本当に優秀なハッカーは自己管理がちゃんとできている。
  • 美とは何かを知らずして、美しいものを創りだすプロセスを管理することはできない。デザインを進めるには、マネージャは会社の製品について最もうるさいユーザでなければならない。そして、スティーブ・ジョブズのように本当に良いセンスを持っているなら、優秀な人々が働きたがるような問題を見つけることで、自分自身を満足させることができるだろう。
  • ハッカーに特有な資質は好奇心。特に、ものが動く仕組みに関して。
  • ハッカーは集中力、つまり他のすべてのことを頭から追い出せる能力がすごい。何人かのハッカーは、ビールを半杯でも飲んだら全くプログラムできなくなると言っている。ハッキングは、ある種の特殊な集中能力を必要とするのかもしれない。
  • 自分を素晴らしいハッカーにすることができるとしたら、その方法とは、退屈なプロジェクトの仕事は一切しないこと、その代わり、絶対に中途半端な仕事はしないこと。

感想

ハッカーと画家について書かれているのは主に第二章(第二章はウェブ上に公開されている Hackers and Painters)。
全体としては、画家だけでなく建築家なども含めた芸術家とソフトウェアエンジニアを比較して、共通点を見いだしている。これがとてもわかりやすくて参考になった。他には、ハッカーの素晴らしい点、サービスを創るときに気をつけること、デザインにおいて気をつけること、どうやって学習していくか、ベンチャー企業のよさ、ベンチャー企業で働く上で気をつけることなど、盛り沢山な内容になっている。エッセイだがビジネス書のように得られるものが多い。特にデザインについて詳しく書かれていた。どれだけユーザの視点に立って見れるか、ユーザのニーズを把握するにはどうすればいいのか、それを作り出すためにはどのようにすればいいのか、はすぐに実践に活かしていこうと思った。また、ハッカーは富を生み出すことができる、などハッカーの魅力が伝わってくる。
ハッカーを目指す人、webサービスを創ろうと思っている人、IT関連で起業しようと思っている人にはおすすめの本。

関連記事



お読み頂きありがとうございます。
もしブログの内容を気に入って頂けましたら、RSSリーダーの登録よろしくお願いします。
twitter@kbktやってます。
Subscribe with livedoor Reader    にほんブログ村 IT技術ブログ プログラム・プログラマへ  人気ブログランキングへ


◆◆このブログのサイトマップへ◆◆