幅広い視野で物事を見通せるエンジニアでありたい

Channel 9の活動を始めてマイクロソフトディベロップメント株式会社に6/12からほぼ毎日、夕方18:00-20:00のヒアリングを行ってきています。非常に興味深い毎日でありながら、その一方で基本的なことに立ち返るよいきっかけとなっています。

私自身はソフトウェア業界での仕事は18年目です。もともとパソコンが好きだったわけではなく、実はコンピュータの仕事なんかするものかと考えていた人だったりします。
17年を超える経験の中で、私のコアコンピタンスは何かと考えると、私自身がデベロッパーであるということだと思います。無から有を作り出す、その面白さのとりこになったのは、初心者からスタートしてC言語を学び、1ヶ月くらい過ぎたころの話です。当時は、ポインタの使い方を誤って、何度もコンピュータを暴走させた記憶があります。反面、コンピュータを異常な状態にすることを体験しながら、C言語の良さを学んできたようにも思います。当時のパソコンのリソースは、非常に貧弱でした。CPUは低速、MS-DOS上で利用できるコンベンショナルメモリが実質400KB以下だったり、ハードディスクが存在せず、フロッピーブートでアプリケーション込みでの実行なんてことも珍しくはありませんでした。MBなんて夢のような大きさだったし、GBなんてありえねーって思っていました。

でも今は、ネットワークはギガビット、メモリもGB、ストレージはTB、CPUクロックはGHz、GPUも超高速になり、そこそこの予算でも自作レベルならスーパーマシンが手に入ってしまいます。

そんな時代に、ソフトウェアエンジニアのスキルレベルがあまり高くならなく、ひとりのカバー範囲が非常に狭くなっている最近の傾向に、一人のデベロッパー経験者として憂いを感じています。

例えば、DeveloperとIT Proという言葉を分けて使っています。マイクロソフト自体も情報の提供の仕方をMSDNとTechNetの二つのブランドで行っています。欧米においては、IT Proという職種がプロフェッショナルとしての地位を認められて給与水準もスキルに応じて高くなるため、マイクロソフトの製品技術の場合、Microsoft Certified Professional、すなわちMCPの資格、特に上位の有資格者というのは仕事をする上で優遇される可能性が高いです。しかし、日本に目を向けるとそうとは言い切れません。ではそこにどんなギャップがあるのだろうかと勝手に想像してみます。

もともと日本においても、計算機のエンジニアというのは、開発も運用もこなすエキスパートであったと思います。今の言葉で言うDeveloperとIT Proを兼任していたようなものです。言い方を変えると、コンピュータと会話する手段をきちんと持っていて、目的に合わせてコンピュータを利用することを限られたリソースの中で実現する、考えてみれば至極当然のことをこなしていたわけです。これはメインフレームのような大型コンピュータに限らず、PCベースのDOSシステムにおいても同じだったと思います。コンピュータリソースが貧弱だった時代は、開発者は1バイトでも少なくプログラムサイズを削る努力を行い、実行時のフットプリントを含めて、利用可能な範囲のリソースの中で最大限の効果をもたらすシステムを設計し、実装してきたと思います。特にDOSベースでネットワークを構築していた時代にシステムを開発していた人は、様々な制約の中で仕様を定め、現在では考えられないようなシステムチューニングを施していたと思います。(私もその一人だったりします)

DOSからWindows、TCP/IPの浸透、ネットワークの高速化、WWWサービスの増加、Webベースのシステム開発へのパラダイムシフト、Webサービスを複合したSOAへのシフト、FTTHやMIMOといった高速ネットワークの低価格化と民生化、さらにはモバイルアクセスの増大。利用可能な技術は確かに革新を遂げています。

では、問題。

大規模Webアプリケーションをきちんと設計できるアーキテクト(あるいはデベロッパー・・・私としてはこっちの方がしっくりくるけど)になるためには、何を知っていなければならないのでしょうか。

似たような問題をC/S(クライアントサーバ)全盛の時に、ネット系のコミュニティで提起したことを思い出します。

なんだかんだ言っても、DeveloperとIT Proと両方の素養を持っていて、ハードウェアからネットワーク(機器構成含む)を含めて、OS、ネイティブAPI、メモリマネジメント、同時アクセス、トランザクション、耐障害性、セキュリティ、データベース設計および管理、コンポーネント設計、分散処理、スレッド、排他制御(クリティカルセクション、ミューテクスなど)、QoS、SLA、クラスタリング、バックアップ&リストア、HTML、CSS、XML・・・、俯瞰レベルからコンピュータ内で起こっている細かな処理やデータ伝送処理まで、様々なことを見渡せなければならないように思います。ストレージが巨大になれば、SANの構築や運用、WWナンバーの管理やRAID構成、ストレージ仮想化、さらに複雑な技術が要求されます。

