« 2008年3 月 | メイン | 2008年5 月 »

2008年4 月

2008年4 月29日 (火)

Free Changes Evertything

クリス・アンダーソンが"Free! Why $0.00 Is the Future of Business"という論文を書いていることを、NikkeiNetで知って読んでみた(要約はNikkei Netから引用)。

・ 技術進歩により、情報の処理・保管・伝送にかかるコストは限りなくゼロに近づき、人間が行う作業もソフトウエア化された瞬間にコストが限りなくゼロに近づく

・ 限界コストがゼロに近づくなか、ネット上では無料ビジネス(free business model)が可能になっているが、それで収益を上げるには需要者と供給者に加えて第三者が介在しなければならない

・ その先例はマスメディアのビジネスモデル(無料で番組を視聴者に提供して収益を得る)であり、ネットに関わるあらゆる産業にマスメディア型の無料ビジネスモデルが広がるであろう

・ ネット上では貨幣価値が希少性を測る唯一の手段ではなくなり、評価(reputation)や注目(attention)といった要素(外部経済効果)の重要性が増大しているが、無料ビジネスはそれらの新たな希少性を獲得するために必要なのである

「コンテンツは無料」の時代にいかに稼ぐかを考える

サービスの無料化が加速するとしても、何かをお金に換えなければビジネスは成り立たない。ここでは、評価や注目が挙げられているが、無料を前提として、サービスの中で何を希少性として外部に提供できるかは、考えてみるといろいろ出てきそう(今はマーケティング情報みたいな、しょぼいものしか思いつかなかった)。

 

Longtail著者の新作"Free"、Wired誌に先行登場! 6つの無料ビジネスモデルとは?
無料経済=お金が買える経済

2008年4 月24日 (木)

リーン開発の本質

トヨタ生産方式(TPS)をソフトウェア開発に適用する

■原則
 原則1:ムダをなくす
  ムダとは価値を生まないあらゆるもの。
  ならば、ムダを無くすには、まず顧客にとっての価値を理解しなければならない。
  次にムダを見抜く能力を身につける。

 原則2:品質を作り込む
  テスト駆動開発や継続的インテグレーションで最初から欠陥が入り込まないようにする。
  新たな機能を追加する前に、リファクタリングを行い、コードをシンプルに保つ。

 原則3: 知識を作り出す
  プロセスを継続的に改善する。
  どのような異常であれ、元凶を見つけ出し、再発防止のためにプロセスを変更する。

 原則4: 決定を遅らせる。
   システムの初期機能を開発している時点で、重要な決定をしてしまい、
  将来の変更を妨げてはならない。
  難しい決断はなるべく遅らせ、選択可能な状態を保つ。

  原則5: 速く提供する
   ムダがなくなれば、スピードが上がる。
  スピードと品質は共存する。
   サイクルタイムを重視し、重要なところから改善する。

 原則6: 人を尊重する
  リーダーシップを発揮させる。専門知識を備えた人を育成する。
  やるべきことややり方を指図するのではなく、人が頭を使い、
  自らそれを見つけ出すことのできる、自律した組織を作る。

  原則7: 全体を最適化する
  注文を受けた時点から、ニーズ解決されるまでの、バリューストリーム全体を解決する。
  部分最適に陥ってはならない。
  バリューストリームの中で、ボトルネックとなっている箇所を見つけ出し、
 本当に重要な一つだけを最適化する。

■7つのムダ

 1. 未完成の作業のムダ
  ・コード化されていないドキュメント
  ・コミットされていないコード
  ・開発したがリリース待ちのコード

 2. 余分な機能のムダ
  ・必要性に疑問があるものを作ってはならない

 3. 再学習のムダ
  ・一度覚えたことは、次に必ず引き出せるようにする。
  ・同じ失敗を繰り返してはならない

 4. 引き継ぎのムダ
  ・引き継ぎの回数を減らす
  ・暗黙知が共有されるよう、コミュニケーションを増やす

 5. タスク切り替えのムダ
  ・マルチタスクではなくシングルタスク
  ・開発チームが保守も行う

 6. 遅れのムダ
  ・全ての待ち時間を無くす

 7. 欠陥のムダ
  ・できるだけ早期に欠陥を見つける

■待ち行列理論
 バリューストリームマップの各プロセスで、平均サイクルタイムを測定する。

 サイクルタイム =  やるべきことの数/平均完成率

 待ち行列を最小にするには、
 ・作業を特定のプロセスに集中させない。
 ・やるべきことを減らす
 ・やるべきことのリリースサイクルを小さくする
 ・イテレーションを一定にする
 ・許容能力を超えた仕事をしない
 ・プル型のスケジューリング

2008年4 月21日 (月)

Tomcatのオートリロード

