時は2005年ごろ、Officeはスレッドを有効に使うべく悪戦苦闘していた。Outlook2007などは外部から見てもその苦闘が見られただろう(不安定、とも言う)。社内にいれば、そのずっと酷いバージョンのアルファやベータもドッグフードする機会があり、なかなかに絶望の淵を覗く思いだった。
その当時のたくさんの失敗の経験とその分析から、社内には割とたくさんの非同期プログラミングのノウハウがあった。
といってもかっこいいテクノロジとかデザインパターンのような華々しい物では無い。もっと地味な、Writing Solid Code非同期版のような感じだった。Avalon以前の地味な、面白くもない世界。
非同期と並列は違う。直交はして無いけれど。
「ブロックしてるコールを非同期コールに差し替えればいいんでしょ?」そう思って作られた大規模アプリは、すぐに動かなくなった。非同期のアプリとしてただ普通に振る舞うだけですら、それよりずっと多くの物が必要な事が分かった。手痛い失敗の山の後で。
非同期は並列の前提となる所だ。非同期に作れても並列とは限らない。
だがその非同期ですら、ちゃんとやらないとうまく行かない事がたくさんあり、細かいロ
ックのストラテジ、UIデザインの仕方、非同期ではかならず盛り込まなきゃいけない仕
様、非同期の時に望ましい仕様、避けるべき落とし穴などいろいろな事を知らないと、非
同期の恩恵は受けられない。小手先のコーディングの変更ではうまく行かず、結局根本の
デザインから考え直さないといけない。その時にどう考えれば良いのか、には、幾つか原
則がある。
と言っても別にそんな大した話でも無く、同じ問題に挑んだ会社ならどこでも似たような
結論になっただろう。当時デスクトップのアプリをやっていた所なら皆同じ事に苦しんで
いたはずだ。
自分はトレーニングも割と受けたし、社内のホワイトペーパーやブラウンバッグの動画な
どをあさったりして、結構いろいろ学んだ。
web上のスケジューラをつくる仕事をしていたので、Outlookチームとは連携が
多く、組織階層的にも近かった。だからOutlookのコードとノウハウを学ぶ機会が
多かった。そこでは非同期の失敗がいかに致命的かを、嫌になるほど見る機会があった。
といっても地味な話ばかりで、将来的にはもっと環境レベルなりライブラリなり、決定版
が出るに違い無い、とか思って、軽く見てた。
何にせよ2000年代中盤の事である。まだデスクトップアプリが、少しは生き残ってい
たような、遠い昔の事だ。
その後クライアントアプリは全滅し、webの時代が来た。予想通り非同期プログラミン
グの知識はまったく使い道も無くなり、記憶の奥底に捨て置かれ、忘れ去られていた。
時は流れて時代はモバイル。
Androidに限って言えば、非同期に関しては当時と何も違いが無い状態で、プロセ
ッサ数と解像度だけは増えました。
マジかよ、とか思いつつも昔学んだ古臭いやり方で、とりあえず非同期の基本は抑えたア
プリは書ける。大した事はしていないけれど、一応2000年代中盤は超えているなりの
デザインだ。
このままでマルチプロセッサの時代を乗り越えられる気は全然しないけれど、4コアくら
いまでならなんとか。
そんな状態でふと回りを見回すと、非同期の基本を完全に無視したようなアプリがたくさ
んある。
いや、それは全然ダメだろ、Outlook2003だってもっとマシだったぜ?とか思
ってしまう物とか。
しかもそれまでwebの世界でstate of the artと呼ばれていたチームから出てくる物がそんなだ。
何故こんなに非同期をまともに書けないのか?としばらく考えてみると、思えばwebサ
ービスのクライアントサイドには非同期のノウハウがほとんど無い事に気づく。何故なら
そもそもにロックが無いからだ。
だがUIの非同期化は特有の、しかもかなり大量の落とし穴があり、何の知識無く普通に
振る舞う物が作れるような世界では無い。
でもJSの非同期なんてリクエストを非同期にする程度の話で、それ以上のことはそもそ
も出来ない、だから失敗のノウハウが貯まらない。
そう思うと、自分が見てきたおそらく歴史上トップクラスに複雑なクライアントアプリの
古臭い非同期の話、というのは、実は今でも最先端なのかもしれないなぁ。
当時はあまりのドロドロした地味な結論にうんざりだった非同期の設計たが、意外と現在
役に立ってて、なんか棚から牡丹餅のような、得した気分だ。
地味な事もやっておくもんだねぇ。
1. プリミティブな並列の仕組みに、コンベンションやデザイン等でうまく縛ってなんとか非
2. コンベンションやデザイン等を促進する仕組みを言語やライブラリでサポートする
3. 非同期だけではリソースが使い切れないので、もっと並列化を上げる為にコンベンション
の3あたりに現在はいるのかな、と思っています。
ひょっとしたらそろそろ3を促進するライブラリ等が出ているのかもしれないけれど…
私は2までしか知らない。2はawaitやPLINQなどをイメージ。
で、Androidはそもそもにまだ1の段階なので、1の知識が地味に役に立つ、とい
さらに2以降は結局WindowsMobile等がコケた以上、象牙の塔の技術という
まぁ自分の経験ではIndigoあたりは2007年あたりの議論には入ってるんで、o