GYAOの窓際エンジニア 玉利です。
ベトナムオフショアだと、「ベトナムの東大京大クラスのエンジニアが安価で雇える」という売り込みを聞くことになります。
BEFORE & AFTER これがベトナムの誇る最新の画像テクノロジー???
それは正しくもあるのですが、猛烈に頭のいいエンジニアはやっぱり少なくて、日本とかわらない確率で普通のエンジニアがアサインされます。
それでいいんです。日本で働いても、できの悪い後輩のほうが人間味があって可愛いんですから。ベトナム人の若者、男も女の子もわかりやすい天然が入っていて、むっちゃくちゃかわいいです。
とはいえ、仕事は神聖なる金稼ぎの場なので、ベトナム生産といえども日本人からぎりぎりOKを貰える品質を目指さなければいけません。
相棒のベテランSE Nさんが本日分の検証結果を、私が退社したあとに社内Slackメッセくれました。会社携帯でメッセが読めてしまうので、あまりうれしくないのですが」
Nさん「今日上がってきた分、一通り検証しました。なんか一覧表示で大量のSQLが発生してるみたいで、むちゃくちゃ遅いんですが」
玉利「了解です。明日、NewRelicの使い方を教えます」
というわけで、何が問題なのか解析方法をNさんにおしえることになりました。Nさんはベテランなので古いシステムの担当を任されてしまう事が多く、今回のRails新規案件をコードを書かなくても楽しんでくれているようです。
Nさん「たぶん、joinしてSQLの回数減らせばいいんじゃないでしょうかね?」
玉利「ついでにRedisいれて、マスタ参照をキャッシュしますか」
Nさん「まず先にSQLをしっかり改善しましょう」
Nさんは私よりもソフト開発歴が長いだけあって、さすがの見識です。
実践 品質管理
Nさんに、パフォーマンス解析のやりかたを説明します。
私がやっているオフショアのPJでは、最初からmini-profilerとNewRelicを仕込んであります。これは日本側からgit pushします。
New Relic http://newrelic.com/
インストールは簡単、3分でできます。qiitaに大量に記事があるので省略します。
Rack-mini-profiler
http://railscasts.com/episodes/368-miniprofiler?language=ja&view=asciicast
これもインストールは簡単で、gemをdevelopmentグループに入れてあげるだけです。
NewRelic APMを開きます。
Trancactionsを確認します。案の定、遅いですね。どうやらrubyのコード(水色)に問題があるようで、sqlite(黄色)はほとんどコストがかかってません。
Breakdownを確認します。viewのどこかが遅いようです。
中を見ると、まだ作り始めたばかりなので変なコードは入ってません。うーん、レコードを回す配列のあたりが大きすぎるのかなぁ。
ここで、rack-mini-profilerの登場です。
SQLを確認。おお、この137sqlという回数はおかしい。ここもクリックできます。
どんなSQLが発行されてるのか、一覧で見えます。名前の表示のためにUser.display_nameを1行毎に検索してるんですね。そりゃ遅いわけだ。
ここまで探すのに、5分かかりませんでした。典型的なN+1問題でした。
仕事の基本は仕組みで解決
だいたい、こういうのを直感的にわかるエンジニアというのが今まで評価されてきましたが、いまではマネージャーが適切な測定ツールを用意しておけば、新卒に毛が生えた程度のエンジニアでもそこそこの打率を叩き出せます。いい時代です。
でも、今回いちばん恩恵を受けたのは、ニコニコしてるベテランNさんみたいです。
Nさん「いままでは原因探すの普通はあちこち追いかけて試行錯誤してだけど、これ(NewRelic)見れば一発じゃないですか」
腕の良いエンジニアの工数は再生産できないので、どうやらこの一件だけで数時間以上、数万円分は会社が得をしたようです。
ベトナム人はテキトーにガンガン作るので、片っ端からおかしいところを指摘していかないとあとで大変な目にあいます(日本人が!)。この手のツール武装なしにオフショア開発をするのは、お勧めできません。
※ NewRelicは、アカウントを作ってしばらくすると西海岸から英語の直電がかかってきます。落ち着いて「I really can't speak Japanese」と言って煙に巻きましょう。<冗談です。