i@yujinyan.me

Blog

MacBook Pro 一周体验记

硬件

工业设计

不得不说 MBP 的一体化机身和金属材质带来的高档感很难在 Windows 阵营中找到。Dell 对标 MBP 的高端货 XPS 系列上次去实体店观察了一下有些令人失望,屏幕和 C 面连接处的转轴太碍眼,碳纤维的材质也没有想象中那么惊艳。找来找去好像也只有微软家的 Surface Laptop / Surface Book 可以跟 MBP 媲美。

屏幕

传闻 MBP 的屏幕素质好,实际体验确实也没什么好抱怨的,不过跟 Surface Pro 4 相比似乎优势也没那么明显。习惯了各种移动设备的高分屏肉眼能看出屏幕像素稍微低一点,真要把脸贴到屏幕上能感受到像素颗粒感。Surface 修好了以后又对比观察了一下,MBP 的屏幕反光比 Surface 好很多,可能是有什么抗眩光图层之类的东西。 Surface 像照镜子一般,反射的影像特别清晰。相比之下,MBP 的反光稍微暗淡一些,但还是反光。在公司超强日光灯照射下,如果用上暗色的编辑器主题会特别糟糕,眼睛很难受。本来想跟 Surface 一样贴一张磨砂膜,猜猜不肯,只好作罢。后来发现把屏幕放到和 C 面垂直的位置,然后亮度调高一点可以稍微减轻这个问题。

键盘和 TouchBar

之前没有果断买 MBP 的一大原因是它臭名昭著、毫无手感的键盘。我比较习惯用微软的巧克力键盘,惯用 Surface 人体工学键盘。这种键盘指尖稍稍用力即可触动按键,键程和回馈都恰当好处,不像机械键盘那样要将手指戳进去一般,还时不时担心误触的问题。

不过猜猜借我的 2018 款 MBP 配备了新一代蝶式键盘,按键手感确实比之前好得多,虽然键程不长,但是按键的回馈非常劲道。用下来似乎先前十分担心的键盘不给力的问题并不是很大,虽然体验跟我的人体工学键盘(甚至是 Surface 键盘盖)还是相去甚远。

另一个键盘相关的问题是没有了 esc 键。很不幸,这个问题对于我这样的 vi 党来说确实是难以忍受,一周下来还是非常不习惯。vi 编辑器在普通模式和输入模式之间用 esc 键切换是非常高频的操作。MBP 加了 TouchBar 之后,esc 被挪到了 TouchBar 最左侧,按上去没有任何回馈和触感。每次切换模式都得怀疑一下到底有没有按成功,有时候还会忍不住多按两下,原本行云流水般的操作被割裂,削弱了尽在掌控之中的感觉。

说到 TouchBar,能够用到的场景不是很多,有一点儿鸡肋。用得稍多的是调节音量和亮度,其他一些比如 Safari 里的切换 tab、输入法的词汇提示、代码编辑器的快捷运行等等基本不大会用。一般使用 MBP 的 power user 难道不是快捷键都用得飞起吗?所以希望苹果能够还我们 esc 键,比如可以把 TouchBar 缩短一点,留出 esc 的位置来。我甚至也不介意把触控板稍稍缩小一点点,然后还原第一排按键,把 TouchBar 往上挪一挪。

UI 与交互

高光和投影

Mac 精美的 UI 对外貌协会充满了诱惑。特别喜欢窗口底下的那一层弥散投影,在凸显 UI 层次的同时提升了整体质感,微妙轻盈。这次使用还注意到窗口四周还有一层高光和描边,光线感更加强烈,与背景的区分也更加明显,不会和阴影以及深色的背景糊在一起。

Mac 窗口上的半透明磨砂材质也非常惹人喜爱。换上色彩鲜艳的壁纸,缤纷的颜色透过半透明的材质弥散开来,像雨天透过玻璃看外面朦胧的世界一样。这种效果已经被微软在其 Fluent Design 里头抄去了,在 Windows 下也可以体验到。Windows 下这个叫「亚克力」材质,在 UWP 平台下有 API 可以调用。Windows 的亚克力没有 Mac 的高光和弥散投影,看上去像薄薄的一层塑料片,但是和 Mac 比起来高档感还是差了一点点。我觉得可以先把投影加上。现在 Windows 下的投影给得太小气,而且略显生硬,不够弥散。也许亚克力这种材质本身不会产生很大的投影效果?可是人家就是投影嘛,还是希望快快加上。

更加遗憾的是现在精品 UWP 应用还是太少,连最常用的系统自带资源管理器都还是老旧的 Win32 UI。 很多找出来的精品 UWP 应用似乎都是有情怀的个人开发者的作品。macOS 在整体 UI 上要统一和谐得多。现在许多新的桌面 app 为了方便多端复用、降低成本用基于 Web 技术的 Electron (或者其他什么框架)来开发,比如钉钉、Visual Studio Code 等等,专门做面向普通消费者的原生桌面应用似乎已经很少了。

