2003-11-20

win32 時代はレガシーに隠れて見えにくかった Microsoft 的な設計感覚が, Longhorn からははっきりとうかがい知ることができる. それについて少し考えてみる.

(1) 反実装透過 : Anti-Implement-Transparency

Microsoft の設計は実装を強く意識している. 私達開発者が見れば, 実装がなんとなく想像できるような設計だ. 性能重視の立場に立つとこれは正しい. 標準化され実装に中立な設計は, 性能のボトルネックや高速化の指針を読みにくい. 実装指向の設計の例として, Avalon なら Style や AdaptiveFlow がわかりやすいだろう. ツリー構造になったスタイルオブジェクトやレイアウトモデルを私達は比較的容易に想像することができるし, AdaptiveFlow はレイアウトエンジン(まさに実装!)へのアクセスを許している. CSS , 特に inline でない分離式のものと比べてみよう. そこは完全なブラックボックスだ. CSS lookup の実装なんて, なかなか想像できない.

もちろんソフトウェア工学の観点からはブラックボックスが正しい. しかし性能のために骨身を削るデスクトップ・アプリケーション/パッケージソフトウェア開発者の立場に立つと, ブラックボックスより反実装透過性がありがたいという気持になることがある. 実装の複雑さを気にかけるコストとソフトウェアから得る利益のトレードオフがそこにはあり, ある状況では後者が優勢になるということなのだろう. Microsoft 自身がそれにあてはまる典型例: 性能で凌ぎを削り, それが莫大な利益を生む.

(2) 反汎化性 : Anti-Genericity

ものごとをパラメタ化しないという姿勢.

また CSS を引きあいにだす. CSS ではレンダリングモデルの要素として Block と Inliine (あと特別扱いとして Table) を用意し, HTML のマークアップはすべてこの要素を CSS のパラメタで装飾したものとして扱うことになっている. 要は div 要素と span 要素 があればあとはスタイルを使ってどんなページでも表現できるというアイデア. これはシンプルで一貫した魅力的なモデルであるものの, 細かいところに手が届かない齒痒さも一方にある.

Avalon の レイアウトモデルはもっとベタだ. 考えうるレイアウト要素を片端から列挙している. スタイルで指定するのは背景色など一部のパラメタだけなのだろう. 整然とした CSS 世界の対極を行っている.

この違いも Microsoft のポリシーをよくあらわしている. 一般的なモデルとそのパラメタという考えはシンプルだし, 大抵はうまくいく. しかし世界征服を目指す Microsoft は大量の要求を処理する必要がある. そういう(時に矛盾を含む)要求を満たそうとすると, パラメタの数は爆発的に増えざるを得ない. 性能は失なわれる. 汎化やパラメタ化を諦めモデルを拡張すると, 複雑さは増すが性能を維持する余地が生まれる.

ここでは, メンテナンスコストと速度がトレードオフとなる.

このように, ソフトウェア設計の原則にある部分で見切りをつけることがより良い解に繋がることもある. Microsoft は積極的にその割切りをする傾向があり, 山ほどの失敗を生む一方で学ぶべき点もまた多いと思う.

原則の破り方は身につけるのが難しい. 大抵は調整を誤りソフトウェアを破綻させてしまう. 原則をどう破るかを見抜く能力, それをバランス感覚と呼ぶこともできるし, あるいはセンスといっても良い. この話は気になっていることなので, たぶんそのうちまた書く. (なにしろセンスと言って済ますには情報産業の雇用状況が不安定過ぎるのです.)

付録: 関係のある話