@ledsun blog

無味の味は佳境に入らざればすなわち知れず

推測するな、計測せよ

Rob Pike先生は「推測」は否定していないのでは?

「推測するな、計測せよ」はミスリードと言う話 - aki33524’s blog

Rob Pikeが批判しているのは「合理的な根拠なしに決めつけてハックをすること」であって、「推測」すること自体ではない。

「推測」の否定っておかしいのでは?という疑問です。興味深いので検索してみます。

Rob Pike先生がsecond guessと書いたのを「推測」と訳したのが間違い?

Coding and Marketing on Tumblr

後述しますが、前節の勘ぐるなは guess ではなく second guess です。guess は推測する、second guess は(合理的な根拠なしに)予測する、勘ぐる、という意味です。

guessとsecond guessは違うみたいです。

Notes on Programming in Cで1987年の原文が読めます*1

Rule 1. You can't tell where a program is going to spend its time. Bottlenecks occur in surprising places, so don't try to second guess and put in a speed hack until you've proven that's where the bottleneck is.

確かにsecond guessです。

second guessの意味・使い方|英辞郎 on the WEBでは

〔合理的な根拠なしに~を〕予測する、勘ぐる

と、second guessに「勘ぐる」という意味があるとしています。 ということは、Rob Pike先生がguessではなくsecond guessと書いたものを、「推測」と訳したため誤解が生まれてそうです。

Rob Pike先生は「推測」すること自体は否定していなさそうです。 さらに、次の情報も見つかりました。

「推測するな、計測せよ」の元ネタはRob Pike先生でない?

「計測なくして改善なし」は誤引用 - ぜぜ日記

そもそもプログラムの速度など計測可能なものについては、"Measure Don't Guess." 「推測するな、計測せよ」という情報工学界隈にて誰が言い出したかわからない*2格言で殴ったほうが誤解は少なそうである。

*2:ベル研でUNIXの開発に携わっていたRobert C. Pikeという説もある。Wikipediaによれば彼の著書のNotes on Programming in Cに近い文章は書いてあるようだがそのものは見つからない

「推測するな、計測せよ」はRob Pike先生とは独立という説です。 また、原文の"Measure Don't Guess." の時点で、second guessのsecondはなくなっています。

"Measure Don't Guess."で検索するといくつか使用例が出てきます。

また、「燃えよドラゴン*2」風の"Don't guess, measure!”という言い回しもあるようです。

"Measure Don't Guess."や"Don't guess, measure!”はそれで十分意味が通ります。 説明の補足として、Rob Pike先生の文章を添付することもありそうです。

しかし、Rob Pike先生の文章の要約としては不十分にも思えます。 後半でより多くの字数をつかって説明しているアルゴリズムとデータ構造の話を捨てて、前半のRule1とRule2だけを要約するのは不自然です。

自分で訳してみる

以上の理解を踏まえて、自分で訳してみます。

UNIX哲学 - Wikipediaの日本語訳*3では

ルール1: プログラムがどこで時間を消費することになるか知ることはできない。ボトルネックは驚くべき箇所で起こるものである。したがって、どこがボトルネックなのかをはっきりさせるまでは、推測を行ったり、スピードハックをしてはならない。

「推測」が使われています。確かに、なんとなくニュアンスが違うような気がしてきました。 自分で訳してみます。

Rule 1. You can't tell where a program is going to spend its time. Bottlenecks occur in surprising places, so don't try to second guess and put in a speed hack until you've proven that's where the bottleneck is.

プログラムのどこに一番時間が掛かっているか上手く説明できますか? ボトルネックはあなたが予想した場所にはありません。 当てずっぽうでチューニングしてはいけません。 まず、計測してボトルネックを特定しましょう。

Bottlenecks occur in surprising places

を肯定文で書くのすごいです。 僕が、日本語で表現しようとすると、どうやっても否定文になります。

second guess and put in a speed hack

は、 and でつながっています。Wikipedia訳の 「推測を行ったり、スピードハックをしてはならない。」はsecond guessとput in a speed hackを別々に実行できそう見えるので、良くないように思います。「推測でスピードハックをしてはならない。」くらいが良さそうです。

なんかこの辺が原因っぽい気はします。

もしかしたら

推測を行ったり、スピードハックをしてはならない。

は「推測してはならない」そして「スピードハックしてはならない」と読めてしまいそうです。この前半部分だけ取り出すとRob Pike先生が「推測してはならない」と主張していると読み取れます。

これにRule 2の「計測すべし。」をくっつければ「推測するな、計測せよ」のできあがりです。

こんな感じで「『推測するな、計測せよ』の元ネタがRob Pike先生である」説が生まれたのかもしれません。

*1:あらためて読むと「チューニングのために流行のアルゴリズムを入れるのを、やめろ。計測してボトルネックを特定して、データ構造を作り直せ」みたいな気持ちが読み取れて面白いです。

*2:燃えよドラゴン」は1973年の映画です。出演したブルース・リーの台詞に「Don't think! Feel.」があります。

*3:2008年5月の訳のようです。https://ja.wikipedia.org/w/index.php?title=UNIX%E5%93%B2%E5%AD%A6&diff=prev&oldid=19897006