らぼるてっく。

てっくてっく歩いてっく。

リモート開発で実現した僕のSemi-ultimate coding experience

開発体験がずば抜けて屋根をも突き破ったあと

こんにちは。PCが遅くて困っていたラボルの中垣です。

Remote開発って知ってますか?リモート開発は開発環境(コード、実行環境)をリモートサーバーに置くことでDeveloper Experienceを良くするものです。IntelliJのサイトに分かりやすい説明があるので見てみてください。

The ultimate coding experience for a remote world
-- IntelliJのサイト

Ultimate coding experienceほしいですね。でも僕の場合はPCが遅い問題を解決するため、ローカルPCの負荷をリモートサーバーに移すような環境を作りました。

背景

PCが遅かったんです。どのくらい遅かったかの例として、日本語をタイプしてから文字が表示されるまでに秒単位のラグがありました。Labolの開発環境のせいでPC全体が遅くなっているんじゃないかと考え、リモート開発を試すことにしました。

Labolではローカル環境で開発しているため、ローカルPCで色々動いています。

  • Docker container(MySQL, Redis, SQSなど合計で6個)
  • SpringのApplication server(3つ)
  • Nuxt server
  • Vue用のbrowser-sync

一つのプロダクトでこんなにたくさんのものが動いている理由は管理面、Web面、送金などでサービスが分かれているためです。これらのサービスは連携してい動いているため、すべて起動した状態での開発が楽なんです。

これらの負荷をリモートサーバーに移せばPCが早くなると考え、あまりお金がかからない範囲でリモート開発を試みました。

試み1(失敗):物理サーバーでリモート開発をする

社内の物理サーバー(KVM)に個人用サーバーがあったのでそれをリモート開発に使っちゃおうと考えてました。こんな感じに。

https://kroki.io/plantuml/svg/eNptUsFKw0AQvecrltyr9x68WJF6EkU8J5tRinG3bDYWEQ_ZvSgKehA9iiJCW2wPRaFgv2ZA61-4u93YqskhzM689-a9bBhPgKB-Qf2Oqo-6v7lKTgJiHmYnNG0BkyTKSLgBMhZRi2VkPZLQiY79MPRoCSSFPelOqHuoH62mPkP16opr-y4GzcYaFn2H-hxfmHL6cInFFaoh6i6qJ1SGNzI8BwGWOOm5o1jwTgbCWUJ960jPqN6MehicBgGbBarevxgtjuiBla_O5qdV4XaaWPSwuCvDDD6691M9-Spu_lumPE2ByhY30gk3kjPjDVcaKuVMmr0gDDuce8t4LijMMqqJu5sxqpHLcb6A24V4G8QRCNcqE9VqK17Btb2Y7f7gSZ0sLe-LKEmhQ2LO5VbO_oK937ovapQftnkGJG_b7-z_DAv0e4Pyan5t-gbGJ_Z2

ローカルPCにはソースコードがなく、DockerやWeb serverも起動しません。リモートサーバーにソースコードを起き、そこでDockerやWeb serverなど開発に必要なものが起動している状態で、ローカルPCはただリモートサーバーにつなぎに行くだけです。僕の場合個人用サーバーがあったのでそれをリモートサーバーとして使いました。

これを設定するのに下記のような手順を踏みました。

  1. Jetbrains Gatewayをインストール
  2. 個人用サーバーがJetbrains Gatewayの最低限のスペックを満たしていなかったのでスペック上げる
  3. Jetbrains Gatewayで個人用サーバーに繋ごうとしてエラー出る
  4. 色々試してやっと繋げるようになる
  5. リモート開発開始!
  6. IDEがめっちゃ遅くて悲しくなる
    このとき個人サーバーのCPUとMemoryが常に100%近い状態でした。補完が遅かったり、反応しなくなったりしてました。
  7. リモート開発やめる