Mac App Store 里的推荐界面印象特别深刻。最近现代桌面 app 的 UI 好像比较流行降低按钮、开关等组件的比例,加入更多高清大图,营造沉浸式的体验。比如这里 full bleed 的图片像印刷的杂志一样视觉冲击力非常强。

Windows Vista 出来以后玻璃材质很流行,Mac 的 Dock 应该还是 3D 玻璃的形状。那个时候还记得在 Windows 下用 Stardock 家的 ObjectDock 还有 RocketDock 之类的软件做美化。除了放在底部的 Dock,还有放在屏幕右侧的侧边栏。Windows Vista 还自带了右边栏。那个时候就喜欢在屏幕上放上一大块“玻璃”,挂上日历 📅 、相册等等小部件(Widget,这个癖好保留到了现在用的 Android 系统)。这些 UI 基本都遵照拟物的风格。在 Dribble 上常常惊叹 UI 设计师们的 PS 功力,一个小小的图标可以画得像真得一样。后来记得突然 iOS 7 发布以后刮起了一阵扁平风,Windows 8 推出了 Metro 设计系统,搞大色块磁贴。阴影、光线和质感全没了,记得 iOS 7 里的几个自带图标(好像是语音便签)之类丑得难以置信,像是设计师随便划拉记下做出来的图标,一点儿不走心,直到现在还是觉得丑。

后开 Google 推出了 Material Design,微软推出了 Fluent Design,都突出了光影效果和质感。Material Design 取纸片的隐喻,但其实还是类似厚纸板的东西,普通一张薄薄的 A4 纸似乎也不会形成那种光影的质感,所以还是一种在只存在于数字世界的特殊物质,只不过从现实世界汲取灵感,遵循一定的物理规则,用户能够借助现实世界的直觉更加容易地区分 UI 组件之间的关系。

最近移动端 app 好像不怎么流行 Material Design 这种重阴影了,许多 Google 官方 app 里卡片组件的阴影被线框代替。在小屏上卡片这种组件可能会显得比较重,喧宾夺主。所以说,Material Design 可能在大屏上效果会更好,而大屏上的光影质感还是 Mac 做得最为优雅。

遗憾的是国内的 UI 设计好像不怎么讲究光影质感,直接一个个方块糊在一起,或者为了吸引眼球搞一些大红大绿的浮夸渐变。审美好的人看过美的东西以后再看这些粗制滥造的产物真的是难受。

Dock

前面提到曾经一度热衷于在 Windows 上装模拟仿照 Mac 的 Dock 软件。那么正宗的 Dock 体验怎么养呢?感觉下来颜值挺高,逻辑复杂。固定在 Dock 上的图标打开以后有的时候会在右边以窗口预览的形式显示另外一个小图标,这个窗口预览图标和原来固定在 Dock 上的图标是啥关系似乎并不是非常明显,至今也没完全搞清楚,没有 Windows 里头任务栏一一对应的关系直截了当。Dock 也没有 Windows 那种预览标题和鼠标悬浮现实缩略图的功能,在易用性上是要差一些的。不过 Dock 上标志性的阿拉丁神灯特效和风筝特效还是看起来非常惊艳。讲道理 UI 动画一般比较微妙含蓄,这么浮夸的动画看起来倒也自然酣畅,不低级油腻,真是非常经典的创意了。

开发体验

据说程序员标配 Mac,实际体验下来跟 Windows 差不太多,可能要略好一点。

终端

好的地方在于 Mac 有 Unix 的基因,在终端下可以无缝使用 bash,很多情况下跟 Linux 终端体验比较接近。比如可以直接在终端里使用 open 命令,其效果和在资源管理器(哦不对,是「访达」)双击打开一样。Windows 10 的 WSL (Windows Subsystem for Linux) 也可以提供 Linux 终端体验,但是比较黑魔法,比如要实现前面的 open 命令还得间接得去调用 PowerShell 或者 cmd。印象中 PowerShell 蛮优雅,但是一直没什么动力去完整学一遍,毕竟平时 Linux 服务器用得比较多,PowerShell 用得不多,学了也容易忘。

Mac 下默认的终端模拟器已经很好用了,后来一直用 iTerm2。这两个软件美化起来都非常简单,直截了当。终端我比较喜欢用 sindresorhus/snazzy 主题,很容易就用上了。

