Edited at

Web アプリ開発環境乗り換え一問一答

この記事は 開発環境全般 Advent Calendar 2018 の 12日目です。


自己紹介

普段は macOS Mojave / Windows 10 Pro で JavaScript (React+Redux) や Rails を、テストは karma や rspec を、またたまに Adobe Illustrator や PhotoShop などを駆使したり、Office で書類を書いたりしている Web アプリ開発者です。

いちおうバックエンドが主戦場なのですが、最近は Rails 案件と言いつつ TypeScript を書いている時間のほうが多い気がしないでもなく、改めて Rails とは、という気持ちになったりしています。


きっかけ

iOS アプリ開発用途のみならず、Web アプリ開発の現場においても MacBook Air と mac mini はコスパの良い開発機として重宝されていますが、かつてこの 2 つは長いことアップデートの対象になっておらず、そのうちディスコンになってしまうのではないか・・・という懸念がありました。

これについては 今年 10 月末に行われた Apple Special Event において後継機が発表されたことにより、当座の危機を脱したようなかたちです。まぁ昨今の iPhone 人気を考えるとお手頃なアプリ開発環境である廉価版 Mac が無くなることは考えにくいっちゃ考えにくいのですが、そういった常識に囚われずいきなり Think Different にディスコンを発動しちゃいそうなところが Apple の怖いところでもあるわけで。

またこの記事を 11 月中旬ぐらいから書き始めていくにあたり、自分の他にも macOS と Windows (と Linux)の Web 開発環境について論じている人を見かけたりもしました。macOS がダメだ、という一方的な評価ではないんですが、一部の人は「最近 or 今後の Mac 機どうなのかね・・・」と感じ始めていることの所作ではないかと思ったりしています。

そんなこんなで個人的には Mac 機および macOS の良さに後ろ髪を引かれつつも、ここいらで良さげな開発マシンを選んでおきたい気持ちが強くなり、じゃあ Advent Calendar のネタとして書いてみるか!と思い、記事に至りました。同じように迷っている人や、これからマシンを買う Web アプリ開発者の参考になればいいなぁと。


一問一答


スペック的に見てコスパが良いのは?

柔軟な BTO や自作が可能なことを考慮すると Win 機の方がコスパに優れる評価になりそうです。特にデスクトップのコスパ差は顕著なので、デスクトップが選択肢としてあり得るのであれば Win 機を検討していくのも良いでしょう。「デスクトップなら mac mini で Windows を Boot Camp すればいいんじゃないの?」という意見もあるかと思いますが、仰る通りでそれも一つの案になります。

昨今は Surface Book や Dell XPS、ThinkPad X シリーズなどを筆頭にパワー路線を打ち出したプロダクトが奮闘しており、何かとパワーを必要とする開発環境においても役立つラインナップが揃う環境になりつつあります。

Retina ディスプレイや Magic Keyboard / Magic Trackpad など Mac 機において明らかに優位なものを代替できない、という理由でなければハードウェア全体のコスパで考慮してみるのも一案かなと思います。


デスクトップとラップトップ(ノートパソコン)どっちがいいの?

自分の場合ですが Web アプリ開発業務においては専らデスクトップに触れなくなって久しいです。これは主に、


  • 移動中・移動先でも変わらずに作業できる

  • パワーを要する作業は外部リソース(AWS / GCE など)で賄う

といった理由によります。勉強会に行ったり、プレゼンしたり、移動中にコーディングしたりするような用途を考えるとノートパソコンの方が何かと便利だよなあと。ビデオチャットをするときも、ラップトップであればビルトインカメラとマイクがありますので、特に不便なくやっていくことができます。

VR や機械学習のように、とにかくスペックを盛らなアカンという場合はコスパ等考慮するとデスクトップになるかなあという印象はありますが、頑張ればラップトップでも不可能ではないので、予算と相談していきましょう。逆にほとんど移動する機会がないし移動中は一切コーディングしないというのであればデスクトップを攻めていくのもアリです。


Windows で Rails を動かすのえらく大変じゃない?