最終的にローカル開発よりも遅くなっちゃったのでリモート開発はやめちゃいました。遅いこと以外にもやりずらいところが複数ありました。

  • キーバインドが全然違う
    MacOSのキーバインドではなくLinuxのキーバインドになっていた。例えばクラスを探すコマンドはMacOSでは⌘ + Oですが、LinuxではCtrl + N 。これはIDEのBackend処理を行うプログラムがLinuxサーバーにインストールされているため、デフォルトキーマップがLinux用になってしまったと考えられます。簡単にMacOSのキーバインドにすることができるかもしれないですが、僕はやり方が分からなかっです。
  • 普通のIntelliJと挙動が違う
    Project windowでハイライトしただけでなぜかファイルが開く。
    Database clientの実行選択機能が無い、など。
  • 設定方法が難しい
    普通のIDEの設定とリモート開発用のHost Settingが分かれていて、重複もしているためどっとの設定を変えればいいかわかりずらい。
  • 僕の大好きなPlantUMLが使えなかった

でも僕はまた別の方法でリモート開発を試みました。BUT! If this works, I am certain that my dev experience will go through the roof, so I'll try it again later when I have the chance :DZ

試み2(成功):Dockerだけリモートサーバーで起動

前回の失敗を踏まえてもっといい感じにリモート開発できないか試みました。

前回の失敗で学んだこと:

  • 僕の個人サーバーはLabolの開発環境を実行できるほどスペックが高くない
  • Jetbrains GatewayはいつものIDEと見た目は似てるけどちょこちょこ違うところがあって使いづらい

そこで僕はDockerだけリモートに立ち上げて、ローカルPCからはDockerにPort forwardingすることでSemi-ultimateでSemi-remoteな開発環境を作ることができました。こんな感じです。

https://kroki.io/plantuml/svg/eNqFkT1PwzAQhvf8Cqt7y94BCVGGMlVlYE6TI0SkduW4FIQYHC-gMjDwIQaEBBIVrWBBBSHg15yQ4F_gnEM_YMCDdT6_d_f6MRchMDT3aN4wG6EZNZbZnsfs4vlNkMTAFfNTVqpzBUkSr7J6bWWpNJWkoisDIAlm79TnBbPHPDCHM7p1aK2B3AZJqUAkCQQqFjxlHSFVSg1CEWyBLAei3REpoB7AjgvOUd9i1kdzSX0PvvTJTOuWFL0UpPNgztDcYWblT1brVMUzyuXFwi5lC-d5dmKOVVllIZJ-mECPtYRQzS4n8c-MObW373ncERyiuXbeMBtTcGz3WZZuXBPaQv2HywpkHG0qOtYIyuf4-aN_ivoix6AfUI_ocp5YZddvJ5RHfYT6lcBZ-Q3qKyoaRLGyNAR3BICHNO3Pl7i25NKNt9WB4MqPOcgJ_LkX5WCKsuovW6zbyUm5f57qqqxhM2xDyJ4vw5hH36EACSA=

この方法を取ることでこんないいことがありました。

  • ローカルPCが早くなった
    Dockerで使っていたリソース分が浮いたのでローカルPCは負荷が減りました
  • MySQLのdumpやimportがめっちゃ早い
    MacOSのDockerDesktopではdumpやimportが5~10秒ぐらいかかってましたが、Linuxだと1秒になりました。

でもこんな良くないこともありました。

  • Networkが変わったらPort forwardingし直す必要がある Networkが変わるときに一回Port forwardingが切れるのでつなぎ直す必要があります。
  • docker-composeに変更が入ったらリモートサーバーでpullする必要がある ちょっと面倒ですが、docker-composeが変わることがあまりないのであまり気にしてません。

Choose your weapon wisely, my fellow devs

今回は僕のやってみたリモート開発を二種類紹介しました。(2つ目はリモート開発と言えるかわからないですが。)

じゃどのやり方がいいの?って思いますよね。それはリモートにすることで解決したい課題が人それぞれ違うので考えてみてください。

ちにみにPCを開けてAir dusterできれいにしたら更に早くなりました。そもそもそれだけやってればよかった可能性もありますね。みなさんちゃんとPCのホコリは定期的にとってあげてください。

最後に

ラボルでは、エンジニアを積極採用中です。1、2年目のエンジニアから経験豊富なテックリードやエンジニリングマネージャーまで、興味がある方はぜひご応募ください!!

labol.co.jp