AI時代になり、個人開発はだいぶ楽になったけど、開発環境は相変わらずだるい。最近そんなことをよく考えています。
というのも、AIを使うようになってから、複数のプロジェクトを同時に触ることが増えました。
Chrome拡張を作りながら、別のWebアプリも試して、CLIを書いて、APIサーバーも少し触る。以前ならどれか1つに絞っていたようなことを、今は並行して進めることが増えている。
昔だったら「まあ面倒だしいいや」で終わっていたものでも、AIに相談しながら進めると、とりあえず動くところまでは持っていけます。設計をざっくり考えて、最初の実装をして、ローカルで動かしてみるところまでのハードルはかなり下がりました。
ここで困るのが、コードを書くことではなく、複数動かす環境です。
1つのプロジェクトだけなら、Dockerを起動して、開発サーバーを立ち上げて、作業が終わったら落とせばいい。そこまで大きな問題ではない。
複数のプロジェクトを並行して触るようになると話が変わります。
こっちのWebアプリではDBを起動していて、別のAPIサーバーも立ち上げていて、Chrome拡張の検証用サーバーも動かしていて、さらに別のCLIツールの検証もしている。
そういう状態になってくると、ローカルの中で何が動いているのか分かりづらくなってくる。
Nextjs、Reactをよく触るんですが、やたらポート3000になるし、どのアプリがどのポートで動いているのか分からなくなる。
Dockerコンテナも増えるし、ターミナルのタブも増えるし、環境変数もプロジェクトごとに違う。
コードを書くのは前より楽になったのに、複数のプロジェクトを同時に動かす面倒くささはあまり変わっていないんですよね。
むしろ、AIで作れるものが増えたぶん、複数の開発環境を同時に立ち上げる場面が増えて、そこが前より気になるようになってきました。
フロントだけならまだいいですが、APIサーバーやDB、Dockerが絡むと、それなりにローカル環境が重くなってくる。
ちょっと試したいだけのプロジェクトもあるし、途中で放置するものもあるし、あとからまた触るものもあります。
最初は気にならないんですが、プロジェクトが増えるほどだんだん微妙になってきます。
AIで作るものは増えたけど、動かす場所は必要
AIを使うと、コードを書くコストはかなり下がってきて、複数のプロジェクトを同時に触ることが可能になった。
ちょっとしたChrome拡張、CLI、管理画面、検証用のAPI、データを整形する小さなスクリプト。
こういうものを作るハードルが減少。ただ、コードが生成されても、それを動かす場所は必要。
結局、
pnpm install
pnpm dev
pnpm test
docker compose up
みたいなことは必要になる。
DBを使うならDBを起動する必要がありますし、外部APIを使うなら環境変数も必要です。
ブラウザ拡張ならブラウザ側で読み込む必要がありますし、Webアプリなら開発サーバーを立ち上げる必要があります。
AIがコードを書いてくれても、実行環境まで全部いい感じに面倒を見てくれるわけではありません。
むしろ、AIによって触るプロジェクトが増えたことで、開発環境の管理が前より目立つようになってきました。
昔は1つのプロジェクトに集中していればよかったので、ローカル環境もそこまで気になりませんでした。
でも今は、複数のプロジェクトを並行して触るのが普通になってきています。
WebサービスAを触りつつ、別のChrome拡張を試して、CLIツールも作って、Webアプリの検証もして、たまにAPIサーバーも書く、みたいなことが起きます。
そうなると、全部をメインのMacに入れていくのがだんだんしんどくなってくる。
Macは好きだけど、全部をMacで動かす必要はない
自分はMacの開発体験自体はかなり好きです。
エディタも使いやすいし、ターミナルも慣れているし、普段の作業はMacでやりたいです。なので、Macをやめたいわけではない。
むしろコードを書く場所としては、今のままMacを使いたい。
ただ、アプリを動かす環境まで全部Macに詰め込む必要があるのかというと、そこは少し疑問があります。
コードを書く場所と、コードを動かす場所は分けてもいいんじゃないか。
最近はそう思うようになりました。
自宅に使っていないPCがあったりして、以前にもiPadから開発できるようにできるんじゃないかと考えてやろうかと思ったけど結局面倒くさくなってやめた。
当時はせいぜい個人開発とかしてても2、3個のプロジェクトを同時に触るくらいだったので、そこまでつらくはなかった。
けど今は無限にアプリケーションが作れる状況になってしまったので、なんか知らんけど思いついたら作ってみるみたいなことを普段しています。
イメージとしては、Macでは今まで通りコードを書けるようにしつつ、サーバーは別環境に立てる。
エディタを開いて、AIコーディングツールを使って、Git操作をして、設計を考える。
一方で、実際にアプリを動かすのはWindows/WSLや別のLinuxマシンに任せます。
Mac
- エディタ
- AIコーディングツール
- Git操作
- 設計や調査
- ブラウザでの確認
↓ ファイル同期
Windows / WSL / Linux
- アプリの実行
- Docker
- DB
- テスト
- 開発サーバー
こういう構成です。
完全にクラウドIDEへ移行したいわけではない。コストもかかるし。
VS Code Remote SSHやGitHub Codespacesのような方向もありますが、今考えているのはもう少しゆるい構成です。
Macでいつも通り編集して、動かす場所だけ別にする。
半分リモート開発みたいな感じです。
書く場所: Mac
動かす場所: Windows / WSL / Linux
つなぐもの: SSH + ファイル同期
このくらいの距離感が、今の自分にはちょうど良さそうに見えています。
なぜWindows/WSLなのか
別にWindows/WSLである必要はない。Linuxサーバーでもいいし、Mac miniでもいいし、余っているPCでもいい。
ただ、自分の手元にはWindowsマシンと2014年の古いMacMiniがあるので、それを実行環境として使えないかと考えています。
Windows単体というより、実際にはWSLを使うイメージです。
WSL上でNodeやDockerを動かして、Mac側からSSHで入る。
Macで編集したファイルをWSL側に同期して、向こうで開発サーバーを立ち上げる。
ブラウザで確認する必要があるものは、Mac側からアクセスできるようにする。
こうすると、Macをメインの作業場所にしつつ、実行環境だけWindows/WSLに逃がせる。
手元にあるマシンを使えるので、クラウド環境を常時立ち上げるよりも気軽。
もちろんCodespacesみたいなものは便利ですが、毎回そこに寄せるほどでもないプロジェクトも多いです。
ちょっと試したいだけのものに対して、クラウド環境を作って、課金を気にして、設定を整えて、というのは少し重い。
それなら、家にあるWindowsマシンやLinuxマシンを実行環境として使うほうが、雑に扱えてよさそう。
壊れても困りにくいし、必要なら作り直せばいい。
AIコーディングエージェントにいろいろ触らせる環境としても、メインのMacから少し切り離されているほうが安心です。
期待していること
この構成で期待しているのは、メインのMacをなるべくきれいに保てることです。
もちろん、Macにも最低限の開発ツールは入れます。
Gitやエディタ、AIコーディングツール、ブラウザ、ターミナルは必要です。
ただ、プロジェクトごとの実行環境はできるだけ外に出したいです。
DB、Docker、開発サーバー、テスト実行、そういうものはWindows/WSL側に寄せる。
そうすれば、Macはコードを書く場所として使いやすく保てる。
もう1つ期待しているのは、プロジェクトごとに環境を分けやすくなることです。
そういう割り切りがしやすくなります。
問題はファイル同期
ただ、実際にやろうとすると一番の問題はファイル同期です。
Macでコードを書く。
その変更がWindows/WSL側に反映される。
Windows/WSL側で起動している開発サーバーが変更を検知して、ホットリロードする。
ここが気持ちよく動かないと、たぶんすぐ使わなくなる。
開発環境で一番大事なのは、結局ストレスがないことだと思っています。
少しでも反映が遅いとか、たまに同期されないとか、ホットリロードが効かないとか、そういうことがあると一気に使う気がなくなる。
候補としては、rsync、Syncthing、Mutagen、SSHFS、VS Code Remote SSHあたりがある。
rsyncはシンプルで分かりやすいです。
ただ、常時同期しようとすると、ファイル変更をwatchしてrsyncを走らせる仕組みが必要。
単発で同期するだけなら簡単ですが、開発中にずっと使うなら少し工夫が必要。
Syncthingは常時同期という意味ではかなりよさそうです。
ただ、開発用途だとnode_modulesやビルド成果物、キャッシュファイルなどをどう扱うかをちゃんと考える必要があります。
同期してほしくないものまで同期されるとつらいですし、逆に必要なものが同期されないのも困ります。
Mutagenもこの用途に近そうです。
ローカルとリモートのファイル同期をいい感じにやってくれるので、開発環境の分離には相性が良さそうです。
ただ、自分の用途にどこまで合うかは実際に試してみないと分かりません。
SSHFSは一見シンプルですが、開発環境として使うとファイル監視やパフォーマンスでハマりそうな気もしています。
特にフロントエンドの開発サーバーはファイル監視に依存しているので、そこが不安定だと厳しいです。
VS Code Remote SSHを使えば、かなりの問題は解決すると思います。
ただ、それはエディタごとリモートに寄せる方向です。
今回やりたいのは、Mac側でいつも通り編集して、実行だけ別マシンに逃がすこと。
なので、VS Code Remote SSHで十分ではあるけど、自分が欲しいものとは少し違う気もしています。
ホットリロードが効くかどうかが大事
この構成で一番大事なのは、ホットリロードが自然に効くことです。
Macで保存する。
Windows/WSL側にファイルが同期される。
向こう側の開発サーバーが変更を検知する。
ブラウザが更新される。
この流れが違和感なく動かないと、日常的には使えません。
逆にここさえ気持ちよく動ければ、かなり実用的になりそうです。
多少同期の仕組みが雑でも、保存してすぐ反映されるなら十分です。
最初から完璧な分散開発環境を作りたいわけではありません。
自分の用途では、Macで書いたファイルがWindows/WSL側にいい感じに同期されて、開発サーバーがちゃんと反応してくれれば、それだけでもかなり助かります。
自分用の同期ツールが欲しい
このあたりを考えていると、自分用に小さな同期ツールを作ってもいいんじゃないかと思っています。
たとえば、プロジェクトごとに設定ファイルを書いておきます。
project: my-app
local:
path: ~/src/my-app
remote:
host: windows
path: /home/me/src/my-app
ignore:
- node_modules
- .next
- dist
- .git
- coverage
あとは、
devsync start
みたいに起動すると、Mac側の変更を見て、必要なファイルだけリモート側に送ってくれる。
最初に全体同期して、そのあとは差分だけ同期する。
node_modulesやdist、.next、coverageみたいなものは除外する。
保存したらすぐ反映される。
まず欲しいのはそれくらいです。
最初からちゃんとしたツールにする必要はありません。
自分の環境で使えて、自分が困らないくらいで十分です。
最終的には、
devsync shell
devsync run pnpm dev
devsync run pnpm test
devsync status
みたいなことができると便利そうです。
でも、最初からそこまで作ると大変なので、まずは同期だけでいいと思っています。
ファイルを送る部分はrsyncに任せてもいいし、watchだけ自前で書いてもいいです。
要するに、Macで保存したらWindows/WSL側に反映される。
それだけでもかなり使い道があります。
AI時代の開発環境は少し変わりそう
AIを使うようになって、開発のボトルネックは少し変わってきた気がします。
前は、そもそもコードを書くのが大変でした。
実装方針を考えて、ライブラリを調べて、細かいコードを書いて、エラーを直して、というところに時間がかかっていました。
今ももちろん大変ではありますが、AIにかなり手伝ってもらえるようになりました。
一方で、実行環境の面倒くささはあまり変わっていません。
むしろ、コードを書く速度が上がったぶん、実行環境の面倒くささが目立つようになってきました。
AIがコードを書いても、アプリはどこかで動かさないといけません。
テストもどこかで回さないといけない。
DBも必要、Dockerも必要、外部APIの設定も必要。
そう考えると、これからは「どうコードを書くか」だけでなく、「どこで安全に動かすか」も大事になっていく気がします。
特にAIコーディングエージェントにいろいろ触らせるなら、メインPCと実行環境を分ける意味はありそうです。
AIにコマンドを実行させる。
AIにテストを回させる。
AIにファイルを編集させる。
そういうことをやるなら、メインのMacを直接いじらせるより、別マシンやコンテナ、WSL上の環境をおいておけば楽になるんじゃねえかと。
まとめ
AIで個人開発はかなりやりやすくなりました。
ただ、開発環境の面倒くささはあまり変わっていません。
むしろ、作れるものが増えたぶん、ローカル環境が散らかる問題は前より気になるようになってきた。
なので最近は、Macではコードを書いて、Windows/WSLや別のLinuxマシンで動かす構成を試したいと思っています。
MacはエディタやAIコーディングツールを使う場所にする。
実行環境は別マシンに逃がす。
その間をファイル同期でつなぐ。
問題はファイル同期とホットリロードですが、ここがうまくいけばかなり使いやすそう。
最初は自分用の小さな同期ツールで十分です。
Macで保存したらWindows/WSL側に反映されて、向こうで開発サーバーが動く。
まずはそれだけでいいです。
AI時代の開発環境は、全部を1台に詰め込むより、コードを書く場所と動かす場所を少し分けるくらいがちょうどいいのかもしれません。