で、そんな広範囲なことを見渡せる人って、例えば日本にどれだけいるんでしょ?という疑問(ならびに興味)がわきます。

じゃあ、お前はどうなんだ?、という意見もあるでしょう。まずは、こちらからアプローチしてみましょう。

繰り返しになりますが、1989年4月、初心者からのスタートで私はC言語のプログラマとなりました。その後、数々のプロジェクトを通じて、COMポート(RS-232-C)やI/Oポート経由の制御を通じてネットワークプロトコルなるものを学ぶ機会に出会いました。その後、拡張ボードの制御をDOSのコンベンショナルメモリのバンク切り替えを通じて、FARポインタを駆使しながら理解していきました。バイナリモードもテキストモード、どちらでもファイルアクセスはできるようになり、データの永続化ということを学びました。それでは足りず、検索容易性の追求ということで、当時データベース用のライブラリを買ってもらえなかったゆえに、自らデータベースもどきのデータアクセスライブラリを作ったりもしました。SHARE.EXEのプロセスを利用し、ファイルアクセスの排他制御を理解していきました。やがて、ISAMをベースとするDBFというファイル形式を簡単に取り扱えるdBase互換処理系(通称Xbase言語)に出会い、データアクセスとプログラムロジックが一体で記述できる言語にとことんほれ込みました。Windowsが登場し、DDEでのアプリケーション連携だけでなく、OLEの技術でのアプリケーション連携に出会いました。しかしそれだけでは目的を達成しづらく、メッセージループのフック(目的としてはハック)を覚えました。やがて先進的なオブジェクト指向言語に出会い、ダイナミックバインドの強力な部分にほれ込みました。同時にトランザクションを含めて、異機種混合の中でのデータベースアクセス技術をODBC 2.0時代にとことん追求しました。WWWサービスについては、IIS1.0のベータの時期から学び、CGI(Common Gateway Interface)を利用して、Xbase言語で作成したアプリケーションを動的に呼び出して、動的なWebページを作成することを学びました。IISのASP(Active Server Pages)サポートにもすぐに飛びつきました。その後、マイクロソフトがOLEDBを投入し、時代がUDA(Universal Data Access)になろうとし、ADOとMTSを追いかけました。ここまでが1999年くらいまでの話です。

そこから先が、日本のトレンドとかなり違った動きになっています。2000年4月から、Enterprise Application Integration、Business Intelligence、Portal、といった情報管理系の技術にどっぷりはまりました。Enterprise Application Integrationの世界においては、OLEDB、XML、MAPI、WBEM、EJB、COM、LDAP、ODB、様々な情報ソースを集約し、C++、COM、あるいはJavaのAPIで情報アクセスできる技術を中核とした製品に触れ、それをベースにService Managementという世界に足を踏み入れました。ソフトウェアをサービスと捉え、利用した分を測定し、課金(社内システムであればコスト配賦)することができる製品の国際化ならびに日本語化に関与しました。この時に、動的に生成されるXMLからHTMLをレンダリングする技術や、LDAPサーバに格納されているユーザインターフェイス要素を元に動的にWebアプリケーションのメニューを構築する技術、計測された値に対して、サービスレベルの目標値(Service Level Objective: SLO)を設定し、複数のSLOを組み合わせて計算することからSLA (Service Level Agreement)を導き出すためのSLAエンジンという技術にも触れることになりました。その製品のWebアプリケーションのユーザインターフェイスに関する文字列をXMLにまとめることでの国際化、ローカライズの簡便化なんかを推進したのが2001年初頭。ラウンチは9ヵ月後。その間に学んだことは数知れず。2002年初頭にはその製品のアップグレードにおいて、コアテクノロジーの徹底理解だけではなく、Webベースのレポートエンジンの多言語対応について、議論した時期もありました。JavaScriptとWebサービスの組み合わせ、今でいうところのAjaxによる開発はその頃に経験する機会があったりします。
同時期に、面白い製品オプションの開発を行ったことがあります。java.io.Serializableインターフェイスを有するJavaのクラスをC++からインスタンス化して呼び出しできるというものです。これは、ローカルマシン上のJavaオブジェクトの生成だけではなく、RMI(Remote Method Invocation)を利用しているEJB(Enterprise Java Beans)の呼び出しができる、かなり変なものでした。EJBのシステムとC++ベースのシステムを簡単に連携できてしまう(もっというと実は、COMベースのシステムとEJBのシステムもOK)ものを開発したことがあります。2002年の3月からスタートして、完成したのが2002年の6月くらいだったかと。

