あらゆる情報をうのみにするな.NET
|
|
12月24日の夜、電子メールなんかだれも読まないだろう時間に、@ITの人気記事ランキングが届いた。その第9位に登場している、Security&Trustフォーラムの須藤陸氏の記事が目に留まって今回の原稿を書いてみた。氏いわく、セキュリティ対策の基本として3つの事柄が挙げられるという。「常にセキュリティへの気配りを忘れないようにすること」「デフォルトのまま利用しないこと」「常に新しい情報に注意を払うこと」。そして、「突き詰めて考えればこういう結論に至る。もはやどんな情報も、どんな警告も、うのみにして信用することはできない。チェックサムのような技術的な側面と、複数の情報ソースという人的な側面の両方から、あらゆる情報を検証する必要があるのかもしれない。いささか窮屈といえば窮屈なのだが……。」と締めくくられている。
もしまだ須藤氏の記事を読んでいないようなら、ぜひ読んでみてほしい。というのもその指摘は、私たちソフトウェアの開発を飯の種にしている人種にとっても有益だからだ。もちろんセキュリティな人たちがいま何を考えているのかを知ることが開発者にとって重要だという意味でもある。だが、ここではその内容をより直接的に、ソフトウェア開発における情報に対する態度へ当てはめてみてほしい。
@ITをはじめ、いま私たちの周囲には、私たちの仕事に直接的にかかわる情報があふれている。WebでもDVDでも、メーリング・リストからBBSから、私たちは有益な情報をたくさん手にすることができる。少しお金を払えば、業界の有識者たちが面と向かって質問に答えてくれるイベントに出席することもできるだろう。Insider.NETフォーラムの記事を読んでいる読者の方々も、日々の仕事を遂行するためや将来のリスクを回避するために、情報収集に励んでいるはずだ。だが、そうして手にした情報は正しいだろうか?
「J2EE vs. .NET」「CLR vs. JVM」「Windows vs. Linux」。このテの読み物を目にしたことがある人も多いはずだ。先月はJ2EEの方が速くてスケーラブルだったのに、今月は.NETが数倍速いことになっている。どちらかの陣営が正しくてどちらかが真実をねじまげているのだろうか?
コンピュータの世界はなんとなく科学的なものに思える。科学的なものの本質とは「客観的」ということであろう。証明された事実に基づくことが科学的であるということだ。さて、考えてみてほしい。いまあなたの手にある情報は客観的なものだろうか? それは「事実」だろうか? 例えば、次のプロジェクトをC++ベースで進めるか、C#ベースでやってみるか悩んでいるときに、C++で書かれたプログラムがC#で書かれたプログラムより速いという情報を得たとしよう。その情報を得たら、次にすべきことは何だろうか?
次にすべきことは、その情報を疑ってかかることだ。それが自分の仕事に直接かかわるのであればなおさらだ。情報源がだれ(どこ)かは関係ない。情報源が著名であっても、常に正しい情報を提供するとは限らない。いままで信頼できたからといって今回も信頼できるとは限らない。
疑ったら、その次にすべきことは検証だ。自分の都合に合わせてC++とC#でコードを書いてみて実際に走らせてみる。自分の都合に合わせることがポイントだ。GUIアプリケーションを作ろうとしているのに、素数を探すアルゴリズムを書いたって意味がない。GUIアプリケーションのコードを書いてみるべきだ。そうすれば、速度に関するデータが得られるだろう。
それでは、ここで得られたデータは客観的事実だろうか? 答えは条件付きYesだ。ここでいう事実とは、「特定のコードを特定のコンパイラの特定のバージョンで特定のオプションを付けてコンパイルしたときに生成された特定のコードを、もろもろの特定の条件下で特定の時間に実行したときに、C++ベースの方がx秒速(遅)く処理を終えた」ということでしかない。これが客観的事実であるかと聞かれれば、恐らくYesであろう。だが、意味があるかと聞かれれば、「ビミョー」と答えるしかない。
この先に、実はもう1段階あることが忘れられていることが多いのではないだろうか。コンピュータが科学的な理論の上に成り立つ物体であることから、客観的事実を目の当たりにすればそれでおしまいであるかのように考えがちだが、実はこの後に「で?」というフェイズがあるのだ。で? 次期プロジェクトにとってC++は速くて使える代物なのか? C#は遅すぎて使えない代物なのか?
判断とは主観であることに注意しなければならない。恐らく最初の情報源も同じ段階を踏んで、最後にC++はC#より速いと「判断」したのだ。その情報源がよって立つデータは客観的かもしれないが、それを公表したときには彼の主観が混じってしまっている。彼の主観が入っている以上、C++はC#より速いという情報は客観的事実ではあり得ない。実際に、この情報は常に正しいとは限らないではないか。「正しい」「誤っている」という言葉は、「常に」と修飾されない限り、主観的判断の結果でしかない。
ここまでの話では、主観が混じってしまうと情報の精度が落ちてしまうので、避けた方がいいように思えるかもしれない。だがそれは筆者の意図するところではない。むしろ逆に、筆者は「主観を大事にしよう」と主張したい。私たちにとって意味があるのはあらゆる局面での判断であり、客観的事実は判断の土台でしかない。客観的事実だけを積み上げても、私たちの仕事には役立たないのだ。次のプロジェクトでC++を選択するためには、客観的事実を積み上げなくてはならない。だが、それでも最後にC++を選択するのは、プロジェクト・メンバーの主観的判断なのだ。
しかし、主観的意見の取り扱いには注意が必要だ。多くの場面で、主観的であったはずの意見が、それを形成するために利用された客観的事実と同じレベルで「事実」として語られることが多いからだ。「J2EE vs. .NET」のような話はこの典型だ。重要なのは「自分の主観」と「他人の主観」とを区別することである。自分の主観を形成するために、他人の主観を利用することはできる。他人の主観的意見を自分の環境においても客観的事実として観察できるかどうか調べてみればいいのだ。その結果得られた事実を基に自分の主観を形成することができるだろう。だが、他人の主観をそのまま「事実」として受け入れてはならないのだ。それは自分とは異なる環境下で導き出された客観的事実を基に形成されていて、自分の環境ではそもそもそれが事実であるかどうかさえ疑わしいからだ。
筆者がまだ若くナイーブだったころ、『Effective COM』という書籍を読んで衝撃を受けた。そこには何とこう書いてあった。
『Be a skeptic』 Form your own personal COM belief system through empirical study and research. Don't blindly believe Microsoft. Don't blindly believe popular opinion. Don't blindly believe this (or any) book. |
『Effective COM』より抜粋
|
「疑い深くあれ」 経験に基づいた学習と研究から、COMに対する個人的な信条を形成せよ。やみくもにMicrosoftを信じるな。やみくもに多数の意見を信じるな。やみくもにこの本を(そして、いかなる本も)信じるな。(参考訳) |
Microsoftのいうことを信じるなという話はそれまでも何度か聞いたことはあったが、「この本に書いてあることを信じるな」と書いてある本はそのとき初めて読んだ。だが、これは本当に重要なことなのだ。よくよく読んでみると、MSDNの記事には間違いがたくさんある。@ITにだってあるだろう。2年前に筆者が某所でしゃべった内容は、実は間違っていたことが後で分かったりする。誤解しないでほしいのだが、筆者も含めてほとんどの情報源は、間違った情報を意図的に配信しているわけではない。だが、それでも注意してほしい。筆者を含む.NETに関する情報源がタレ流す情報は客観的事実ではない。その情報源の主観に基づく記述が何らかの形で含まれている。従って、その情報が検証された条件と読者が置かれた状況が完全に一致していない限り、それをうのみにしてはならない。その情報は、再度読者の状況下で検証されなければならないのだ。先の引用は、タイトルが「疑い深くあれ」であり、最初の一文は「実験と研究を通して、COMに対する個人的な信条を形成せよ」となっている。つまり、他人の意見を疑い、他人のデータを疑い、自分自身の手によるデータを基に、自分自身の主観的な信条としての情報を持てということである。
人間の脳には、未知の出来事に対して経験を基に判断を下す能力が備わっている。私たちは、新しい技術に対峙(たいじ)したときに、過去に習得した技術から何らかの判断を下せるはずなのだ。だが、それには過去に習得した技術に対する主観的意見が必要となる。その技術は自分にとってどこが優れていたのか? その技術を習得するときに役立った考え方は何か? その技術は何に似ているのか? それらを他人の意見ではなく、自分の個人的な意見として持っていなければ、新しい技術に対峙したときに生かすことはできない。他人の意見は、たとえそれが業界の著名人から発せられたものであろうと、決してうのみにしてはいけない。それはあくまでも他人の主観であって、自分が今後対峙するであろう問題の解決には役立たない。
2003年もさまざまなベンダや団体がさまざまなやり口で、彼らの主観的意見をあなたに押し付けようとしてくるだろう。だが、セキュリティの世界と同様に、ここでも「信じられるのは自分だけ」だ。そう、このオピニオンの内容だってうのみにしてはだめだ。あなたの主観を形成するために、筆者の主観をぜひ利用してほしい。だが、筆者の主観的意見をそのまま信じても、得るものは何もないだろう。
吉松 史彰(よしまつ ふみあき)
インフォテリアにおいて、.NET FrameworkやXMLを活用したシステムの開発とコンサルティングを行っている。また、個人でも執筆や講演活動を通して.NET Frameworkの啓蒙活動をマイクロソフトに黙って勝手に行っている。
「Insider.NET - Opinion」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|