俺はLindaたちがなにをあそこまで思いつめてRailsGirlsを始めたか完璧には理解していない(し、そもそも「完璧な理解」って存在するのか?)が、ひとつ理解しているのは、RailsGirlsはべつにRailsやりたい女子じゃないという点だ。Railsはたまたまそのへんに転がってたからチョイスしただけ。本当のゴールは女性へのツールとコミュニティの提供を通じて、在野の女性のアイディアを実現する事にある。不勉強で日本の事情はよく知らんけど、本家はそういうことになってる。だから本当にRailsGrilsのRailsってのはウィキリークスのWikiくらいどーでもいいんですよ。今後たとえばRailsいけてなくねってことになったらRails捨ててexpress.jsなりに移っても、RailsGirlsのミッションはいささかも揺るがない。
RailsGirlsってのはアファーマティブアクションですよ。たとえば性別逆転して「男性優先、女性は男性同伴のみの場合のみ可であるRailsBoys」とか考えてごらんなさい。だいぶ醜悪な事態じゃないですか。ということはつまり、そこにジェンダーによる構造的なギャップがある。だからこそ解消しようとするのは重要で、そのための具体的なアクションというのはあるよねってこと。ともかくもRailsGirlsが成立してる背景には女性が性別により不利益を被る構造というものがある。なきゃただの男性差別ですよ。俺はRailsGirlsに(単独では)参加資格ないけど、それはわざわざRailsGirlsに参加するまでもなくすでに俺が十分に社会から恩恵を受けているからで、だから俺なんかよりもっとRailsGirlsに参加すべき人が参加すべきという理論で、これはまったく正しい。
大変残念ながらそのへんがJS Girlsでは後退してるように見えるんだよな。
わりと色々調べてみたけど結局JS Girlsがなにをどうしたいのかが分からんわけです。どうやら男性は困ると言われていることは分かるんだけどね。じゃあ女性があつまって何したいの? キラキラしたいだけなの? というのが見えてこない。たんに盛り上がればいいの? それおらが村にも嫁さ来てくんねえかなとどうちがうんだ?
勘違いしてほしくないのはべつにだからJS Girlsやめろとかじゃないですよ。大いにやればいいとおもう。ただちょっと今のままだと「たんに男性を排除してる」ようにしか見えないぞと。きっとダイバーシティって排除とは真逆の方向だと思うんで。もっとちゃんと広報すべきなんじゃないですか。外野からは観測できないところではそういう議論あるかもしれないけどさ。今後どういうふうにしていきたいのかっての、ちゃんと公表しといてくれたほうがいらぬ誤解を生まなくて済むよ。
で、もしそんな深く考えてませんでしたっていうなら、Girlsとか安易に言っちゃうのはちょっと迂闊すぎると思います。
最初にめどい言い訳をせねばならぬ
- 俺は江島氏ともきょん氏とも面識はないですが、お二人ともが俺のことを知ってることを俺も知ってる程度には狭い業界であり。どちらかに肩入れしたいわけではないです。喧嘩したいわけでもないです。
- 普段あまりここでは言及しないですが俺は今の仕事としてはテストを書いたりテストを実施したりする係をしてノリクチをしのいでおり、いわばテストは本業ですので、テストに言及することは今現在の同僚に対して意図しない受け取られ方をする可能性があるので困るので、それもあって普段はここではあまりテストの話はしないわけだが、だからと言って沈黙を破ってテストの話をするのが同僚に対して含みがあるというわけでもないです。
- とはいえ俺は大学等で真面目にソフトウエア工学の講義を受講したことがなく、経験と勘と昔取った杵柄だけで食ってるので、そういう意味では若干の後ろめたい気持ちもある。
で、テストって何なん
俺が現職に転職してきて一番びっくりしたのはなんといっても、俺は会社に一円たりとも入れてないのに会社からは俺の口座に何十万も給料が振り込まれてくるっていう驚愕の事実なわけですよ。なんじゃこりゃと。それまで前職では受託開発でしたからね。受託開発ってのは、人月単価だから、俺が働くことによってある程度毎月会社が儲かって、それが俺の給料の原資になるわけです(そこには入金まで数ヶ月のディレイがあるがまあそれはテクニカルな話で本質的ではない)。だから、俺の給料がなぜ払われてたかっていうと、それは俺と直接連動してお金が動いてたからや。明確ですね。でもテストはそうじゃない。俺がどんなに頑張って休日返上で働いても会社としては一銭も儲からない。じゃあなぜ俺の口座には給料が途切れることなく振り込まれているのか?
俺は嫌でも、テストの意味と価値に関して深く静かに思いを馳せずにはいられない立場になってしまったわけです。
テストで腹は膨れない
まあつまり、テストやったから儲かるとかないわけですよ。だから、きょん氏が「テストやらない理由がどこにあるか分からない」とか書いてて、正直はあ?って思う。そんなもん食えないからに決まってるでしょ。俺は社内で常にテスト書こうよって言いつづけてて、テスト書く理由を説いてるのに、テスト書かない理由がないってのは、だいぶ別世界に思えました。またこの部分は俺ときょん氏ですら見解の相違があるのに、起業家である江島氏とおれら従業員の断絶は多分相当あるだろうと思います。
で、じゃあ、テスト全然やんないですかっていうと、それはそれで違いますよね。テストエンジニアこのあたりを攻めるべき。なぜテスト書くのかと。
我々が必要としているのは止まらないソフトウエアじゃない。止まらない業務だ。
テストって、ものすごく巨視的な見方をすると投資なわけですよ。
- テストをすることであらかじめバグを見つけておく。運用中にバグを発見した場合の機会損失と運用コストをあらかじめ避けることができる。
だいたいここに収斂してくるイメージがある。だから、ぶっちゃけバグがあろうがなかろうが儲かってないプロダクトをテストしてもあんま意味ないっす。前提としてprofitableなプロダクトがあり、それの運用コストを圧縮したいねってときにテストは有効。
あとweb屋の場合はバグが出ちゃっても機会損失がまださほどでない瞬間にとっとと直すって戦略はありうるわけですよ。その点はリコールで会社が傾くような自動車の制御ソフトとかとは大いに違う。だからテストする費用対効果ってのはweb屋に限って言えば、だいぶシビアというのはその通りでしょう。
まあ上にも書いたとおり俺はソフトウエア工学の専門教育を受けてないのでこの項目はめっちゃ外してる可能性も結構あるのだが。
回帰テストを書け
運用コストの圧縮という面でいちばん重要なのは回帰テストです。一回テスト書けば毎回有効ってことにすればコスト圧縮は積分で効いてくる。だから本来は回帰テストを書きましょうねってのが一番重要で、たぶんそこはボトムラインとしてみんなやったほうがいい。あとになるほどスルメみたいに効いてくるからね。
だがこれが意外にねえ。ホワイトボックステストをやってると内部構造べったりに書いちゃってねえ。とくにC1カバレッジとか見だしちゃうととたんにねえ。「この分岐をこっちに通るようなテスト書かなきゃ」とかなっちゃうんだ。でもそれは本末転倒なのですよ。何と戦ってるのかわかんなくなっちゃう。これは俺もよくやってしまう失敗で、ひじょうに自戒的なのだけれど。
そういうテスト、ばかだなって言うのは簡単だけど、そもそも完璧な人はテスト書かなくてもそもそもバグ出さないって話もある。だからテスト書くってのはばかをおのずと内包してるので、それに向かってばかって言っても虚しさしか残らんという点は指摘しておくべきかなと思います。
テスターは最初のユーザー
テストしてると「あれこのプロダクト、クソじゃね?」っていう瞬間はやっぱありますよ。はばかられるので具体例はあげないけどさ。そういうのって本当に重要で、ようするに品質って何かって話。テストやってるとよく品質保証とか言うけどさ、それで実際やってるのって仕様と実装の乖離を見てるだけってのがほとんどじゃん。悲しいことに。でもさあ、もとの仕様がクソってるのってやっぱあるですよ。そういうときクソ仕様と乖離のないクソ実装が仕上がってQA終わり!っての、違うと俺は思う。
これようするにフィードバックの話ですけど、テストする段階まで来ちゃってるときに、これやっぱクソだわーっての声に出して言えるかどうかって大きいと思うんですよ。テスターはそのプロダクトを使う最初の人でもあるわけで。UXのおかしさとかに気付ける最初の人でもあるわけじゃないですか。そういうのきちんと拾っていければ、ただの防衛的なコスト圧縮だけじゃないテストによる価値の創出っての、ありうるんじゃないかと思います。ただのバグならエラー検知で発見できるかもしれないけど、リターンレートの低さの理由とか、そういうのですよ。離脱しちゃったユーザーに聞きようがないじゃん。
テストは意味がないってより、俺らが使いこなせてないだけってのが実状やと思います。
解題といえばおれのタイムラインにムーノーローカルの作り方流れてきたことない
三行で
教訓: 陰口は本人に聞こえない所で。さすがに名指しはまずい。
どういうパッチか
Rubyのオブジェクトサイズを変更(大きく)する。そのことにより第一義的にはCPUキャッシュミスヒットが削減される。副次的作用として大きくなった余剰の領域にデータを詰め込めるので中間構造体を減らしてメモリアロケーションが最適化される。それらの総合的な結果として全体に高速化する。
前史
とはいえこのアイディア、べつに最近涌いて出たものでもない。というか、俺がまだ大学院でNetBurstと戯れてたころの発想だから、かれこれ7~8年物だな。しかもこの間べつに秘密にしてたわけでもなくて、Rubyのオブジェクトって素数幅でいくなくね?ってのは、わりと口頭では折に触れて言ってたので、聞いたことがある人もいるはずかと。あ、じゃあそんなに長期にわたってなんで放置してたの、というと、1.8やってたからです。ええ。
でもね、実はこれ7~8年前だとまだ明確な理由があってNGだった。というのも当時はまだオブジェクトってスカスカで、いろんなところに隙間があいてたの。とくにFloatはひどくて
struct RFloat {
struct RBasic basic;
double float_value;
};
こうですからね。後ろ側が全然使われてない。これを、今回提案のように8word幅にすると、double(64bit)一個保持するのに64バイト確保することになってしまって、本来のデータの8倍ですよ。これはさすがに無駄いと言わざるを得ない。
この問題はささださんがflonumを導入したことにより解決のめどがついた。また当時問題視されていたBignum等も、後ろの余ってる所にデータが詰め込めるなら詰め込むっていうのが、主に田中さんにより実装されていて、今ではRubyのオブジェクトは、例外もある(Fileなど)が、意外に後ろの方までつまっている。このため、オブジェクトを大きくすることはそれらのつめる系のやつにとってもプラスになるはずという目論見があった。
実装
コアのコンセプトはそれこそ128秒で書けた。ちゅうてもまあ、7~8年と128秒ってのが実状だけどな。でもこれでハッピーかと思うと、そでもない。なんでかちゅうとですね、俺のしらん間にRGenGCとか入ってて、なんも考えずにオブジェクトいじるとぶっ壊れるんすよ。しかもRGenGCって世代別だから、壊れ方として、ライトバリア足りてない→markおもらし→生きてるオブジェクトが回収されちゃう系の壊れ方で。これはいかんかった箇所と死ぬ箇所が全然別になって超辛い。しかも俺のしらん間に入ったがゆえにRGenGCとか俺がよくわからん。しかもドキュメントない。というのをまずソース読むという作業が必要でやばかった。
プルリク読むと迷いもなくいっぱつがきで書いてるように見えますけど送信までにめっちゃrebaseしまくってます
Hash
オブジェクトでかくなる副作用でポインタ何個ぶんも隙間できるからハッシュの中身展開してそこに突っ込もうぜっていう話。前述のつめる系のやつと同系なのだが、これまではオブジェクトのサイズが小さかったためあまり意味がないということで実施されてこなかった。これが実はベンチマークの面ではいちばん効いてる。ようするにRubyってハッシュのアロケーションでわりと時間食ってたと。これは実際やってみて分かったことなので自分でも驚いた。
その他の細かいネタ
Githubはrubyの2級市民であるにもかかわらず最初にgithubに投げたのは完全に意図的。RubyにおいてはML読んでる奴はたくさんいるが、コードまで読む奴はほとんどいない。が、にもかかわらず、ごく少数のコードまで読んでくれる人は絶対いる(今回で言えばEric Wongが読んでくれた)。MLでどうでもいいPR合戦をするのはそういう本当に大切にしたいメンバーとのやりとりにとって邪魔ゆえ、あえてPRはMLの外でやるという戦略だったわけ。これはうまくいったと思う。今のところMLは密度の濃い議論ができている。
Valgrindでヒーププロファイルとれるじゃんと思ったところまでは正しかったが取るだけ取ったものを出力する方法がないのは閉口した。スクリーンショットしかないというのはいかがなものか。
Haswellの真の実力を解き放つ設定が分からず苦労した。定格1.8GHzでturbo boost時3.0GHz(1.6倍!)のはずなのだがi7zで見ても常に定格っぽく…… 結局それはACPI経由でコマンド叩き込まんと開放されないということのようだった。
おれはzshというシェルを常用しているが、たとえばこのシェルにはヒストリを際限なく記録しつづける、という、たったそれだけの機能がない。その程度の機能もないのにzを名乗るなと思う。ここから得られる教訓はやはりDQNネームは良くないということだ。実状に即した名前をつけよう。
たとえば俺が「タバコ吸わなくても生きていけるしタバコない人生考えられないとかどんだけ人生ちっちゃいの?お前」っていえば深く共感してくれる人が多いのに、タバコをiPhoneに置換するだけで激昂する人が多いあたり、iPhoneに手を出してしまうとヤバいって感じしかしませんよね。
testingcasual 出張入っちゃって出れなくなって残念なんですけど、まあなんというか、こう、自分としても普段は「ちゃんとテスト書きなさいよ」とか言っちゃうほうの立場なわけで、お前がそれを言うかと言われるとぐぬぬって感があるのをなんとか許していただくとすると、「ちゃんとしないテスト」っての、もっとやるべきだとおもうわけですよ。っていうと、やっぱ語弊があるので、多分誤解されるんだろーなー、っての思いつつもさらに言うと、そりゃちゃんとテストしたほうがいいに決まってますよ。いいに決まってるんだけど、だからといってちゃんとテストできないときに全然テストしないのは、やっぱ、やらないくらいならちゃんとしてなくても多少でもやったほうが断然いいんですよ。完璧な家事が存在しないからって家事放棄するのは違うでしょ。それと同じですよ。もっというとじゃあ逆にちゃんとしたテストってなんやねん、って、実はさほど自明じゃない。そこでちゃんとしないとと思ってちゃんとしようと考え込んだ挙句手が動かないくらいなら、ダメでもかまわんからとりあえずなんか書けって思うわけですよ。そりゃ、ものすごくたくさん見てきた中で、書かない方がマシだったテストとかいうのも実際たまにはありますけど。でもそんなの結果論だよ。シュート外すことができるのはシュート打った奴だけってこと。
テストというと、とかく「正しく」とか「きちんと」とか言い出しがちだし、その気持ちは分るし、自分でも普段はそういうこと言う係ではあるのだけれど。でもあえて言う。テスト書かないくらいなら、「ちゃんとしないテスト」を書きましょう。
あえてアマゾンのリンクは貼らないので会場で会おう
たのしいRuby 第四版
- これを買うべき人: 全員
- ひとこと: ついにRuby 2.0の時代が本格的に始まったことを宣言する決定打的一冊であり、必携。今後「情報がないから2.0は不安」などとうそぶくことはこれで不可能になった。
テストから見えてくるグーグルのソフトウエア開発
- これを買うべき人: テストを日常的に書いている人と、テストを書く習慣がない人
- ひとこと: これはずばり俺が読みたいので買います。こちらからは以上です。
白と黒のとびら
- これを買うべき人: 「記号と再帰」がおもしろかった人
- ひとこと: まあなんていうんですかね、形式言語とか好きな人って結局そっちに道を踏み外しちゃうきっかけってテングワールだったりするわけじゃないですか。だからこういうふうに攻めてくるのって変化球のようでいて実はど真ん中だと思うんですよね。
型システム入門
- これを買うべき人: RHGがおもしろかった人
- ひとこと: 久々に本気手加減なしの全力投球本が来たってところ。これに「入門」とつけるセンスはさておき、内容はといえば大学院レベルなので流し読みではなかなか辛い。そういうのが好きな人にはたまらない。ええ。1章だけですでに価格分の価値はあります。
講座ITと日本語研究4 Rubyによるテキストデータ処理
- これを買うべき人: 俺とうささん
- ひとこと: 数ヶ月か1年くらい前にIRCで話題にしてた本! なぜ入荷している… これはRubyプログラムとして読むべきものは書いてなくて、日本語研究が好きかどうかでしかない。なので好きな人だけ買えばいいです。
プログラマの考え方がおもしろいほど身につく本
- これを買うべき人: じつはプログラマこそ読むべき
- ひとこと: 俺が知ってる中でこれにもっとも近いのは「エレガントな問題解決」あと「いかにして問題をとくか」。ようするにプログラマの考え方とは、そういうことだと分かる。そして意外に実践されていないので、ぜひ身につけるべき。
インフォメーション
これについては山形浩生の書評があるので自分が何か付け加える必要性はあまり感じない。
進化するアカデミア
- これを買うべき人: 表紙に騙された人
- ひとこと: 進化と呼ぶべきかは分らないが、敷居は確実に低くなってきてるよね。研究で食べようとさえ思わなければいいだけで、すごい時代になったもんです。
その他
まだまだたくさん入荷してるっぽいけど時間がないのでこのへんで。多分、たとえばオライリーのとかはガイド以前の問題として全員全種もれなく購入されることと思いますので、そういうのはまあ、言うまでもないかと思います。けど誰の趣味が反映されてるのか知らんがRubyKaigiでは案外人文系が売ってる(何年か前にダールグレン置いてたのはびびった)ので、そういうのもちょっと読んでみるとよいですよー
People blame me for merging others people changes to fast. But this merge button looks just to tasty. It’s kind of a sin to not use it.
nonnon21:
CiNii 論文 - Tumblrにおける情報の伝播経路に着目した記事の特徴付け
effective-tumblr:
少し前に論文「マイクロブログの文脈付き投稿情報の体系化に基づく重要ユーザ推薦と情報集約支援への応用」を紹介しましたが、これの参照している先行研究である表記論文を、共著者のkiyoyaこと山口清弘さんから送っていただきました。論文は次のような背景認識から始まっています。
オンラインコマースにおけるコア技術となっている,アイテムのクラスタリングや推薦においては,アイテムをどう特徴付けるかが,その結果を大きく左右する.ここで,記事の特徴付けとは,記事を何らかの視点で数理的に表現すること,および,それに基づいて記事同士の類似度を算出することから可能であると考える.
統計学を知らない僕なりに読み進み、砕いてみます。最近はニュースサイトでもオンラインショップ(eコマースサイト)でも「お勧め」をされることが増えてきました。これは、よく似た記事、よく似た商品をグループ化しておいて、そのグループ内の一つがピックアップされたら、別の一つを推薦してみる、ということをしています。でも「よく似た」と簡単に書きましたが、ある記事と別の記事、ある商品と別の商品が「似ている」というのは、どういう意味で、どうやって決めるんでしょう?
一般に推薦システムにおけるアイテムの特徴付けには,誰がどのアイテムを評価したかという共起関係用いられる傾向にある.Tumblr のような,記事が人の間を伝播していくネットワークにおいては,共起関係のみを考慮するよりも,記事の伝播経路を用いた記事の特徴付けの方がより有用であると考えられる.
一般的に広く使われているのは、「この商品を買っている人はこんな商品も買っています」という情報を活かした判断です。AとBとCはよく同じ商品を買っている。つまり彼らは好みが似ているということだ。そして彼らの好みにあった商品が二つあるなら、それの二つは似ているということだ。こういう判断が下せれば、二つのうち一方を買った人には、もう一方も勧めると買ってくれそうだ、と考えられることになります。
こうした「誰と誰と誰が」という関係、共起関係で似ている度合いを図ることもできますが、Tumblrではさらに「誰がいつ誰からリブログしたか」という時系列や伝播経路を考えることもできます。則のぞみ氏、山口清弘氏らはこれらを考慮したほうが、より妥当な(精度のよい)にている度合いを測れるだろうという仮設を立て、実際に実験して確かめています。
ここから実験方法と実験結果になると、数式と数値が乱れ飛ぶ、私にはなんとなく程度には分かっても正確なところはギブアップの世界に入るので割愛。いきなり考察のうち、特に面白かった、木構造、順序指標を考慮した結果を。
カット率6割から,順序指標が共起指標に比べて有意に高い再現率となった.これは,共起指標では,カット率の増加に応じて再現率も下がっていくが,順序指標では,カット率6 割から8 割の間で再現率がほぼ変化しないことによる.この理由として,Tumblr においては,ある記事を誰が最初の方でリブログしたのかという,最初の方の順序が,後の伝播を決定付ける重要な要因になっていることが考えられる.Tumblr においては,特に伝播の初期における順序を考慮することが有用であると言える.
言い換えれば、「誰と誰と誰が」という共起関係に基づいたアプローチでは、興味を示す層のうち実際にリーチできた層が減るほど、残りの人たちを推測する精度が悪くなります。ところが「誰と誰と誰がそれぞれいつごろ」という順序を指標に入れると、5割を切ったあたりと2割まで減ったあたりで同等の推測制度が出ています。
もっと言えば、共起関係だけで考えていた頃であれば5割、多分アーリーマジョリティまでを観察してはじめて浮かんできた潜在顧客層が、木構造における順序にも注目することで2割、多分アーリーアダプタぐらいを観察すれば浮かんでくるということです…だと思います。もちろん「マイクロブログの…」もこの論文も、Tumblrのような「リシェアの経路と時刻が可視化された」世界だからこそ役立つ、ある種のニッチな世界向けのアプローチといえるでしょう。でもニッチだったそのリシェア・ワールドが、いまやTwitterやFacebook、そしてGoogle+へと領地を拡大しています。
おそらく「バイラルでは経路が重要」という考え方は新しくないでしょう。ですが購買層という古典的な視点でも、つい先日、4,500台の自販機から集めた2億件のビッグデータをもとにすることで新製品が生まれたことが報じられました。現在(※’12/01/27)165億件強のTumblrの投稿合計数から経路情報を調べ上げると、そこにはまた新しく見えてくるものがありそうです。そしてオンラインコマースにおけるリコメンドを背景に上げたこの論文は、やっぱりそこを睨んでいるんだろうな、と思います。
それが来た時に、その手法に先鞭をつけ、かつデータを総なめするのではなくある程度小規模なサブセットで代替したときの精度に言及したこの論文は、結構面白いポジションにあったりしないかな、と思いました。
(via re-pairofwheels-deactivated2015)