その後は、Service Management製品のEnterprise展開ということで、大手製造業向けのシステム設計に関与したのが、2002年10月。当時のお客様から要件が出てこず、結果として自ら要件定義を提案しながらまとめていったあの頃。データモデルからドメイン分析、パッケージ構成、GUIの設計、機能設計、・・・、要件を出してくれないお客様の様々な状況を想像した上での設計活動。もの凄い量のドキュメントを作成して、深夜まで見直しを続けた日々。システム連携上で不足するAPIについては、WebサービスのAPIとして拡張してもらう提案を続けていた時期もありました。

そのプロジェクトが終わり、2003年に私は、3つのロールを一手に引き受けることとなりました。Linux技術と関連製品、セキュリティ製品、さらに特殊任務部隊を指揮する隊長。特殊任務部隊は、S.W.A.T(Special Weapon And Tactics)と呼んでいました。隊長でありながら、自らもS.W.A.Tである立場。S.W.A.Tの実力を試されるために初見のセキュリティ製品の国際化を3週間で終えたことは今でも忘れることはないでしょう。ACLを管理する製品と組み合わせることで、WebサイトのURL単位でのアクセスコントロールを実現する製品のAgentのマルチバイト対応なんかもやっていたりします。

単なるC言語プログラマで出発した一人の男は、2003年9月の時点で、Webシステムの国際化を英語版Windows、英語版MSDEで実現するところまで変貌を遂げました。
その後は、製品開発における国際化アーキテクトという道を歩み、インドで70名の技術者に対して国際化プログラミングを指導したこともあります。

なんだかんだ言いながら、2000年前半はManagement Softwareの世界にどっぷり漬かれたことが良かったと感じています。視野はかなり広がりましたが、進化する技術へすべて追従できているとは思えてません。ただし、アナロジー(相似)で考えるという癖をつけてきているので、新しいものが出たときに、それの前進となる技術と対比しながら概要レベルには追いつけられるかと思っています。

2005年9月にマイクロソフトに入社し、今までとはまったく異なる土俵での仕事に移り、いろいろありながら、現在は、Channel 9のブロガーに。

前置きとようやくリンクできるわけですが、Developerのマインドを持った上で、現役Developerを取材すると、いろんなことに気がつかされます。
1点集中で細かいところを深堀する立場の仕事をしている方と、サーバ系製品の担当の方は見ているところが若干異なりつつ、でも必ずその先にインテグレーションを考えている。

主題である幅広い視野で・・・というのは、システムインテグレーションの具体的なイメージを描きだせるだけではなく、頭の中でシミュレートできるような状態を意図しています。

ひさびさのブログなのでまとまりが悪いかと思うのですが、日本のマイクロソフトで働く開発者は存在していて、彼らは幅広い視野で物事を見通している(考えて行動している)ように感じます。たぶん、このブログを読んでいる方からはとても想像のつかないような物凄いことが日本のマイクロソフトの開発チームで起きていることは、まずほとんど知られることのない事実でしょう。開発チームの各ブース(作業用の机と空間)には必ず複数の専門書がおかれています。チームによってはライブラリスペースに図書館を作っている場合もあります。単純にマイクロソフトの技術だけではなく、業界で利用されている様々な技術に対して理解をしながら仕事をしていると思います。

先の問題(大規模Webアプリケーションをきちんと設計できるアーキテクトに必要なものは?)に立ち返ったとき、やれDeveloper、やれIT Proだ、という議論は存在せず、すべてを包含して考えることのできるエンジニアが必要だと思います。

しかし残念なことに、WebシステムのDeveloperの多くはLAMPベースで、他人のソースを流用したり、流通しているコンポーネントを取り込むことでしか、開発を進められないのではないかと想像しています。誤解のないように言うと、LAMPを否定するわけではなくて、LAMPベースのソリューションは、いわば他人のいいとこ取りで、何も考えずにサイトを構築している例が少なくないのではと考えています。

OS論争をここで議論したいわけではなく、どんなプラットフォームであっても、共通の問題が存在するはずです。そんな中で「俺はこの担当ではない」といった狭い見識ではなくて、幅広い視野で物事を見通すことが重要だと感じています。

(寝不足なので)コンテキストがハチャメチャかもしれませんが、日本のマイクロソフトには高いレベルの開発者が存在していて、その人々のリーダーシップや推進力によって、日本市場向けの製品が変化しつつある、ということを一人でも多くの人に伝えたいです。

私自身も単なるビデオブロガーに留まらず、もっといろんな技術に対して掘り下げていければと考えています。

「幅広い視野で物事を見通せるエンジニアでありたい」、これは私の今後も続く目標です。