Tomcatのserver.xmlでオートリロードに設定していなくても、web.xmlを更新すると、設定が再読込され、サーブレットが初期化される。オートリロードの設定は、classesとlib以下のみであるため(下の本に書いてあった)。これまで、オートリロードに設定しているから、web.xmlをtouchしたら更新されるのかと思っていたが勘違いだった。
このとき、classesも更新されるのだろうか?今度試してみよう。
無知のせいで、障害を出してしまったが、怠惰が原因よりはましか。

2008年4 月18日 (金)

スケーラブルWEBサイト

Flickrのエンジニアリングマネージャが書いた、スケーラブルなシステム・ネットワーク設計についての本。
開発環境や監視体制なども含まれ、網羅的。
大規模サイトでなくとも参考にできることが多い。

■ボトルネックの特定
パフォーマンスが劣化した際は、場当たり的に対応するのではなく、ボトルネックになっている箇所を特定する。

1. CPUのボトルネック
CPUがボトルネックになることは殆どない。むしろディスクI/OやネットワークI/O、メモリI/Oの問題による、他のリソースの割当待ちで、プロセッサが空転し、これをプロセッサの問題としてとらえてしまうことが多い。
本当にCPUが足りないのならば、サーバを増設するか、強力なCPUを購入すればよい。

2. ディスクI/Oのボトルネック
iostatで劣化時は発見できるが、問題になる前に、可能なパフォーマンスを割り出しておくのが望ましい。
Bonnie, Bonnie++を使うと、ディスクのパフォーマンスをベンチマークできる。
ディスクI/Oの速度を制限するのは、主にディスクの回転数である。ディスクの回転数を上げる方が、ディスクやマシンを増設するよりも低コストである。ディスクの読み込み/書き込みキャッシュは、性能向上につながるが、電源バックアップの機能がないと、ハードウェアダウン時にデータが失われる可能性がある。
単純にディスクを追加するだけでも、高速化される。

3. ネットワークI/Oのボトルネック
netstatやslurmで特定する。
設定ミスなどで、イーサネットの性能を使い切れていない場合がある。
またブロードキャストドメインの中にあるホスト数が多いと、ブロードキャストストームという現象が起こる。この場合はルータでネットワークを適切に分割する必要がある。
その他に、データベースのレプリケーションでトラフィックが埋まることがあり、セグメントを分割した方が望ましい。

4. メモリI/Oのボトルネック
メモリからの読み込み速度、プロセッサキャッシュへの書き込み速度、メモリとキャッシュ間のバンド幅の3要因から発生。これを改善するのは容易ではないが、マシンの数を増やせば直線的にメモリのバンド幅を増大させることができる。

5. スワップ
ps -axlでVSZからRSSを引くことで、それぞれのプロセスのスワップ使用量がわかる。
MySQLやSquiidなどディスクからメモリに大量のデータをキャッシュしているようなアプリケーションは、スワッピングするとパフォーマンスがひどく低下する。
スワッピングを減らすにはメモリを増やすか、アプリケーションのメモリ割当を減らす方法がある。
後者だけでも問題を解決できることがある。

6. 外部サービス
そのサービスのせいにしたくなるが、通信方法がボトルネックになっていることがある。
リクエストの発信とレスポンスの受信が高速に行われているかをまず確認する。
 実際に外部サービスの問題だとすると、打つ手があまりなくなってしまう。

7. データベース
標準的なLAMPシステムで最大のボトルネックになるのは、データベースの処理量で、通常原因はディスクI/Oである。ただネットワークI/O が問題になっていることもあり、始めに調べて切り分けておく。
負荷の高いクエリを特定することが必要だが、MySQLではクエリーにコメントを埋め込めるので、processlistだけではわからないときは有用。
クエリのチューニング以外に、データをキャッシュしたり、データを非正規化して複数テーブルに保持する方法もある。

■スケーリング
スケーラブルなシステムとは以下の3つを備えたもの

  • 使用量が増えても対応できる
  • データセットが増えても対応できる
  • メンテナンスが可能

よく誤解されるが、スケーラブルとは関係ないもの

  •  スピードや性能
  • Javaなどのコンパイル言語
  • XML

ハードウェア的な視点から、拡張容易に設計し、将来的なソフトウェア変更の可能性を減らすのが望ましい。はじめはハードウェアがコスト高に見えるが、次第にソフトウェアのコストが上回るようになるから。

垂直方向のスケーリングと水平方向のスケーリングがある。

 ・垂直方向
  より強力なマシンに交換する。
  よい:設計が容易
  悪い:マシンスペックは青天井ではない。強力なマシンが存在しないか、非常に高価になる。

 ・水平方向
  ハードウェアを次々に買い足していく
  よい:追加コストが低い。
  悪い:マシンの所有コストがかかる。管理費、電力、スペース、ラック代など。
     スペックを活用しきれないマシンが出てくる。

結論
コストと便益を比較しながら、垂直/水平のスケーリングを組み合わせた設計にすることが望ましい。