WSL如何帮我从MacOS回归Windows
本人最早的苹果设备是2011年入手的13寸 MacBook Pro(2010年上半年款),当时大三,刚去工作单位实习几个月,主要用ObjC/C++开发手机游戏。随后2012年的又添一部iPhone4正好与mbp联调,第一次感受到同品牌设备一体化联动给开发带来的便捷。从此开启了往后10多年沉迷于苹果全家桶的程序员职业生涯和作为一个脑残果粉的信仰之旅。10年多来用我个人苹果账号登录过的我自己的和公司的苹果设备没有一百也得有八十,覆盖了除了垃圾桶和刨丝板之外的苹果全部产品线。
时间来到2023年,早已习惯了在苹果生态里工作生活娱乐的我,已经在一年前决定逐渐跳出苹果全家桶的舒适陷阱,用小米12换掉了iPhoneX,用小米手环换掉了装饰性大于功能性苹果手表,今年终于决定跟最难割舍的mac开发环境说再见,将我的16寸2019款Intel处理器的mbp退居二线,并且最终使用Win11台式机平替成功。
为什么想要说再见?其实很单纯,因为穷。高情商说法是,不想继续承担品牌带来的溢价,和完全没用的虚高配置的多媒体硬件(如高画质的屏幕、高音质的音响、麦克风)带来的溢价。作为一台办公开发设备,我的mbp常年是合盖的状态,在公司和家里用都是架在散热器上,那块超高素质的大屏幕只有偶尔出差或开会的时候才能略见些天日,同理音响系统和麦克风也是毫无用武之地。而如果把这些虚高配置的价格等价到对我更有价值的CPU或显卡上,则无疑对生产力会有相当大的提升。
前两年有一个尴尬的场景成了我改变对mac盲目喜爱的转折点。我当时在用Unity开发开发的一个3D游戏。我开始是在mbp的macOS系统开发,性能表现很不好,fps30帧都勉强。而后来偶然地在同样这台电脑的Win10系统里运行了一下,性能好了很多,fps60帧维持5-10分钟没问题,但几分钟后,在盛夏开着一点空调的房间里,风扇开始疯狂工作,fps应声掉到30以下(后来实测冬天会好一点点)。这就让我产生两个疑问:一是我是知道双显卡的mbp会在一定条件下从独显切换到集显,但这个切换临界点具体是怎样的呢?二是为什么同一台机器macOS系统下图形处理性能会弱于Windows系统呢?问题目前还没找到答案,但当时我已经确定在3D游戏开发这一块,MacBook Pro和macOS暴露出了短板(至少在Intel处理器时代是短板),即散热问题和系统对AMD显卡的调度使用策略问题(对自家显卡可能调度的会更自如一点吧)。
另外,仔细想想我在移动办公的场景下都在用MacBook做哪些事呢?收发邮件、撰写博文、连投影展示PPT、死盯着一块代码找bug,这些事有哪个是非MacBook才能做的吗,难道不是随便一个轻薄本或致多一个iPad就能搞定的领域吗。所以以我目前的观念,严格来说笔记本电脑整个品类都处于很尴尬的赛道,可能只有在移动环境下需要重度办公的人群最不可或缺。
所以Windows能实现平替masOS吗?想回答这个问题就要先问自己macOS哪里好,哪个功能让你舍不得离开?我自己总结如下:
* 先说最重要的一点,macOS是基于Unix的,天生更适合软件开发。具体一点:
* 兼容sh语法和大多linux命令行。大多github开源项目里给linux环境写的自动化sh脚本都可以直接运行。
* 系统默认编码是UTF8/UTF16这种国际通用编码,而Windows里是专为中文设计的GBK编码
* 文本文件的换行符是与linux兼容的“\n”,而Windows里是的“\n\r”。
* 路径分隔符是与linux兼容的正向斜杠“/”,而Windows里是反向斜杠“\”
这些小区别看似影响不大,但会给开发者带来很多不便,花大量时间修改代码来兼容这些不同点。
* 第二是macOS在大多数情况下稳定性更好。这一点我相信更多的是主观使用感受而没有什么理论支撑。我猜测原因是因为苹果电脑大部分是一体机,而家用PC为了方便升级大部分都是组装机,可插拔的硬件接口必然不如焊丝在一起的硬件运行稳定。另外苹果的软件生态管理严格,用户量又没有Windows多,所以恶意程序、广告插件都相对较少。
只有遇到过写了一晚上的代码或文档因为一个突然蓝屏瞬间全丢的崩溃之苦的打工人,才能彻底的明白一个稳定的工作环境到底有多重要,多省时间。
* 最受果粉赞誉的一点:多设备协同工作带来的便捷,是目前其他品牌设备无法平替的(鸿蒙不知道做的咋样)。这里说的协同包括和iOS共享剪贴板、应用接力、隔空投送、共享屏幕、投屏、iPad随航、和iPad共享键鼠等等。经过苹果多年的迭代,某些功能甚至达到润物细无声的程度,你享受着他的便捷却不一定知道他的存在。
* 还有就是很多苹果独占的软件是肯定没办法替代的。比如对移动开发者来说,只有macOS的XCode能开发、打包和发布iPhone游戏和应用。这是垄断,但也是人家自家品牌的权利,没办法。
这些好处几乎无法在一台Windows系统的PC上同时找到替代方案,所以我以前宁可顶着Mac系列电脑的溢价也没有尝试回归Windows的信心,直到WSL(Windows Subsystem for Linux)的出现。WSL直接解决上面说的好处里我最看重的第一大点,甚至与Linux的兼容性胜过macOS。下面分享一下我是如何使用WSL作为我的开发环境的。
* 服务端开发、web开发、命令行工具或脚本开发相关的工具,这些不需要图形界面的开发工具,全部安装在WSL里,如JDK,Nodejs,dotnet,gcc,python等等,基于这些工具开发的项目代码也放在WSL里。VS、VSCode和JetBrain等名牌IDE的Windows版都专门给在WSL环境下开发提供了完美的支持。需要注意将这些IDE的默认编码和换行符设置为Linux风格。
* 安装Docker,并对WSL可见。所有服务器和Web项目需要测试时,都先要实现容器化,然后通过容器暴露的端口访问服务。因为容器需要暴露的端口都会被Docker自动设置为由Windows的同端口转发给容器。(如果懒得做容器化,也可以使用Windows批处理命令做转发。)
* Unity、CocosCreator、Android Studio这类需要界面引擎的开发工具安装在Windows里。项目代码也要放在Windows里。从WSL2开始,Windows和WSL文件系统的互相访问速度减慢了不少,所以不建议把代码和开发工具分开存放。
* 在Windows里使用远程访问将WSL根目录映射到驱动器。这样Windows里的图形界面工具也可以访问到WSL里的文件了,比如SourceTree,我是安装在Windows里,而用它提交Windows和WSL里的代码都是可以的
这样一番操作下来,基本实现了用Windows开发需要图形界面的客户端项目,而用WSL开发其他不需要图形界面只需要码代码的项目。而需要发布到苹果平台的时候,就只能再配一台一般配置的Mac mini了。
稳定性的问题分为软件层面和硬件层面。硬件层面不必多说,组装斤尽量减少插拔,注意环境卫生情况,多清清灰。软件层面少装来路不明的软件,少装带广告带弹窗的软件比如360、鲁大师、flash player、搜狗浏览器这些,尽量从官网下载和购买正版软件。用自己肉眼识别来代替苹果生态对软件严格的审核。
回归Windows后,我还收获了一个以前没有想到的使用体验,那就是WSA(Windows Subsystem for Android),也就是Windows原生的Android模拟器。直接双击打开apk安装,安装之后就和一般的Windows应用一样使用,同时调试起Android应用来也非常方便快捷。要是能再研究一下如何安装Google Play三件套框架就几乎完全可以替代真机调试了。
除了工作以外,Windows的游戏性能更是不必多说,加上台式机散热好,在Macbook上跑起来又热又卡的游戏在硬件参数甚至低很多的Windows台式机上都能顺畅运行。现在工作休息之余还能开两局久违的星际2(国服没了,只能买了加速器去亚服玩)。只能说是真香。