まだパソコンのOS選びで消耗してるの?

昨日、大学生協推奨のPCが20万のWindowsマシンなのを見てなぜMacじゃないのかという声がTLに流れていたり、それで思い出したのか、逆にMacじゃなくてLinuxを使っている人はなぜそうしてるのかみたいな話がvim-jpで盛り上がったりしていた。

Windowsを使い始めてから17年、Macを使い始めてから8年、Linuxデスクトップを使い始めてから6年経ち、今は用途に応じてその3つをどれも使っているという感じなのだが、個人的にはどれも善し悪しだと思っているので、状況に応じて何を使うべきか自分の考えを書いておく。

大学生は何を買うべきか

特にプログラミングとかやるつもりがない大学生でお金がある人は、素直に推奨されたWindowsマシンを買っておくと、大学側が使わせてくるソフトが動かない可能性も流石に低いだろうし、周りと環境が揃っていて質問とかしやすいので無難だと思う。金がなければ中古で似たような奴を探したり、バイトなどすると良い。

これからプログラミングを始めますという学生は、Mac (中古のIntel MacBook Proか、M1のMacBook Proあたり) を買うのが良いと思う。理由は単純で、開発に使うものはWindowsじゃなくても大体動くし、逆にiOS開発は突然やりたくなってもmacOSでしかできないため。あと、その辺のWeb系企業が社員に貸与するマシンはMacなことが多いので、そういう会社が視野の人は早いうちにそれでの開発に慣れておくと便利。

開発が趣味の人は何を使うべきか

仕事以外でもプログラミングするけど、別に開発環境にそんなに拘りがないという人は、普通に趣味でも会社と同じOSを使っておく方が業務中にハマる時間が短く済むのでそれが良いと思う。

じゃあ、開発環境いじったり開発効率を向上したりする活動そのものが趣味ですみたいな人はどうか。そういう人は、きっとどれを選んでも大体楽しんでなんとかできるので、面白そうと思ったOSを全部試してみるのがおすすめ。そのうち自分のお気に入りが見つかると思う。

まあこれだと何らかの理由で選択肢が複数ある人や、そもそもどれから試すべきか悩んでるステージの人には何の足しにもならないので、現時点での個人の感想を以下に書く。書いてない奴も、単に今思いついてないだけの可能性もあるけど、普通に知らない可能性もあるので何かあったら教えてほしい。特にWindowsは僕が勉強不足な可能性が高い。

Windows

良い所

  • ゲームを始めとして、Windowsにだけ対応してるアプリが結構ある
  • 優秀なキーリマッパー (例えばのどか *1 ) があり、Macっぽいキーバインド *2 もある程度再現できる
  • WSL2ができたのでmacOSよりもLinux寄りの環境が使いやすくなった
  • OSSのWin32やMinGW対応をするときに便利

悪い所

  • ファイルパスの扱いの違いや、ANSIエスケープシーケンスや、ネイティブなシステムコールの違いにより、Windows以外では大体スッと動くがWindows対応には一手間かかる開発用ツールはそこそこあり、Windowsに対応してないか、mattnさんがWindows対応したかみたいな状態になりがち。
  • HiDPI (MacでいうRetina) にOSレベルでは対応しているが、アプリ側が対応してないとそういうアプリだけ文字の解像度が低く汚ない感じになる。

macOS

良い所

  • Retina表示の対応率がすごい。ありとあらゆるアプリがほぼ常に綺麗に表示される。
  • 極めて便利なキーリマッパー (Karabiner-Elements) がある
  • Emacs キーバインドが標準で使え *3、かつCommandキーのショートカットとデフォルトで分離されている
  • Windowsほど対応アプリは多くないが、Linuxは対応してなくてmacOSは対応してるアプリは割りとある *4
  • iPhoneやそのアクセサリとの連携が最も自然に動く
  • OSSmacOS対応をするときに便利

悪い所

  • ターミナルの動作がLinuxのそれに比べて遅かったり、(Intelの) フルスペックのMacBook Proなのに普通にIDE使ってるだけで度々カーソルがグルグルして待たされるので、あまり快適にプログラミングできない。まだ試せてないけど、M1やM2だとこれが劇的に改善されていると期待している。
  • Linuxではない。Linuxサーバーをいじるのが仕事な人は、LinuxにあるけどmacOSにはないか普通使わないツール *5 にも慣れておくと、便利なことがある。
  • homebrewの依存管理がゆるふわなので、brewを使っているとある日突然so名がズレたりしていろいろ壊れることになる
  • ウィンドウの半透明化 *6 が難しい。Deskoveryというアプリでできていたのが、Catalina以降はSIPを切らないといけなくなった。