Windows 10 は WSL (Windows Subsystem for Linux) のおかげでそこまで大変でもなくなりました。Windows 10 上にインストールした RubyMine でステップ実行しながらデバッグ、なんていうこともできちゃいます。

まぁ WSL を介さないといけないという点では根本的解決にはなっていないような気もするのですが、そこはご容赦下さい。


でも WSL って重くね?

現状では確かに重いです、そしてそれを解決する有用な方法はありません。セキュリティ周りのサービスを OFF にすると速度改善が見込めたりする TIPS はありますが、実施した限りではそこまで改善せず、微妙なところでした。

根本的な原因として /mnt/c 配下のファイル I/O がネックになっている、というのがあり、これは MS でも認識しているようなので、将来的には改善が期待できそうです。ていうかしてもらえないとキツい。


WSL ってファイルのパーミッション 777 固定なんでしょ?

RS3 まではそうだったんですが、RS4 の drvfs アップデートで改良され、パーミッションの他にオーナーなども適切に反映できるようになりました。


Swift でネイティブ iOS アプリ作りながらサーバサイドもやってるんだけど

そういう場合はもう macOS にロックインせざるを得ないかと思われます。基本的にプロプライエタリな開発環境は仮想環境などで何とかしようとせずに母艦で直接動かすほうが生産性は高いです。

macOS 上の仮想環境に Windows を入れて VSCode で .NET Framework を動かしたりもできなくは無いですが、あまりオススメはしません。iMac Pro とかであればそこそこいけるかもしれませんが・・・。


VirtualBox 上に Linux 入れてソースコードは共有フォルダ、じゃだめ?

作業環境がリソースレベルで分離できるという利点を考えると、従来通りそういう方法でやるのも一つの案ではあります。が、WSL でも同等の事は可能なので、それだったら WSL にしたほうがいいよ、という話です。

実際 macOS でも docker などで Elasticsearch や RDBMS など重めのミドルウェアを分離させるやり方もありますし、なんだかんだあれどやりやすい方法を採用していくのが一番なので、これがダメ、というのは特に定めていません。最終的にはいかに快適に作業できるかが大事だと思います。


Mac から乗り換えたいけど Windows 機に良いのがない・・・

それはつまり「なんだかんだ言っても Mac が良いと思っている」という事だと思うので、無理して Windows にする必要はないです。無理やり Windows にするとモチベーションの面でデメリットが大きい場合があります。

MacBook を Boot Camp し Windows 機にするという方法もあるにはあるので、Windows を使わなければいけないけどハードウェアは絶対 Apple が良いという場合はアリかもしれません。


Mac にしたいけど Office が略

macOS にも Office はありますが、フォントなども差もあって相変わらず印刷がズレます。Excel 方眼紙的に「印刷したときにちょっとずれたりするのも NG」みたいな要件を無視できない場合は Windows にしておいた方が無難ですが、そうでなければ Office for Mac を Office 365 経由で使うというのも一つの手です。

どうしても Mac で Excel 方眼紙があれこれできないと無理で死ぬという場合は Boot Camp するか Windows Virtual Machines を使おう。ってこれ Web アプリとあんまり関係ないな。いっそ転職するという手もあるかと思います。


Mac/Win 機の母艦に Linux インストールして開発環境として使うぞ!

個人的な経験からですが Mac 機に Ubuntu 等の Linux をインストールするのは、サポート事情を考慮する限りあんまりおすすめできません(Mac 機のハードウェアは macOS で使うのが一番良い)。やるなら DOS/V 機でという感じです。

ただ Windows ラップトップに何も考えないまま Linux をインストールすると省電力設定周りがうまく動かずにめちゃくちゃバッテリー消費の激しい Linux ラップトップが出来上がったりしますので、導入事例などから考慮したほうが良いでしょう。趣味でやるというのであればその限りではありませんが。

一応 PowerTOP や TLP といったツールで何とかできなくもないので昔ほど難易度が高い訳ではありませんが「エッ、電力消費めっちゃ激しい!なんで?!もぅマヂ無理!!」みたになってしまうことが予想される人は Mac/Win 機のまま過ごすほうが良いと思います。


iPad に SSH ターミナル入れて vim で開発すればいいのでは?

