Diary

@ssig33

arm Mac と向き合う Web アプリケーション開発環境

  • しない話: Docker Desktop の課金回避

問題意識

Mac の CPU が arm になってしまった結果、以下のような問題がある

  • JVM 系を中心に amd64 な Docker image が Mac で挙動が怪しい
  • ネイティブ開発すっか!!となるとライブラリのバンドリングとかでおかしいことになりがち
    • Ruby の nokogiri とか
  • ネイティブだと古いものはわりと動かない
  • そういう問題がなかったとして arm で開発したものを amd64 環境にデプロイするのはちょっと勇気がいる。

古い環境はアップデートせえやという話なのだが、リソース不足してるものはどうにもならず、結果として古い JVM 環境を延命させてたやつとかはまじでどうにもならなくなったりする。えてしてそういうものは皆さんの手元にあることでしょう。

そして「動く」ものも結構しんどい。実行環境と開発環境が揃ってないのはいかにも今風ではない。すべてをコンテナ化してなるべく同じような環境で動かして環境の問題は環境変数とかを経由して流し込んでいくみたいなのが一般的だと思う(とはいえあまりそこにこだわりすぎてもどうせその流し込んだちょっとした違いみたいなところでいつか問題はおきてくるもんではあるが)。

解決策

いくつか考えられると思う。

1. 本番環境を arm にする

これまでぼくの経験では(といっても大した経験でもないが、、、) AWS の Graviton 2 はコスト面でかなり魅力のある環境だと認識している。シングルコア性能はあんまりでないけど、 Web アプリのボトルネックは大抵 I/O であり安価にコアが沢山並んでるほうが嬉しい事例は多いはず。開発環境は arm なんだし本番環境も arm にしちゃう、というのは選択肢としては十分ありえると思っている。

新規事業でチームもプロダクトも環境もイチから作るぜ!みたいな場合はありえるんじゃないかね。事実上 AWS にロックインされるのは嬉しくないし、レガシーコード抱えてる場合はもちろんどうにもならないね。

2. 開発者のマシンを Mac 以外にする

Linux デスクトップとか WSL2 とかを標準的な開発環境にする。マシンは XPS とか ThinkPad とかを開発者に配る。

僕は日常的には Linux デスクトップを使っていて、そして ThinkPad のファンでもあるのでこれはよい選択肢だと思っている。ただし世の Web 開発者が Windows + WSL2 や Linux に慣れているかというとそうでもないし、ディスプレイとかスリープ復帰とか発熱とかそういうあたりで Apple 製品が未だに圧倒的な魅力を持っていることは否定しがたいとも思っている(逆に言うと Ryzen つかってるとスリープまわりいまだにおかしいのどうなっとるんだ)。

それから日本で仕事をしている場合は特にだが、現代の Web アプリケーションにおいて iOS で動作するアプリはかなり多くの場合で事業において非常に高い地位が与えられていると思う。 Web 開発やってる人でも Xcode も起動しているということは多いだろう。

しかしみんな Linux 普通に使うようにならんもんかねえ。

3. Mac と Mac 以外を開発者に両方わたす

Xcode はどうせ必須問題への答え。 Mac と amd64 マシンどっちも持たせる。案外コスパはいい解決策だと思う。ただし管理するマシンが倍になるのは組織にとっても開発者個々人にとっても負担であろう。

4. クラウドで動作する開発環境をつくる

.devcontainer とかを整備して Github Codespaces とかでどうにかできるようにする、みたいなやつ。

複数のリポジトリにまたがるマイクロサービスとして事業が表現されている、といった場合だとこういうものを構築するのも難易度が高いという問題がある。また Codespaces を使うか使わないかを別にしてもこういうことを現代にやろうとするとどうしても VSCode ありきになりがち、という問題もあると思う。

開発環境を統制してセキュリティ水準を上げられることもメリットになる。そして開発環境を統制するのにおそらくかなり早い段階で専任の担当者が必要になるであろう。

コスト的にもわりとそこそこかかる。いろいろあるけど amd64 ノートも持たせちゃうほうが安上りになることは多そうだと感じている。

で、どうしよう?

開発者のもってるマシンの CPU アーキテクチャが arm になるのでどうしよう、みたいな文脈で話をしてきたわけだけど、解決策のところの最初にかいたように「単に実行環境としても arm なマシンは魅力的な選択肢」という問題もある。つまり amd64 アーキテクチャな CPU を持ってる人に arm な開発環境を提供しなきゃ、みたいなタスクもいずれ生えてくる。

手間とコストはかかってもクラウド上でばっちり使える開発環境を構築して開発者たちに提供していくぜみたいな気合が求められている気がしている。やりたくないけど、、、