Linux

過去にはArch LinuxGentooなどのディストリビューションや、Awesomexmonadなどのウィンドウマネージャを試したので自分の環境以外の話もある程度わかるつもりだが、今はUbuntuGNOMEなのでそれ特有の話が混ざってるかも。

良い所

  • ターミナルの動作が速い。エディタなども含め、マシン購入にかかる値段あたりの比較では一番軽快に動作する印象。
  • Dockerを動かすときのオーバーヘッドが小さく、軽快に動作する
  • Linuxサーバーサイドエンジニアの場合、本番環境と手元の環境を揃えられる
  • ある程度機能が揃ったキーリマッパー *7 があり、Macっぽいキーバインド *8 もある程度再現できる
  • WindowsmacOSだけでなくLinuxもサポートしているデスクトップアプリは結構あり、開発以外の用途にも使う場合も、意外とある程度は普通に生活できる *9
  • ウィンドウマネージャの自由度が高い。タイル型WMとかが使える。 *10
  • OSSLinux対応をするときに便利

悪い所

  • ドライバーのサポートが不安。何かケーブルを繋ぐ度に「動くのか…?」とビクビクすることになる。例えばうっかり最新のGPUを買うと、Nvidiaのドライバをいれれば動くがnouveauだと動かず、何らかの拍子にNvidiaのドライバが抜けると、画面が映らない状態でNvidiaのドライバをインストールする必要が発生するみたいな状況に陥ることもある。
  • 動かないアプリが多い。最近、SteamがLinuxに対応してるっぽくて驚いたけど、たとえばAmong UsとかはSteam Play (中身はProtonという、Wineベースの互換レイヤ) を使って起動できたりするのだが、ネットワーク接続が動かなくて、なんかそれをデバッグするRedditスレが盛り上がってたりする。
  • 音を出すみたいな割りと基本的なところがデフォルトで動かなくてハマることがある。まあそういうのを直すのをエンジョイするのがLinuxみたいなところがある。
  • HiDPIに対応してないアプリがある。Windowsと違って、文字が低解像度表示されるのではなく、文字が小さく表示されるか、何か画面を切り替えた時にウィンドウ幅が画面サイズ以上になっていたりする。

まとめ

*1:窓使いの憂鬱の派生プロジェクト

*2:CtrlでEmacsキーバインド、Ctrlじゃない修飾キーでコピーやペーストなど

*3:これ、ほとんどはWindowsLinuxでも再現できるんだけど、じゃあ何が嬉しいかっていうと、例えばHomeやEndでC-aとC-eをエミュレートする時、論理行頭/末じゃなくて物理行頭/末になってしまうという違いがあるため。C-kも同様。ただし、Emacsバインドは様々なWebサイトで奪われるので、キーリマッパーのサポートはEmacsキーバインド自体に対しても結局必要がなことが多い

*4:ライセンス時代の1Passwordとか、Appleなのでやや例外的ながらiTunesとか

*5:具体的にはstrace、perf、gdbなど。gdbは使えないことはないが入れるのが若干面倒な上、普通Clangを使う場合lldbを使うのが無難なのでgdbはなかなか使わない。

*6:これ何に使ってるかというと、シングルディスプレイでエディタを全画面表示しながら、それに透かしてブラウザとSlackやTwitterを同時に眺めるということをやっている。Vimだとターミナルの半透明機能でいけるけど、IntelliJ IDEAとかを使ってるときにそれができなくて不便。

*7:Rubyが好きな人は拙作 xremap や、Pythonが好きな人は xkeysnail など

*8:CtrlでEmacsキーバインド、Ctrlじゃない修飾キーでコピーやペーストなど

*9:参考: https://k0kubun.hatenablog.com/entry/linux-desktop-2017

*10:macOSにもないこともないが、もともとそれを念頭にデザインされてないデスクトップ環境なので、僕が過去に試したものは微妙な挙動だった