組織犯罪規制法によりタバコ会社に下った命令
アメリカのタバコ会社4社が、タバコの健康への影響について広告を出さなくてはいけなくなった。6年間の裁判の末、4社は組織犯罪規制法に違反したと認められ、テレビ及び新聞で広告をすることを命じられていたのだが、その広告がとうとう出る。
広告は5種類あるのだが、その内容がどれもなかなかに凄まじいので翻訳して紹介する。
低タール、ライト、ウルトラライト、マイルド、天然などのタバコが、健康に対して大差ないことについて
連邦裁判所は、アルトリア、R.J.レイノルズ・タバコ、ロリラード、フィリップモリスUSAに対して、ライトタバコが普通のタバコと同じくらい害があることについて次のように広告することを命ずる
- かなりの喫煙者がタバコをやめずに低タールやライトタバコに切り替えているのは、低タールやライトタバコの方が害が少ないと思っているから。それ、勘違い。
- 低タール、ライトタバコを吸っても、基本的に同じ量のタールとニコチンを吸うことになるんだ。
- どんなタバコでも、癌、肺の疾患、心臓発作、早死を引き起こす。低タールでも、ライトでも、ウルトラライトでも、マイルドでも、天然でも。安全なタバコなんてない。
裁判所による命令の原文: https://ecf.dcd.uscourts.gov/cgi-bin/show_public_doc?1999cv2496-6227
なお、タバコの危険性についての広告は、2017年11月26日日曜日よりアメリカ全土で行われる。テレビコマーシャルは、52週間に渡って週5回、平日(月曜から木曜)のゴールデンタイムに45秒枠で3大テレビネットワークに流れる。新聞広告は、43社以上の日曜版に全面広告を14週間で5回出すことになっている。スペイン語版も作り、ネットでも Flash または Javascript を用いた動画広告を出す必要がある。
もちろん、費用はすべてタバコ会社持ちである。
さすがアメリカ。やることがえげつない。
さて、グーグル社員の書いた例の文章(声明)についてだ。
きっと、もうグーグル社員(偉いやつではない)が社内で公開した文書のことは聞いたと思う。女性と男性は本質的に違って、女性がエンジニアになれるようにする努力はやめるべきだ、だって努力に見合わないんだもの。そういう文章だ。
先週までなら、ぼくはこれについて表立って発言することはなかっただろう。(かなり偉いグーグル社員として、)内部でこれに対して対処しなきゃいけないことになっていただろうし、秘密保持の規則があるから外で大々的にコメントすることは難しかっただろうね。
まあ、でも、たまたま、(さすがに、こんな形で発表することになるとは思っていなかったんだけど、)実をいうと、最近グーグル辞めたんだ、あ、別に上の話は全く関係ないし、どっちかというと、めっちゃいいことがあって辞めたんだ。詳しく知りたかったらここで読めるけどね。そんなわけで、これが起きたあと、ぼくはもうみんなと同じように部外者になってしまって、単にギズモードにリークされてたからこんな文章を書いたやつがいたっていうのを知ったっていうわけなんだ。
それに、ぼくはもう部外者で、これについて知っている機密情報は何も持ってないから、もしも社内にいたら社内で公開しただろう文章をここで書こうと思う。これはグーグルだけの問題じゃなくて、技術畑にいるすべての人間に関係があることだからね。
さて、だれかさんが、内部文章でジェンダーとぼくたちの「イデオロギーのエコーチェンバー(観念形態の残響室)*1」について書いたほうがいいと思ったらしい。だから、ぼくはここでいくつかはっきりさせないといけないことがあると思う。
(1) とても権威的に書いてるけど、この著者はジェンダーについて何も知らないようだね。
(2) もっと面白いかもしれないことに、この著者はエンジニアリングというのを分かってなさそうだ。
(3) そして、もっとも真面目な話として、この著者は、これを書いたら何が起きるか、彼自身や周りに何が起きるか、見えていなかったようだ。
1.
あんまり(1)について時間をかける気はない。もしも、だれかが、この文章のジェンダーに関するひとつひとつの意見が、どれくらい盛大に間違っていて*2、ここ何十年もなされてきた研究に対して真っ向勝負を挑んでいることかについて、つぶさに挙げたいというならまかせるよ。ぼくは生物学者でも心理学者でも社会学者でもないから、他の人に譲るね。
2.
ぼくはエンジニアだから、この仕事がどういうものかについてのこんな基本的なことについて何も分かってないのにここまでやってこれたっていうことに正直びっくりしたね。あの文章には、「ペア・プログラミングや協力を増やすことで、もっと人間指向の人向けの方法でソフトウェアを作ろう」とかあるんだけど、それは「人間指向の人向けの役割とグーグルはどうなれるか」っていう根本的な限定がついているし、なにがもっと驚いたって、「共感を重視しないこと」という題の章があって、解決策としてこれを提案しちゃってるんだ。
エンジニアリングをしたことがない人、あるいは、基本的なことしかしたことがない人は、こういうふうに思っているかもしれない。エンジニアリングというものは、コンピュータの前で座って、内部のループをめちゃくちゃ最適化したり、クラスの API をきれいにすることだ、と。たしかにね、みんなそういうことはするし、(ぼくもだけど)だいたいみんなそういうことするの物凄い好きだよね。それに、エンジニアリングの初心者のあいだにする仕事のほとんどはこういう感じだ。正しいか間違っているかはっきりしていて、淡々とあるところまでこなせばよくて、基本的な技術を磨ける。
でもね、グーグルの職務階級があるところから、等級の番号から言葉になるのは偶然じゃない。そこがちょうどある意味で一番初めの訓練期間が終了するところなんだ。誰かにじっくり見てもらわなくても一人で仕事ができるようになる。そこからようやく、本当のエンジニアリングがはじまるんだ。
エンジニアリングっていうのは、装置を作る技のことじゃない。問題を解決する技のことだ。装置は手段でしかない。目的じゃないんだ。問題を解決するっていうのは、まず、問題を理解することである。そして、ぼくたちがしていることのまさに目的が、外の世界の問題を解決することである以上、人々を理解すること、そして、つくったシステムと人々がどうやって関わっていくかを理解することが、システムを作るひとつひとつの過程において本質的だ、ということなんだ。(これは本当に大事で、だからいろいろな職務階級がある。PM の階級、UX の階級、とかいう、ある種の問題に特化したやつだね。でもね、スペシャリストがいるからといって、エンジニアはそれから関係がないってわけじゃない。真逆だ。エンジニアリングのリーダーは作るもののことを深く知らなきゃいけないに決まっている。それこそが仕事において最も大事なことだ。)
そして、一度作るシステムを理解して、なにが作られるべきかきちんと決まったら、引きこもってコードを書き始めるとでもいうのかい? まあ、趣味でやってんならそうだね。でも、プロ、それも「地球規模」とか「通信事業者クラス」とかいう言葉が少しも大げさじゃないようなシステムの仕事をしていたら、連携して協力することこそが仕事のほとんどだとすぐに気がつくはずだ。二十のばらばらのシステムじゃなくて、ちゃんと一つのシステムを作っているかどうかをはっきりさせることだ。依存関係やリスクがきちんと管理されているかはっきりさせることだ。将来の変更や発展が容易になるように、どこまでが一つの部品かを正しく設計することだ。あらかじめいろいろな種類の危険を、SRE(サイトの信頼性)、セキュリティ、プライバシー、不正使用といった各種の専門家チームとともに、プロジェクトが瓦礫の山となる前に押さえ込むことだ。
本質的に、エンジニアリングというのは、きみの同僚やお客さんと、協力して、協調して、共感することがすべてだ。もしも、だれかが、きみに、エンジニアリングというのは人々や感情の相手をせずに済む分野だ、といったならば、残念ながらきみは騙されているといわなければならない。一人でできる仕事は、かなり初心者のときにしかない。それも、だいたいは上司だろうけど、だれか上級者が、長い時間をかけてチームの中に、コードを書くのに集中できる組織構造を作ってくれたからだ。
例の文章の中で、「女性」の特徴として挙げられていたどれもが、エンジニアリングにおいて成功するために一番大事な特徴だということが分かるだろう。だれでもコードを書くくらいできる。そりゃ、L7 階級くらいまで昇進するまでに、技術を基本的に完全に習得していることくらいは求められている。でも、この仕事で本当に難しいのは、そもそもどういうコードを書くのか、どの目的をどの順番で達成するかのはっきりとした計画を練ること、そして、実際にそうなるのに必要な合意を得ることだ。
ここまでの話はぜんぶ、例の文章の結論が全部逆さまな理由になっている。女性の方が、社会環境の影響で、人々の感情的な欲求に気づくのが得意なのはそうだね。でも、これは、いいエンジニアになる理由であって、逆じゃない。ぼくは、はじめはこういうことができなかった。何年も何年もかけて、へとへとになりながら、学びつづけなくてはいけなかったことだ。(あと、付け加えておけば、ぼくはめちゃくちゃ内向的だ。20年前に、毎日複雑な人間関係の問題に取り組むのに向いているか聞かれたら、気でも狂ったかと聞き返しただろうね。)でも、これが、この仕事でいちばん重要なところだから学んだんだ。これが、いちばん途方もない挑戦や実りある結果を生むところだと分かったから学んだんだ。
3.
ってことはだ。(3)が一番深刻なところだということだ。いつも以上に無遠慮にいうよ。ほら、いま人事部の決めた迷路みたいな規則から自由でさ、いつもだったらものすごい機密指定がかかっている場所でしかいえないことを自由にいえるんだ。それと、ここの部分は、特に例の文章の著者に向けたものだ。
きみがしたことは、信じられないくらい馬鹿で有害だ。きみは、きみの同僚のかなりの部分が根本的にこの仕事に向いていない、政治的な理由でこの仕事をさせてもらっているだけだ、と主張する文章を会社の中で公開した。しかも、それを考えたり、内輪で言ってみるだけではなくて、企業全体でそれを正統化しようとする方法で表にした。だから、他の人たちは立ち上がって「おい、待てよ、それでいいのか?」と言う羽目になった。
ぼくはこのことはとてもはっきりさせておかないといけない。きみが書いたことがほとんど間違っているというだけじゃない。きみがしたことは、その会社にいる人々にひどい被害を与えた。そして、その会社の機能全体を無茶苦茶にした。そして、そうなることに気がつくことも、きみの仕事の一部だ。実際、それは他の仕事であってもまさにそうだろう。ぼくはもうその会社にはいさえしないというのに、ここ一日の半分は、いろいろな人と話して、きみが引き起こした無茶苦茶を掃除しなきゃならなかった。評判に与えた被害はいうまでもないけど、どれだけの時間と感情を動かす努力がこれにつぎ込まれたか、ぼくには想像もつかない。
そして、これのきみへの影響だ。ぼくがきみと一緒に働くように誰かを配属するとき、良心が痛むことをきみは分かってくれただろうか。女性を配属して、この状況に対処させるようなことはとてもじゃないけどできない。きみと働かなきゃいけなくなったけっこうな人は、きみの顔面に向けて殴り掛かるだろう。たとえ、似たような考えの人たちを集めてチームを作れたとしても、そのチームと協調してくれる人なんていないだろう。きみは教科書にあるような敵意に満ちた仕事環境っていうのを作り出したんだ。
もしも、例の文章を書いてなかったとしたら、もしかしたら、きみが順風満帆の経歴を歩むためにはどういうことができなきゃいけないか、きみとぼくは話し合ったかもしれない。それこそがまさにきみが「女性の技能」と類型化したことだ。でも、いまとなってはまったく違う話をしなくちゃならない。きみがどんなにコードを書くのが上手だとしても、そんなことができるひとは掃いて捨てるほどいる。きみの行動によって、きみが同僚たちに与えた悪い影響は、そんなことよりも遥かに重大だ。
考えを議論することの重要性について書いてたね。「ぼくたちは Go 言語を主に使うべきだ、とぼくは思うんだ。」と「ぼくの同僚の1/3は、生物学的にこの仕事が向いてないか、そうじゃなかったとしても、向いているとおのおのすべての人が心から納得するまでは、向いてないとして扱うべきだ、とぼくは思うんだ。」の違いを学ばなきゃならない。すべての考えは同じじゃない。ある種の考えについての会話は、最低限の正統性すらない。
もしも、このことで疎外されたと感じるなら、もしも、きみの物の見方が技術畑で基本的に歓迎されないもので口に出せないようなことだと感じるなら、まあ、その通りとしかいいようがないね。この見方は、発症した組織を根源的に腐らせ、人々を追い出すものだ。こういう見方をする人を受け入れて、こういう見方に特化していないような組織はぼくにはちょっと思いつかない。もうしわけないけど、長い将来に渡って、これはきみにとって深刻な問題として残るだろう。でも、ぼくたちの会社は、すべての人にとっていい環境を提供しようと全力を尽くしている。もしも、だれかがそれを妨害していることが分かったなら、解決策はかなりはっきりしているね。*3
ここにこんなことを書いたのは、ぼくがもうあの会社に所属していないから、どんなことでもおおっぴらに言えるからなんだ。でも、これは、絶対にはっきりさせておきたい。もしも、きみがぼくの指揮系統に入っていたら、(3)のすべての内容は「これは容認できない」という一文に書き換えられる。もしかしたら、一つ上の段落の中身はつけるかもしれないけどね。(3)の内容は、きみ、きみの上司、人事部と法務部のだれかが出席する会議で聞かされることになる。建物から警備員によって連れ出され、私物は後ほど郵送すると告げられるだろう。あと、それから、きみは、これは「自由な公開討論の名のもとになされている」と思っていて、上に書いたような重大な結果にはなにひとつ気がついていない。このことは、なおわるいことだ。せめてましなことじゃない。
*1:訳者注: 残響室は、外の音が入ってこなくて、中の音が漏れずに延々と反射し続けるように作られた、音響実験や録音をするための部屋のこと。外側のイデオロギーが遮断されていて、内側ではイデオロギーが延々と聞こえ続ける様子をエコーチェンバーに喩えて、単一イデオロギーに染まりきった場所、という意味。
*2:だいたいだけど、すべてではない。例の文章の中にあるとても大事な本当のことは、男性の性的役割はとても柔軟性にかけ、これは特徴ではなく、バグだということだ。実をいうと、これこそが、この文章にあるその他すべてのことを書かせた核心部のバグなんじゃないかとすら疑っている。でも、例の文章の残りの部分は、基本的に、このバグがあることを最適にするにはどうしたらいいかについてだ。バグを最適化しちゃ駄目。直しましょう。
背景
Google の社員が、社内で「社員の多様性を重視するのはよくない、男女は生物学的に違う」という内容の文章を公開し、それが社外にリークされたために、世界中で問題となっている。また、その社員は2017/08/07の月曜日に解雇されたらしい。
ところで、ヨナタン・ザンガーは、素粒子理論物理学出身のグーグル元幹部(主席技術者)で、おりしも、例の文章が問題になる直前に辞めたので自由にいいたいことが書けると下の文章を公開して話題になっている。ヨナタンに連絡して、翻訳と公開の許可を求めたところ、快諾していただけたので翻訳した。なお、原文が書かれたのは2017/08/06の日曜日であり、解雇の前である。
翻訳: http://d.hatena.ne.jp/nuc/20170809/p2
原文: https://medium.com/@yonatanzunger/so-about-this-googlers-manifesto-1e3773ed1788
小保方論文の本当の憂鬱
小保方晴子さんが iPS 細胞を超える STAP 細胞という大発見をしたとして、2014年1月にマスメディアの寵児となった。しかし、翌月には、論文に怪しい箇所があると雲行きが怪しくなり、そろそろ論文撤回*1が決まりそうだ。
その論文の疑惑については、小保方晴子のSTAP細胞論文の疑惑 というページが詳しい。ただ、図や文章がコピーというようなところは誰でも分かるように書かれているが、致命的な箇所は専門家と思しき人の掲示板への書き込み*2の引用しかない。だから、誰にでも分かるように解説してみたい。
まず、生物は細胞からできている。細胞の材料はかなりがタンパク質だ。タンパク質の設計図が、遺伝子。人間の遺伝子は3万くらいしかない。
一つの遺伝子から作られるタンパク質はだいたい一つに決まっているのだけれども、大きな例外が免疫システム。免疫システムでは、外来からのいろいろ侵入物を認識するために、いろんなタンパク質に結合できる様々な形の"抗体"を作るんだ。抗体ももちろんタンパク質でできている。
この多様な抗体を作る原理を説明したのが、利根川進がノーベル賞に選ばれた業績、V(D)J遺伝子再構成(遺伝子再編成)というやつだ。
遺伝子再構成っていうのは、要するに、本来必要なよりもずっと長い遺伝子を用意しておいて、無駄なところを後で捨てると、捨て方によって、色々な種類ができるということ。
例えば、英文で {I You He She We} {ate drank killed} {books chairs tables trees}. というのを考えると、これだけでも5*3*4=60通り作れる。
これが、免疫細胞ができる(分化する)ときに遺伝子に起きているというのが遺伝子再構成で、それまでの常識を覆すものだった。1976年の話ね。
つまり、免疫細胞になる時に、ある遺伝子は、その大部分を捨て去ることで抗体のタンパク質を生み出せるようになり、その捨て方によって色々な抗体を持った免疫細胞ができるという話だ。
さらに、遺伝子再構成以外にも免疫細胞の種類を増やす方法があって、諸々合わせて、最終的に作られるタンパク質は10^18通り以上とかあるらしい。1キロ=10^3、1ギガ=10^6、1メガ=10^9、1テラ=10^12、1ペタ=10^15、1エクサ=10^18だね。
小保方さんの Nature の論文は、さらに衝撃的で、遺伝子再構成されたものが、元に戻る万能細胞になる*3って言っているんだ。酸につけるだけで。
これ、食いかけのゆで卵をお酢につけたら、生卵まるまる一個に戻ったみたいなものだよ。だって、遺伝子の大半は捨て去られてるんだもん。「過去何百年の細胞生物学の歴史を愚弄するものだ」ろ?
「誰も信じてくれなかったことが何よりも大変だった」というか、信じないよね。これが本当だったとすると、元の遺伝子がどこかに隠してあって、元に戻せるようになっていたこれだけ複雑な変化をしたものが、簡単に戻るように作られていた*4ということだから。
というわけで、実は、Nature 論文が出た直後から話題になっていたけれども、医者みたいな生命科学のユーザーは大絶賛して夢が広がりんぐしていたけれども、近い分野の研究者は追試がなされるまでは信じないと言っていた人のほうが多そうだった。そりゃ、マスコミにマイク向けられたら、そんなこといわないけどね。「誠に驚くべき内容で、続報に期待する」とかいうでしょう。揉めたくないもん。
Nature は今でこそ権威があるけども、商業誌でもともとはゴシップ誌に近い。とある助教は、Nature に出たということは嘘だと冗談めかして言っていた。別にいいんですよ。論文っていうのは、研究者同士のコミニケーション手段だから、別に論文がでたところでどうということはない。あと、査読だけど、一流研究室だと、論文を出していいという教授の許可のほうが大変で、そこを通れば査読にはまず落ちない。まあ、だから、Nature に出た程度で信じない、ってことね。
ここまでが前提で、その捏造が疑われている箇所というのが、STAP ができている直接のSTAP 細胞が免疫細胞由来である証拠とされているんだけれども、よく考えると、とんでもなく不思議。
簡単にいうと、「細胞の中の特定の遺伝子だけ選んで、その長さの分布を測る」ことができる技術があるの。それを使うと、
{I You He She We} {ate drank killed} {books chairs tables trees}. <- 長い
She killed tables. <- 短い
と、細胞内にどういう長さの遺伝子があるかが分かる。
論文によるとね、遺伝子再構成の前(ES 細胞)の遺伝子の長さをはかると、長い。遺伝子再構成後(免疫細胞)の遺伝子の長さをはかると、短い。そして、それを酸で処理した STAP 細胞は一部だが長い短いものと長いものがある。だから、これは、STAP 細胞が一部万能細胞に戻った免疫細胞由来である証拠だ、っていうんだ。ところが、実はこの時点で何かがおかしい。
というのもね、遺伝子のセットは両親から一組ずつ受け取る。だから、同じ遺伝子が二つずつあるんだ。これを対立遺伝子とかいう。対立遺伝子の組の挙動は、さまざまだ。たとえば、優性・劣性というのは、中学でやるね。つまり、優性な方の形質がでる場合がある。血液型のB型とO型の遺伝子を持っていると、B型が優性なのでB型になる。これが、A型とB型だと、両方の形質が出てAB型になる。
でも、抗体の場合はそうはならないんだ。対立する片方の遺伝子が発生の途中で使えなくなる(不活化する)んだ。同じ現象は、たとえば、三毛猫の毛の色でもみられる。「茶色で上書きする」遺伝子と「何もしない」遺伝子というのが対立遺伝子なんだ。他の遺伝子が、「黒地に白ぶち」なネコにしようとしているときに、「茶色で上書き」と「何もしない」が一つずつあると、一方が細胞ごとにランダムに使えなくなる。だから、「黒地に白斑」と「茶」の部分が体中にできる。これが三毛猫。遺伝子が使えなくなるといっても、捨てられるというよりは、鍵がかかる感じだ。オッドアイも同じ原理だ。
つまり、話を戻すと、「免疫細胞の遺伝子の長さをはかると、短い」っていうこと自体がおかしいんだ。対立遺伝子の一方は不活化しているから再構成されず、元の長さのまま、もう一方は抗体を作るために遺伝子再構成をうけて短くなる。だから遺伝子再構成後の免疫細胞の遺伝子の長さは「半分は短く、半分は長い」という結果が出るはずなんだ。このことは、免疫細胞の遺伝子再構成を知っている人なら、当然のことなんだ。ところが論文では長い方の存在がないんだ。
それでね、ここのところ、みんな悩んでるの。これ捏造だとしても、杜撰すぎる。なんで消しちゃったの??
しかも、同じ論文の別の figure では、免疫細胞の結果は、「半分は短く、半分は長い」になっていて、消されていないの。
一番素直に解釈すると、免疫細胞が全部短い遺伝子で、STAP 細胞に長い遺伝子が含まれていると、STAP 細胞の遺伝子の長さが元に戻ったという解釈になるから、そのように解釈できる余地を残すために消したということになるのだけれども、さすがに大変が捨てられた遺伝子が元に戻るというのは荒唐無稽だ。確かに、「半分は短く、半分は長い」免疫細胞が「半分は短く、半分は長い」STAP 細胞になっても、STAP 細胞が万能細胞になった証拠ではない。でも、そんな常識的なところを捏造してもバレるに決まってるよ。
でも、ここから、少なくとも一つのことが分かるんだ。
小保方さんだけじゃなくて、あの論文の共著者8人は全員「免疫細胞の遺伝子再構成」で対立遺伝子排除が働いていることを知らないってことだ。恐らく、問題があったのは小保方さんだけじゃない。
*1:撤回されそうな論文: Nature 505, 641–647 (30 January 2014) doi:10.1038/nature12968 Stimulus-triggered fate conversion of somatic cells into pluripotency | Nature
*2:問題の箇所はここである。「免疫で遺伝子やってるやつならわかる。TCRのDNA解析でレーン3のGLにバンドがない件は全然おかしい。……著者は意図的にGLがバンドがないように見せることによって、分化後のT細胞を用いたことを示そうと細工したようだ。しかし、TCRbetaでは対立遺伝子排除が働くので片方の相同染色体ではGL型の配列をもつはず(よってJEM論文のようにGLにバンドが出るはず)。それを知らずに馬脚を現した。」
*3:元に戻るとしたのは、推測が混じっていました。この推測は、画像の捏造のされ方や後出しのプロトコルと整合的に解釈したものですが、そこまでは書かれていませんでした。議論をしている最中に混同したようです。
*4:同上
祖父
先日、祖父が亡くなった。
家族と自由と学問を愛した人であった。
愛妻家であり、哲学者であり、教育学者であった。
物事をよく見据えているからこそ、なにごとも肯定的に捉える人であった。
あのまなざしが、共にありますように。
言語雑感
Perl:とりあえず、怪しいことをしたくなると唱える。一行しか書けない。読めない。
Bash:気がついたら出来ている。これを使って管理。
Ruby:10行から100行くらいまではこれでいくようになった。
Python:好感がもてる。
C++:標準語。お互いに意思疎通するときに使う。たまにネイティブがいると流暢すぎてよく分からない。template は邪悪。
asm:祭祀用。吟ずるもの。
Java:System.out.println な言語。アプレットのため展示のために書いてた。
Haskell:電卓として最強。エラーメッセージが分からん。計算量見積もり間違う。
PHP:これは言語じゃない。
OCaml:300行超えるときはこれで書くらしい。まだ、そんなに長いものを"計画的に"書いたことはない。
C:システムとしゃべる用。あとは数値計算に。
Fortran:知らないけれども、数値計算にいいらしい。嫌われているらしいね。
Scheme:Scheme で min-scheme を作ったときには感動した。
BASIC:すこーぷすこーぷすこーぷ。
Javascript:手元に notepad と IE しかない緊急事態にも使える。あとは、Greesemonkey でごにょごにょ。
haskell の fib は遅くない
http://d.hatena.ne.jp/nishiohirokazu/20100622/1277208908
に驚愕するような話が書かれていて、要するに、
fib = 1:1:zipWith (+) fib (tail fib)
は遅いと。何に驚愕したかというと、3点しかとらずに、「O(N ** 2.6)である。」と結論づけていることだ。空間使用量が O(N**2) で増えていくコードなのだから、そんなの空間計算量が一時的に影響与えたと考えるのが自然だろうに、その可能性も潰さずに原因も考えずに結論を出している。そんな適当な実験をするんだ、ということだ。
ランダウの記号 O(f(n)) は n が無限大でどのような関数で押さえられるか、についての表現だ。なので実行時間を論じているときには、n が 10^6 みたいな小さい値の周辺でフィットする行為は実行時間のオーダーを推測する補助手段でしかない。
fib !! n は、理論的に実行時の動きを考えると O(n**2) になる。
遅延評価ではサンクをつくるがそれは定数倍しか時間に影響を与えないのは当然だと思う。
import System import List fib = 1:1:zipWith (+) fib (tail fib) main = do args <- getArgs print $ (0 *) $ (fib !!) $ read $ args !! 0
はじめにとったデータ。
| 10000 | 0.06 |
| 20000 | 0.16 |
| 30000 | 0.28 |
| 40000 | 0.44 |
| 50000 | 0.66 |
| 60000 | 0.9 |
| 70000 | 1.23 |
| 80000 | 1.62 |
| 90000 | 2.1 |
| 100000 | 2.56 |
| 110000 | 3.18 |
| 120000 | 3.92 |
| 130000 | 4.48 |
| 140000 | 5.31 |
| 150000 | 6.21 |
| 160000 | 7.24 |
| 170000 | 8.33 |
| 180000 | 9.27 |
| 190000 | 10.56 |
ここまでは、綺麗に O(n**2) にのっている。
perl -e '$i=10000;while($i<10000000){print "$i ".substr(`/usr/bin/time -o /dev/stdout -f "%e %U %S %t %K %p %F %R %c" ./a.out $i +RTS -K200M`,2);$i+=10000;}' | tee out.txt
(ただし、定数はこのままではない)
| 10000 | 0.03 | 0.01 | 0.00 | 0 | 0 | 0 | 0 | 797 | 11 |
| 20000 | 0.08 | 0.06 | 0.00 | 0 | 0 | 0 | 0 | 836 | 16 |
| 30000 | 0.19 | 0.16 | 0.00 | 0 | 0 | 0 | 0 | 937 | 37 |
| 40000 | 0.33 | 0.30 | 0.01 | 0 | 0 | 0 | 0 | 1277 | 50 |
| 50000 | 0.50 | 0.45 | 0.01 | 0 | 0 | 0 | 0 | 1297 | 83 |
| 60000 | 0.81 | 0.71 | 0.02 | 0 | 0 | 0 | 0 | 1572 | 137 |
| 70000 | 0.99 | 0.93 | 0.02 | 0 | 0 | 0 | 0 | 1978 | 75 |
| 80000 | 1.32 | 1.27 | 0.02 | 0 | 0 | 0 | 0 | 2270 | 53 |
| 90000 | 1.75 | 1.70 | 0.02 | 0 | 0 | 0 | 0 | 2271 | 46 |
| 100000 | 2.19 | 2.15 | 0.02 | 0 | 0 | 0 | 0 | 2564 | 25 |
| 200000 | 11.23 | 11.15 | 0.07 | 0 | 0 | 0 | 0 | 4398 | 32 |
| 300000 | 30.13 | 29.99 | 0.13 | 0 | 0 | 0 | 0 | 6782 | 68 |
| 400000 | 63.98 | 63.55 | 0.22 | 0 | 0 | 0 | 0 | 8004 | 739 |
| 500000 | 114.39 | 114.01 | 0.33 | 0 | 0 | 0 | 0 | 9736 | 706 |
| 600000 | 180.20 | 179.69 | 0.44 | 0 | 0 | 0 | 0 | 11987 | 892 |
| 700000 | 270.16 | 269.50 | 0.59 | 0 | 0 | 0 | 0 | 13974 | 1217 |
| 800000 | 409.71 | 408.42 | 0.74 | 0 | 0 | 0 | 0 | 15703 | 3437 |
| 900000 | 579.54 | 578.00 | 0.93 | 0 | 0 | 0 | 0 | 16923 | 4353 |
はじめは O(n**2) にのっているが、3*10**6 あたりからわずかにはずれる。ここをとりだして O(n**2) じゃないと騒いでたって事だね。
遅延評価だと(正格評価のつもりでいると予想しないところでメモリを食う、ので、メモリを食うとGCの影響やメモリ階層の影響がフクザツなので)実行時間が読みづらい、というのはあると思う。けど、実行される演算の回数は、必要な演算は結局最後には全部呼ばれるので、深く考えず普通に数えればok