そういう人も居ます。それで開発作業を全うできるのであればそれでも構いませんが、個人的には「だったらラップトップでよくね?」というのが本音です。

iPad Pro に SSH ターミナルを入れて vim で開発することで今までの環境よりも数倍生産性が上がるという人であればオススメですが、そうなるかどうかはやってみないと個人差の面で分からないですし、鶏が先か卵が先か、みたいな話になりがちです。

個人的にはハードウェアとしてのキーボードをどう考えるか、というところに集約するような気もしています。


Chromebook を開発機として使うのは?

Chromebook を開発機として使う場合、Cloud9 や Nitrous などのクラウド IDE を使う方法の他に、Crouton で Ubuntu をインストールしてしまうという方法もなくはないです。

Chromebook は安さが売りですが、ネット活用が前提なのでハードウェアスペックは若干抑え気味になっていたりします。Google Pixelbook のように「ある程度開発に耐えうるスペック」を・・・と考えると Win 機と同等の価格になってしまうかもしれません。

Chrome OS は Linux カーネルをベースとしているので商用 Linux 機としては一定の価値があると個人的には思っていますが、Linux を使うのであれば別に母艦は Chromebook じゃなくてもいいのでは、という印象も正直なくはないです。

もし要求スペック的に Chromebook + Cloud9 のようなオンラインでも十分完結できそうな開発作業だ、ということであれば一考する余地はありそうですが、それはハードウェアや OS を新調しなくても可能では?という気もしますし、まぁ、どんなもんでしょう。おすすめしない訳ではないですが、おすすめしたい理由もないかなぁと。


複数の言語を扱う場合はどの OS がいい?

現状では Windows でも仮想環境などで Linux を扱えたりしますし、macOS でもそれは然りなので、OS ごとの差はあまりないように思います。

ただ phpenv など開発の取っ掛かりになるツールの殆どは bash 上で実行されることを想定していますので、初学者がおもむろに Windows の cmd.exe に > curl -L http://git.io/phpenv-installer | bash などとやっても失敗するという点では、そういう取っ掛かりで躓きにくい macOS がいいのかなあと思ったりもします(そもそも初学者には 2 つ以上同時に言語を習得しようとすることをオススメしませんが)。

個人的には「慣れている OS をそのまま開発業務にも使える」というのがひとつの理想だと思っており、そういう意味では Windows の WSL が強化されてきつつあることで他の OS にしなくても良くなりつつある、というのは喜ばしいところです。

それでも迷う場合は OS は一旦そのままで Cloud9 から始めてみるといいかも。


ハードウェアスペックで重要視すべきは?

昨今の Web アプリ開発界隈は、かつて LL とか呼ばれていたころの面影もなく、割と全体的にマシンリソースを食うような状況が多くなってきた感があります。とりわけ JavaScript や CSS など従来からある実装にも「ビルド」や「コンパイル(トランスパイル)」といった概念が取り入れられているため、少なくとも


  • ファイルI/Oの速度(SSDの容量やR/Wパフォーマンス)

  • CPU のスペック

  • メモリのスペック

あたりを最優先で重視する方向性であることは間違いないと思っています。まぁこれは最近に限った話ではないですが。

他にも Capybara などのブラウザテスト、 test-queue などを利用した並列テスト実行、docker などに代表される仮想環境の利用などを考えると、上記はどんだけ盛っても損は無いでしょう。逆に母艦が低スペックな場合は敢えて CircleCI や AWS の高パフォーマンスインスタンスやデスクトップ機など外部資源でテストを実行させる、というアプローチもあったりします。

そうなると削れる部分はグラフィック周りなのか?という感じになりますが、だいたい昨今のグラフィックは内蔵チップであることが多いので、削って値段を下げられるかというと、あんまりそういうことにはならない気がします。このへんは昨今のトレンドである省電力化と相反するところなので難しい。

また 4K ディスプレイを使いたいとなるとやはり 4K60p を目指していきたいですし、そうなるとUSB-C で eGPU だとか、HDMI 1.4 だとかでグラフィックスペックも反故にできねえといった状況が発生することになります。