相比之下 Windows 下的 CMD 和 PowerShell 要做美化麻烦得多。中文 Windows 控制台默认用的宋体真的是难看至极,换字体的菜单找不到装的编程字体,微软雅黑也没有。后来经过一番搜索才知道可以用 更纱黑体 。控制台的配色方案也很难切换,后来又是经过一番搜索得知官方有 colortools 工具可以下载使用。哎,难道换个主题不能直接集成进去?用了 colortools 以后重新打开控制台主题会消失。这个问题至今还未解决,也实在是麻烦得不高兴搞了…

不过还好,Windows 下也有不少第三方终端模拟器,比较喜欢的包括 ConEmu,hyper 和 Fluent Terminal。ConEmu 有点儿像 iTerm2,可以设置的选项非常多,不过用了老旧一点的 Win32 的 UI,把条条框框隐藏掉一点会稍微好看一些。hyper 是 Electron 的 app,颜值比较高,但是 Electron 费内存。Fluent Terminal 和 hyper 都是基于 xterm.js,但是套了个 UWP 的壳,加了磨砂玻璃(亚克力)的透明效果。(另外还有一款 Terminus 也支持磨砂玻璃效果。我一度觉得磨砂玻璃非常适合做终端的背景,实际用下来文字可读性可能会稍微变差一下,很多主题在磨砂玻璃的背景上效果会大打折扣。)Windows 下的终端软件在美化、自定义这些方面倒也比 Mac 差不了多少,但用的时候各个软件都有各自的毛病。iTerm2 好像用 tmux 的时候好像也遇到了点毛病,但是比 Windows 下的兄弟们整体要顺畅点。

还有一个小细节,Mac 键盘上有 cmdctrl 两个键。刚从 Windows 转过来会有一点点迷糊,总结下来 Windows 里平时常用的 ctrl-cctrl-v 对应的是 Mac 下的 cmd 键,而终端里则是对应 ctrl-c(中断)、ctrl-v(vim 的 block 模式)。不知道 Mac 下的 cmdctrl 是从哪儿来的,对于终端使用来说十分优雅地解决了快捷键冲突问题。在 Windows 下往往需要按 ctrl-shift-c 之类的,不同终端模拟器默认快捷键还不一样,容易错乱,有的时候得按好几下才弄对。

PHP 开发

我司目前主要采用 Laravel 技术栈。先前在 Windows 下主要在 WSL 下开发。WSL 可以安装 Ubuntu 系统,和线上环境一致,用起来比较顺手,比虚拟机要轻便很多,不需要等待漫长的启动以及同步文件等等。WSL+Nginx+PHP-FPM 有个小小的坑,就是必须得在 Nginx 配置中加上 fastcgi_buffering off,不过已经配置好了就基本没啥大问题了。

在 Mac 下试了用 homebrew 直接装在本机的方案。homebrew 可谓大名鼎鼎,连我这个 Windows 用户都早又有耳闻(不过我本来就知道很多 Mac 用户都不知道的 Mac 软件)。homebrew 的体验也不是一帆风顺,当然这跟网络环境有一定关系。homebrew 的一些命名也是挺有趣的,什么 brew 啦,pour 啦,bottle 啦,感觉作者对喝啤酒 🍺 情有独钟。上次新闻听说他在 Google 面试由于无法在白板上反转二叉树被拒了,后来发 Twitter 吐槽了一番 …

总之经过一番摸索,学会了要愉快地使用 homebrew 得做完整三个配置,一个是更新 formula 索引

cd "$(brew --repo)"
git remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git

cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
git remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git

brew update

还有一个是更新 bottles 镜像

export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles

还有一个是临时关闭自动更新

HOMEBREW_NO_AUTO_UPDATE=1

brew install Nginx、MySQL 等都挺顺利。homebrew 有功能类似 systemd 的进程管理器,可以通过 brew start 等命令控制服务,并在系统启动时运行。 PHP 在 Mac 中有一个内置的 7.0 的版本,版本低了些,还是用 homebrew 来装。一开始用默认的 brew install php 装上了 7.3 最新版本,结果没想到这个版本的 cli 无法正确运行 psy,在 Laravel Tinker 输入命令回车后进程直接退出。后来装 7.2 版本在安装扩展的时候又遇到了一些麻烦。PHP (和其他软件)的配置文件和 Ubuntu 里的并不一样,组织方式也不尽相同,得进行一番重新摸索。

好像花了几个小时也没搞定,后来用了 Laravel Valet 。之前琢磨 Laravel 开发环境的时候有注意到这个为 Mac minimalist 准备的工具,当时看文档也没完全搞明白怎么回事儿。Valet 本质上依赖 homebrew 直接在 Mac 系统中安装依赖软件。使用 valet use php@7.2 命令可以方便地切换 php 版本,省得我们自己去折腾手动链接二进制文件。Valet 的 parklink 命令甚至自动接管了 nginx 的配置,为 Laravel 开发提供了开箱即用的体验。Valet 可以说是继承了 Laravel 框架充满魔法的风格,使用起来非常神奇。