WSLはいいぞ
この記事は LITALICO Engineers Advent Calendar 2021 その2 の14日目の記事です。
社内slackでMacの民が環境などでハマっているのを見ると、「(WSLはいいぞ...)」と心の中で思ったり冗談半分で言ったりするのですが、なんだかんだで良さをちゃんと列挙したことないなと気付きました。
今後もし本気で布教する機会が来たときに自信を持って推せるよう、ちょいとここらで想いを書き出してみようと思います。
布教ターゲット
本記事の想定読者、もとい布教ターゲットは、
- ソフトウェア開発、特にWeb系の開発をする人
- 特に強い理由がなくMacを使っている人
- 宗教上の理由でMacを使わずLinuxを使っているが、ぶっちゃけつらい人
- フルスペックなゲームプレイと開発を一つのマシンで欲張りたい人
となっています。信念を持ってMacを使っている方やLinuxデスクトップをガチガチにカスタムしている方、グラフィック系の職の方には向かないかもしれません。
なお開発をWebに絞っているのは特殊なIDEやデバイスとの結合が少なく相性が良いからですが、筆者が知らないだけで他も案外大丈夫かもしれません。
WSLの好きなところ
というわけで、早速WSLの好きなところを語っていきます。
Linuxである
一番わかりやすいメリットはこれです。割と低いレイヤからほぼLinuxになっています。
ソフトウェア開発系、特にWebでは本番環境やCIなどがLinuxなことが多く、そことの差分が少ないという利点です。厳密には、systemdやそれ相当のルートプロセスが無いほか低レイヤまわりに差はありますが、少なくともMacよりは格段に困りが少ないです。
Macも比較的unix系ではありますが、BSD系なのでコマンドの扱いが微妙に違ったり、Appleの仕様的な締め付けやアクセス制限、そしてそれらを回避するための(主にbrewの)諸々のハックがあります。前職でMacを使っていた頃、よくそれらに起因する不毛な環境問題と戦っていました。
また別の話として、dockerをそのまま動かせるというのも利点かもしれません。Docker Desktopも普通に使えますが、筆者はWSLインスタンスの中で直接dockerのserviceを起動しています[1]。なおどちらの方式でもですが、特にストレージアクセスが遅すぎたりはしません。
安定した商用OSのGUIを利用できる
これはMacではなくLinuxデスクトップという選択肢に対するメリットですが、「開発環境には開発に適したLinuxを、オフィスツールやブラウザなどGUIにはそれに適したWindowsを、同時に利用できる」という点があります。
「安定した」というのはバグや不可解な挙動が少ないというよりことだけでなく
• 動作保証されたハードウェアの選択肢が豊富
• 企業などで使う際にハードルが低い
• 他人とやりとりするためのツール(Office)や利用実績の多いツールの利用ハードルが低い
というような、その環境を使うための障壁が少ないという意味が強いです。
※単に不可解な挙動やバグの少なさだけでいえば、今でもMacの方が安定している印象です
筆者は以前にLinuxデスクトップを使っていた時期がありますが、組織のレールに乗れないというか、何かとやりとりで困るタイミングが多かったと記憶しています。Windowsだとこのあたりがスムーズです。
ホストOSとライフライクルが独立している
WSLは実体としては仮想マシンのようなもので、ホストOSと独立したライフサイクルで管理することができます。
例えばWSL内で環境構築をゴチャゴチャやって何か壊してしまったり訳分からないことになった場合、PC全体のクリーンインストールのような大袈裟なことをせずに開発環境を作り直すことができます。
壊れてしまった場合だけでなく意図的に壊す想定もできて、試行錯誤がほぼ確定している未経験分野の環境構築や一回試すだけの環境の場合に、あえて既存環境とは別に新規でインスタンスを作った上でサンドボックスし終わったら捨てる、ということができます。
また逆に、PCを買い替えたいが開発環境が秘伝のタレ化しており作り直したくない、という場合にWSLインスタンスのイメージをバックアップして新ホスト環境をまるごと引っ越す、ということもできます。
またこれは筆者を始めとしたごく一部だけだと思いますが、なんとなく定期的にクリーンインストールをしたくなってしまう人や、開発環境をansibleなどで完全再現可能なIaC下に置きたいという宗派の人にはこれが特に効いてきます。
IaC書いたら再インストール時の再現テストをしたくなってしまうものですが、MacやLinuxデスクトップでは時間がかかりすぎるソレを、WSLではいとも簡単に素早くできてしまうのです!完全なIaCが捗りますね。
複数インスタンスを並列に配置できる
ライフライクルと近い話ですが、WSLは複数インスタンスを並列に保持・実行することができます。
アプリAの開発環境とアプリBの開発環境で別インスタンスを用意するといったユースケースも当然ありますが、よりリアルなものとして「環境を移行したけど古いやつを念の為残したい」ができます。
旧インスタンスが残っていると、新環境に移行が漏れていた環境変数や一時ファイル、また昔にちょっとだけ実行したシェル芸のhistoryなどを復元することができ、安心できます。また筆者の前職でも、PC交換前のマシンを安心のためにずっと保持していて管理部に怒られる人が一定数観測されたので、このユースケースは割と需要あるかもと思っています。
ちなみに、同じバージョンのdistroを並列に動かすには一工夫要る※のですが、Ubuntuに限り、Ubuntu (無印) と Ubuntu 20.04 (最新のバージョン付き) を使えば2つまで同じバージョンを並列に動かせます。メイン使い+たまに一時環境、またはメイン+旧環境といったユースケースではこれで十分でしょう。
※普通に同バージョンの並列をする場合、既存インスタンスのcloneもしくは非標準のイメージの取り込みになります。多少慣れと知識が必要かも。
Windows自体が割と良い
これは個人的な好みと思想が非常に大きいですが、Linuxデスクトップでいうウィンドウマネージャに相当する機能の仕様が好みです。ウィンドウのスナップやワークスペースでのウィンドウ切り替えの挙動、ホットキーなど。
他の点で、WindowsはOSもしくはMicrosoft公式の機能/ツールで事足りることが多いです。具体例では
- キーリマップ -> PowerToys
- ターミナルエミュレータ -> WindowsTerminal
- クリップボード履歴 -> OS標準
- ウィンドウを整列するやつ -> OS標準 or PowerToys
など。
個人的にツール類はデフォルトや標準のものを使いたい主義というのはありますが、それを差し置いても、公式であればOSアップデートなどで置いていかれる(karabiner -> karabiner elementsのような)リスクが低く安心できます。
...また余談ですが、Web系の開発チームにWindowsユーザが一人いると、古くはIEを始めとしたwin特有のデバッグに便利です。フォントやダイアログ、あとExcel確認は任せろ!
Microsoftの加護がある
これまた非常に好み、なんなら宗派みたいなところがありますが、ここしばらくのMicrosoftの動きは開発者として非常に期待しています。
本記事の主題であるWSLの導入・開発をはじめ、ほぼデファクトとなって久しいvscode及びその関連機能群の開発、そして言わずもがなのGitHub。過去の威光のみならず現在の方針・活発さも信用に足り、彼らのレールに乗っかる安心感はなかなかのものがあります。
WSLやWindows Terminal周りでも、結構な頻度で便利になっていっています。最近記憶にあるものだと、初期セットアップがコマンド一つで完結するようになった、ホストとのクリップボード連携がしやすくなった、あたりが思い浮かびます。
現在だけでなく、将来も安心できるのはうれしいですね。
WSLのつらいところ
そろそろ少々信者じみてきたので、最後にWSLやWindowsでつらいところも挙げておきます。
特殊な環境あることの難しさ
ホストOSとは悪い意味でも分離された環境であるので、思わぬときに妙なハマり方をすることは時々あります。
ストレージやネットワーク構成から、ファイル更新イベントが捕捉されない気がするとか、このポートbindはどこに繋がってるんだっけ、みたいなことはままあり、仮想マシン的なレイヤの構成をイメージできるスキルが無いと問題解決が難しい場合があります。
※アップデートにより改善された部分は多い
他の具体的な困りだと、ホストOSのメモリを圧迫するという問題や、IDEに依存する環境構築に工夫が必要という問題があります。たとえばFlutterのGet startedではAndroid環境のセットアップが「Android Studioいれてね」となっているが、WSL想定だとホストOSにAndroid Studioを入れても意味がない(のでAndroid環境は自前で頑張る必要がある)です。
WSL自体のアップデートにより改善していくこともありますが、構造上やむを得ない難しさは一定あります。
やはりMacが多数派
そもそもこんな記事を書こうと思う程度にはWeb開発界隈はMacが多数派です。
チームの環境がMac前提になっていると読み替えや調整が必要になるし、GUI系のド定番ツールがだいたいMacだけなので探すのがしんどい(Sequelとか)、またネット上の情報もMac前提のものが多いなどのつらみがあります。
また少数派ということは「困ったら周りに聞く」が非常に難しく、自分でなんとかできるスキルが求められます。
いうてもMacはつよい
Mac、ハードウェアがめちゃくちゃ強いんですよね。さほど迷うまでもなくデスクトップかノートか、Proか普通かを決めれば自ずと良いデバイスが決まるという素晴らしい世界です。
また2020年以降では、M1の圧倒的パワーを横目に従来技術で戦わねばなりません。つらい。
ソフトウェア面でも、コマンドキーによるホットキーの簡易さや、テキスト欄でデフォルトでemacsキーバインドが効くのは完全にMac固有の利点だと思います。GUI的な動作の安定性でもやはりMacの方が優れています。
まとめ
一長一短、思うところを書き連ねてみました。
現時点の周辺環境や要求スキルもあるので「全人類移行するといいよ!」とは到底言えませんが、現代では(Web)開発であってもMac一択なんてことは全然無いよ、くらいのことが伝わるといいなと思います。
Discussion
Macは正式な "UNIX" ですね。