金銭的な事情がなければ、ローカルがハイスペックなのに越したことはないので、可能な限り頑張りましょう。特にラップトップの場合 eGPU はまだまだ相性問題なども多いので、博打感が高くなります。金銭的な事情の場合も可能な限り頑張りましょう。いや、頑張らなくてもいいのが理想なのは分かります。


Web アプリ開発の他に○○(開発or開発でない何か)をしたりもするんだけど

その○○が何なのかにもよりますが、例えば「Web アプリも開発するんだけど、VR アプリも開発するんですよ」みたいな話だと、何をどうやっても必要スペックは VR アプリ開発の方に引っ張られるので、何かを一緒にやりたい場合は必要スペックが高いほうに寄せていくのが良いです。

ありがちなのは「ゲーム(開発 or 遊ぶ方)」だと思いますので迷ったらゲーミングノートを買うという方向性も別に間違いではないかなと。機械学習で GPGPU が使いたいし、Steam でゲームもしたいから強めのゲーミングノート買った、みたいな事例もありました。

なおゲーム縛りで言うと Steam Play という仕組みによって Linux でも Steam で販売されているゲームがプレイできたりします。なんでもかんでも 1 つの OS で済ませたいという場合は検討してみてください。


iPad や Android タブレットで Cloud9 をアレするのはどうか

何かの縛りプレイとか性癖とかでなければ、一般的にパソコンと呼ばれているものを開発環境として使うことをオススメします。SSH + vim であれば最低限なんとかなるかもしれませんが、タブレットで IDE をアレコレしようとするのは割と体力・根気・その他諸々が必要です。

平成最後のクリスマスも近いですがやはり Web アプリ開発業務においてハードウェアキーボード(とマウス)はまだまだ必要ではないかという気がしますので、そのへん新元号になってからも何卒宜しくお願い致します。


Cloud9 って docker 動かないよね

AWS に買収されたことにより普通に EC2 インスタンスを使えるようになったので、現時点での Cloud9 は docker が動きます(旧来の Cloud9 はそれ自体が docker コンテナとして動作していたため無理でした)。

docker に限らず、Cloud9 や Nitrous などのクラウド IDE はちょっとした環境を作ってコーディングする程度であれば非常に使いやすいのでおすすめです。自分の場合はフロントエンドまわりやちょっとしたスクリプト作成、始めて触る言語の学習などを Cloud9 で完結させています。


ブラウザテストはどう考慮すべき?

Windows 環境だけど Safari のテストを書かなくちゃいけない場合にどうするか、みたいなのについては BrowserStack で解決できるかと思います。BrowserStack はそのまま CircleCI にも組み込めるので、CI の観点から見ても優れています。

Safari のテストをしたいがお金は出せないなどと言われてしまう場合は Safari にロックインせざるを得ないので macOS にするか転職しましょう。


どうしても決められないので何を買えばいいか指定してくれ

ライセンス的に、Apple ブランド以外のハードウェア上(仮想環境含む)に macOS をインストールすることが認められていない点「だけ」を考慮すると、一番つぶしが利くのは Mac 機ということになります。

他にも各 OS の差異は色々とありますが、大きな点としては上記のひとつぐらいかなと思われますので、何かそういう状況に陥りそうな気がしないでもない、という人は Mac にしておくのが無難かもしれません。Mac があれば Windows はなんとかなりますが、Windows だけだとそうはいきません。いや、まぁ、やる分にはやれますが。

Windows ラップトップの場合はモバイルワークステーションという沼もありますので、スペックマニアのスペキチの皆さんは是非ご検討下さい。


まとめ

肌感覚として、導入から運用まで一番手間がかからないのは macOS で、これは今なお変わらない評価です。なので無理に macOS から離れるのが果たして得策なのだろうか、という思いも正直なくはないです。

ただ Windows も WSL のブラッシュアップが進んで行けばかなり肉薄できるのではないかという感じもします。そういう意味ではどっちもどう転ぶかわからんから究極的には Linux しかないのではというのが正直なところで、果たしてこういう記事にどんな意味があるのか、というところまで言及していきそうな勢いですが、そのへんは何卒ご了承ください。

ちなみに自分は macOS → Windows に変更しました。