あすたぴのブログ

astap(あすたぴ)のブログ

個人の開発環境について

プライベートではなく、仕事で開発をする際に、

他のところは、どのような開発環境を構築しているのだろうか。

技術的な環境と、仕組み的な環境にわけられると思うが、

技術的な環境

  • ローカルのWindowsMacに構築する。
  • vagrant等のVM環境をローカルに乗せてその上に構築する。
  • docker等のコンテナを用いて、その上に構築する。
  • AWS,GCPインスタンスを立てて構築する。

仕組み的な環境

  • 全員が同じ環境になるようにしている。chef等のプロビジョニングツールで用いて容易に構築が可能。
  • 手順だけ決まっていて、それぞれで構築する。
  • 各自適当に構築している。

技術的な環境で言うと、割りとバラけてるような気がする。

最近ではdockerが多くなってきているのかな?

仕組み的な環境で言うと、そこそこしっかりしたところはプロビジョニングツールを使ってるだろうな。

自分の話し

これ。

  • vagrant等のVM環境をローカルに乗せてその上に構築する。
  • 各自適当に構築している。

あんまりよくないですね。

もともとは、

  • ローカルのWindowsMacに構築する。
  • 手順だけ決まっていて、それぞれで構築する。

だったんだけど、

ローカルに構築するのが好きではないので、

勝手に自分で環境を構築した。

自分用のvagrant環境と用意して、itamaeを書いて、構築できるようにしている。

個人的な考えとしては開発環境は、 人によってやりやすさが違うと思うので、

自分で構築してトラブルが発生しても自分で解決するのであれば 自由でいいと思っている。

Activerecordのパフォーマンスチューニング

背景

仕事でactiverecordを使用していて、

複数のテーブルのデータを返す必要がある場合に、

レスポンスが一気に遅くなったために調べていた。

N+1問題を解消

まず、最初にあまり気にせずにN+1を行っていたので解消した。

解消方法としては、includes, prelaod、eager_loadがある。

今回はjoinして絞り込む必要がなく、

複数のクエリで単純にセレクトをしたかったのでpreloadをしていた。

これを行うことによって、クエリの発行数が抑えられた(もともと、大した量ではなかったけど)

ボトルネックを明確にする。

しかし、preloadを行っても性能はあまり改善が見られなかった。

ボトルネックを明確にする為に、

rack-profilerを使用し、

細かく各処理の時間を見ていたが、

どうもロジックと全体の時間が合っていない。

activerecordでセレクトし、生成されたオブジェクトのループ全体の時間と

ループ内の処理の時間を足した時間が一致しない。

ループ時のループ変数(って言葉ある?)を生成するタイミングで時間がかかっているようだった。

Object生成のコスト

N+1問題の解消の為に、予めクエリを発行し、キャッシュしていくことが解決方法であるが、

そこで予め生成するオブジェクトのコストはN+1でクエリを発行するよりも重い場合がある。

多くをpreloadしたオブジェクトを each メソッド等でループする際に、

紐づくテーブルの情報もオブジェクト生成が行われる。

結果として、1ループあたりの、ループ変数の生成に時間がかかるようになる。

つまり、N+1のクエリ発行とpreloadのオブジェクト生成の時間はトレードオフになる。

結論

レコード数や関連するテーブル、オブジェクト生成数によって

何が一番良いかが変わるため、正解がない。

今回の場合は、preloadはしておきたいものの、

preloadしたいレコード数が決まっていた。(全てを取る必要がない)

そのため、 preloadで全レコードのオブジェクト生成のコストよりN+1のコストのほうが低くなった。

tips

オブジェクトの生成が必要なく、

セレクトしてきたデータのみが必要な場合は、pluckメソッドを使用することで

オブジェクト生成せずに、データが取得できる。

User.all.pluck(:id, :name)
[
  [1, 'hoge'],
  [2, 'moge']
]

みたいなデータが取れる。

DMM Cupに感動した

www.youtube.com

一昨日行われていた、DMM Cup っていうストリートファイター5の大会の決勝動画。

決勝が19歳チーム対プロゲーマーというのが感動した・・・。

格ゲーシーンはずっと、同じ人達が活躍していて、

ギルティギアなんて、10年以上前からTOPがほぼ変わっていない。

SF4も8年以上続いていたシリーズだったので、これもやっぱり上位はずっと同じ。

今回SF5はその状況をリセットするとうたっての発売だったが、

実質的にはほぼ変わらず前シリーズの強者がそのまま居座っていた。(世界大会では一部、海外の若手で強い選手もでてきている)

そんな中、日本でも今回のように、若手の強い選手がでてきてすごく嬉しい。(もうこの感想が老害

SF5はゲーム性が変わったとはいえ、

やはり強いひとはそのまま強くて、リセットって何?みたいに言われてたけど、

SF4はシリーズが続きすぎて参入障壁が高かった。

それがSF5で全員が一度同じスタート地点に戻るというリセットであればそれは正しかったんだと思う。

今、格ゲーシーン最高に熱いです。

EVOという7月末にアメリカで行われる大会はエントリー人数が4000人を超えて過去最高。

技術の選択について自分の考えを残しておく

何が良いのかを見極めるのは非常に難しいなって思っています。

  • 流行っているから
  • githubでスターが多いから
  • 日本語ドキュメント、または情報が充実しているから
  • google検索の推移

いずれも、技術選択の際の指標としてよく見ます。

指標の一つとして、という意味では問題ないと思っています。

でもこれって自分の目で見てないのでは?

他人(大衆)が選択しているから、それは正しい。(正しい確率が高い)

という考えだと思っています。

これだと自分の技術を視る目は養われることは無くて、

ずっと大衆に振り回されるだけだと思います。

技術を選択する際に、最近、私が考えているのは以下です。

  • その技術が解決しようとしている問題は何か
  • 別の技術と比べて何が違うか
  • 何が出来て、何が出来ないのか(何が得意で、何が不得意か)
  • (人気があるなら)何故、人気があるのか

  • 自分が解決したい問題は何か。

  • 本当に、それを使う必要があるのか。
  • 解決したい問題に対して、機能が多すぎたりしないか
  • 足りないなら、何が足りないのか

人気のある技術というのはそれが得意かどうかは別として出来る事が多いです。

出来る事が多いがゆえに、「こいつ1つで何でもいけるじゃーーーん!導入!」的な人気も多いと思います。

本当にそれが必要なのか。

機能が多いほど、リソース消費量が多かったり、 何か問題にぶつかったときの解決が難しかったり、 速度も遅いかもしれない。

これに関しては自分の持っているリソースや解決したい問題(プロダクトの目指す規模)など 色々な視点でかわっていく為、しっかりと考える必要があると思っています。

まとめると、

流行や噂に流されずに、しっかりと自分で考えていきたい。

です。