素直さは如何に大切かという記事を書いたのですが、考えてみれば『それは私自身にも当てはまるのでは?』というツッコミがきそうですし、何よりこれはエンジニア向けに書いているので『判別つかない議論をどうすれば見極めれるのか?』とか『自身がどういう姿勢で臨めばよいのか?』という全うな質問もあるかと思います。
そこで、ITエンジニアが適切に議論(主張)を行う方法をメモしてみます。
1.自分の主張が正しことの裏を取る
もっとも大事なことは自分できちんと根拠を示すことです。では根拠となるのはどういったものでしょうか?
(1) 実験する
例えば、『○○の方が速い』ということでしたら実際に実験してみればよいのです。実験というのは何より客観的ですのでその結果は事実として受け止める必要があるでしょう。ただ、実験では『たまたま自分のマシンでは速かった』ということもあるでしょう。したがってその実験が再現できるよう環境もあわせて提示しましょう。
SQLの実行パフォーマンスについて 2010ではこの方針にのっとって主張を行っています。
(2) 論理的な考察
実験にプラスしてそれを補う理論的な考察も必要でしょう。ここで重要なことは、IT周りの議論が起こったとき理論的な考察というのに無理がある場合があることです。つまりITの世界は数学のように割り切れない面もあります。パフォーマンスという一見簡単な問題にしても純粋な数学からすれば充分に複雑です。いわゆる複雑系というやつです。それ以外でも例えば、工数が少なくなるというのはそもそも主観が入るでしょう。そのような場合は出来るだけ問題を簡単にして説明可能な実験に分割してそれぞれ実験を行えばよいでしょう。
[ADP開発日誌]SQL(JOIN)の実行パフォーマンスについて2011ではこの方針にのっとって主張を行っています。
(3) 他のソースの引用
確からしい他のソースから引用するのももちろん良いでしょう。その場合引用元を開示すれば他の人が検証可能となります。この場合注意したいのはインターネットの情報はウソもあるということです。騙されないようにする必要があるでしょう。
2.騙されない為のテクニック
ITエンジニアたるもの技術的な論争についてはきちんと処理をしたいところです。口頭での議論だとついつい煙に巻かれることもありますが、ネット上ですと文章として残っていますので冷静に対応すればよろしいかと思います。
(1) 発言者の過去の発言を検索し矛盾がないか検証する
残念ながら論理的に筋道が通った話ができない人がいます。また人というのは時間と共に考え方が変わります。相手の発言はそのようなことを考慮しているかどうかを検証する必要があります。その際にあらかじめ公開の場で質問をしておくと後々それが助けになります。
件の社長は、
炎上したのでまとめ
で、
『SQLはオブジェクト指向言語の数十倍の効率』
という発言し、その根拠にコメント欄で、JOINの例を挙げたが、その一年後にツイッターで、
『JOINをなくすならAPサーバでキャッシュする。 集計関数をなくすなら、ORDER BYを禁止する。 SQLがイヤならRDBMSは使わないこと。 何度も書いているけれど、SQLで出来ることをAPサーバでやっても、【絶対に】DBサーバの負荷は減らない。 ただし、下手糞を除く。』
と発言しています。そしてそれを指摘すると今度は、
シビアな設計で、
『JOINするしないでは、トレードオフの関係は、すべてのリソースに対して技術者の技量しかありません。』
といっています。発言に矛盾があることはもうお分かりでしょう。
(2) 質問に答えない
少なくとも明らかな素人を除いて、質問に答えない(そして中傷してくる)相手はその質問自体に答えたくないのでしょう。
SQLの実行パフォーマンスについて 2010で私は件の社長本人に『SQLはオブジェクト指向言語の数十倍の効率』の考えは変わったのか質問しましたが、件の社長はそれには直接答えていません。逆に質問してきたり、独自の認定を行い、議論を終わらせたりします。少なくとも自己の主張が正しいとするならば質問には答えられるはずです。
(3) 綺麗な図に惑わされない
これは一部の方に行われているが綺麗な図や表を用いてさも正しいという風に見せ付けることがあります。いくら綺麗にまとまっていても真のITエンジニアたる者だまされてはいけません。よーく検証しましょう。
例えば、以下の図ですが、
一見綺麗にまとまっているでしょう。しかし、データ転送量の欄を見てみましょう。
『データ転送量 トラフィックに影響 JOINした方が少ない 』
とあります。これが成立しないことは、
[ADP開発日誌]SQL(JOIN)の実行パフォーマンスについて2011で指摘しています。一見すると綺麗な表でまとめられているので気がつかないかもしれませんが、きちんとみれば分かります。また他の項目についてもきちんと説明せずに結果だけが表になっていることが分かります。
3.議論をする上での心構え
本来議論というのは、炎上をねらったり、闇雲に自己主張をするのではく、自己の見聞を広めたり、起こった事象に対して深い考察を行ったりするものであると考えます。
(1) 議論は勝ち負けではない
これがぜんぜん解っていない人がいます。議論で相手を言い負かすとか論破するとかは少なくともITの分野では意味がありません。
(2) 相手の主張に耳を傾ける
自己の主張に反論してくる人は、ある意味ありがたい人です。相手の主張を受け入れ真摯に答えましょう。私は、
SQLの実行パフォーマンスについて 2010で、「OO言語側の最適化が不十分である可能性がある」と結論付けていますが、これはつまり一見すると『SQLはオブジェクト指向言語の数十倍の効率』ということが正しいと思える場面が存在することを認めています(その上でそれは視野の狭い経験にしか基づかないという指摘を行っています)。
(3) 相手に感謝する、発言を憎んで人を憎まず
議論を行った後は相手に感謝の意を表する必要があります。私自身、
SQLの実行パフォーマンスについて 2010という記事を書くにあたって再度勉強になりました。そういう意味では件の社長には感謝したいですが、それを『文盲のサル』と言われてしまっては腹も立ちますがそのような感情は捨てて、この場で感謝の意を表明しておきましょう。
2011-09-01 19:24:33
はじめまして。ヤスと申します。
一つ質問なのですが、よろしいでしょうか?
SQLでなくC++で動いているシステムがあったとして、
はたしてそれはSQLを使ったシステムよりも速いのでしょうか?
SQLのリターン速度が速いケースがあるのはよくわかりました。
(インデックスや、オプティマイザが判定をしている時間のロスについて考慮されていないのはおいておいて)
しかし、これを実装した場合、アプリケーションサーバーの負荷が高くなってしまうのではないのでしょうか?
特に、複数のSQLを同時に処理しようとすればジョインによる負荷は高くなるだろうし、
GUIで表示をさせようとすればさらに重くなると思うのです。
まあ、SQLで処理をすればDBに負荷がかかるのですが、個人的にはDBの方が負荷が少ない気がしています。
もしも、ジョイン処理がボトルネックになった場合、
C++の場合は、DBサーバーとアプリケーションサーバーの両方を拡張しないとボトルネックが解消できませんが、
(場合によってはトラフィックも絡んでくると思います)
SQLの場合は純粋にDBサーバーの拡張やインデクスの作成で対応が出来る可能性が高いと思います。
(基本的にはDBサーバー内に閉じているのでトラフィックは前社ほど考える必要はないと思うため)
このように考えると、(RDBの場合)オブジェクト指向よりもSQLの方が速いシステムが作れるんじゃないかな、
と思うのですがどうなのでしょうか?
以上よろしくお願いします。