陪产假:第四个月
原文由 Michael Lynch 于 发布,订阅该博客
一句话总结
我得改掉拖延的毛病了。
本月亮点
- 想方设法拖延写书。
- 用模糊测试玩开源项目,玩得很开心。
- 为一台用于软件开发的高端新台式机挑好了配件。
目标评分
每个月初,我都会定下当月想完成的目标。以下是本月的完成情况:
享受家庭时光
- 结果:继续享受家庭时光。
- 评分:A
在自主安排的陪产假期间,我依然在家庭时光与个人及职业项目之间保持平衡,乐在其中。
完成并发布Refactoring English的一章
- 结果:写了一部分,但没有发布。
- 评分:D
定这个目标时我低估了难度。几年前我就开始写这一章,之后断断续续回去改过。在我的印象里,这一章已经完成了 80%,但这次重新打开一看,感觉只完成了 20%。
这次我把进度推进到了大约 60%,但远没有做到全力以赴。
我得改掉写书时拖延的毛病
也许该换个字体
我开始写书的第一章,却总觉得网站平庸的设计让我分心。

我的图书网站用的是自己做的一套简洁主题,其实就是 Bootstrap 的默认 CSS 加上一些自定义样式。说不出具体哪里有问题,就是整体感觉不对劲。
于是我开始浏览自己喜欢的博客和网站,把它们的字体拿来在自己站上试试:
- Jonas Hietala 用的是 Concourse 和 Century Supra,这是 Matthew Butterick 设计的付费字体。
- Xe Iaso 用的是 Iosevka Aile Iaso,据说这是她自己设计的字体。
- fasterthanlime 用的是 Atkinson Hyperlegible,这是布莱叶盲文协会免费发布的字体,因为它对视障人士更友好。
最适合图书网站的字体是 Concourse,于是我顺势把 Matthew Butterick 的所有字体都看了一遍。也是有生以来第一次,我没有用 Google Fonts 上的免费字体,而是花钱买了字体。标题用了 Concourse,正文用了 Heliotrope。


我把 Refactoring English 网站的字体换成了 Concourse 和 Heliotrope
好字体带来的变化让我大吃一惊。感觉像作弊一样,我什么其他设计都没改,网站看起来却好了三倍。
也许该做个封面
换上漂亮的新字体后,我又开始琢磨起书的封面。我本来就打算在出版前请人设计封面,不如现在就做了。有个好看的封面,也会吸引更多人关注。于是我写了一份封面设计需求说明,并请了一位设计师来做。
也许该回到之前的想法
几天后,我收到一位读者的邮件,问能否付费获取《Hit the Front Page of Hacker News》中未完成的课程。我把两份尚未发布的新课时和旧版课程的链接发给了他,他看起来对内容很满意。这让我开始考虑,要不要先暂停《Refactoring English》,回去把《Hit the Front Page of Hacker News》的改版完成。
也许我该专注一点
到了这一步,我意识到自己在找各种事情做,就是不去写书。
很容易分心,因为完成整本书感觉是个遥不可及的目标。而且这是一本讲写作的书,我总觉得自己的文字必须完美,结果就卡在字斟句酌上。
我想,等发布第一个试读章节、看到读者反馈后,我对这本书的感觉会更清晰。在那之前,我就继续硬着头皮往前推进。
模糊测试太好玩了
尽管有上一节那些情况,上个月我在模糊测试上还是玩得很开心。
11 月的大部分时间里,我会在哄三个月大的宝宝睡着后,等待他半夜第一次醒来,中间会有 1 到 4 小时的空档。在这段时间里,很难集中精力写代码,因为白天已经很累,而且随时可能被打断,但这正是做模糊测试的绝佳时机。模糊测试不需要高度集中注意力,大部分时间都是在反复尝试把环境搭起来。
模糊测试 openc2e
Nix 让模糊测试工作流的搭建变得很容易,而这一点似乎还没有被大家广泛意识到。
有一天晚上,我读到一篇关于对 Facebook 发布的一个随机开源工具进行模糊测试的博客,于是我花了一小时用 Nix 复现了那个模糊测试流程。
几天后的晚上,我又花了几个小时为 openc2e 写了一个 fuzzer,openc2e 是 Creatures 游戏系列的开源重制版 openc2e。

openc2e 是 Creatures 游戏系列的开源重制版。
1996 年的初代《Creatures》包含一门自定义脚本语言及对应的虚拟机。这门语言叫 Creatures Agent Object Script(CAOS),玩家可以用它为游戏制作自定义扩展。
CAOS 是一门看起来有点像汇编的底层语言:
SETS VA00 "he"
ADDS VA00 "llo"
DBG: ASRT VA00 eq "hello"
爱好者在 openc2e 中重新实现了一个 CAOS 解释器,我怀疑从未有人对它做过模糊测试。但它很值得测,因为一旦安装第三方扩展,它就会解析不受信任的代码。
我先从 CAOS 语言的词法分析器开始模糊测试,立刻就发现了一堆崩溃。

模糊测试不到一分钟,就在 openc2e 中发现了 20 个不同的崩溃。
其中一个崩溃仅仅是因为一个未闭合的双引号,这也印证了我的猜测——从来没人对这段代码做过模糊测试。
* The following line crashes openc2e's CAOS lexer.
"
我提交了一个 修复最简单崩溃的 pull request,并附上了演示修复效果的单元测试,不过这个项目已处于半废弃状态,可能要过一阵子才能合入我所有的修复。希望他们最终能抽空 review,因为我觉得这个 PR 很有意思。
模糊测试意味着你可以为所欲为
用 Nix 做模糊测试最有趣的一点,就是你可以随意折腾底层项目,而不用打扰任何人。
在尝试对 openc2e 做模糊测试时,我发现自己想链接的代码被编译进了一个不便于链接的目标文件里。正当我琢磨怎么链接时,突然意识到我完全可以在自己的仓库里给它的 Makefile 打个补丁,想怎么改就怎么改。
平时给开源项目做贡献时,如果我想做一个比较大的改动,比如把一个私有库改成公开,我得花大量时间去弄清楚它当初为什么设为私有,然后再向维护者论证为什么公开更合理。但做模糊测试时,我完全是在自己的沙盒里,可以随心所欲地折腾。
组装我的新开发主机
我正计划彻底改变自己的软件开发习惯:像个正常人一样写代码。
大约 10 年前,我发现用 Linux 开发软件更方便,但主系统还是更喜欢 Windows。我的解决办法是在 Windows 台式机上用 VirtualBox 跑 Linux 虚拟机。为了避免依赖冲突(比如 Python 2 项目搞乱 Python 3 项目),我为每个项目都建了独立的虚拟机。
2017 年,我厌倦了每次重启 Windows 都要把所有虚拟机也重启一遍,于是搭建了第一台家用虚拟机服务器。
到 2019 年,我已经完全通过 VS Code 加 Remote SSH 来开发,虽然大多时候没问题,但这种非主流的方式偶尔还是会出点岔子。
然后在过去一年里,发生了两个变化:
- 我发现自己想要的软件几乎在 Linux 上都有了。我对微软在 Windows 中越来越强的遥测和广告感到厌烦,已经准备好换到 Linux。
- 自从发现了 Nix 的按项目隔离开发环境后,我就不再使用按项目划分的虚拟机了,而是在一个装有 Nix 的 Debian 虚拟机里完成所有开发。
这两个变化意味着我不再需要虚拟机服务器和 Windows 台式机了。我打算精简为一台运行 NixOS 的 Linux 台式机,毕竟过去几个月我在 Framework 13 笔记本上用 NixOS 的体验一直很好。
把两台机器精简为一台,是个经济上很理智的选择,而这正是我说服自己在这套新机器上超预算的理由:
| 配件 | 旧主机 | 新主机 |
|---|---|---|
| CPU | Intel Core i7-4790K | Ryzen 9 7950X |
| 主板 | ASRock X99 Extreme4 | Gigabyte X870 Aorus Elite |
| 显卡 | ASUS GeForce GTX 970 STRIX 4GB | MSI RTX 4060 Ventus 2X 8GB |
| 内存 | G.SKILL Ripjaws 4 32GB DDR4 | G.Skill Trident Z5 RGB 64GB DDR5 |
| 存储 | Samsung 980 PRO 2 TB | Crucial T705 2TB |
| 机箱 | Cooler Master HAF 912 | Fractal Design Define 7 Compact |
| 电源 | Corsair HX750i 750W | SilverStone Platinum PS-ST55F-PT 550W |
| CPU 散热器 | Noctua NH-U9DXi4 | Noctua NH-U12S redux |
| 显示器 | LG 34UMP95 34" | Samsung Odyssey OLED G9 49" Ultrawide |
| 显示器支架 | AmazonBasics Monitor Arm | Ergotron HX HD |
在我的工作流中,磁盘往往是最容易成为瓶颈的地方,所以我在硬盘上买了最好的,虽然感觉有点奢侈。我只需要一块系统盘,因为大部分数据都在存储服务器上。
CPU 很快,但不是最顶级的。买 CPU 时,我会看跑分,尽量选那种性能达到顶级型号 80% 到 90%,但价格只有顶级一半或更低的型号。
最奢侈的是显示器。这是一块夸张的 49 英寸超宽 OLED:

49 英寸的三星 Odyssey G9 是新主机中最奢侈的部分。
我清楚地记得 11 岁时的喜悦,那天我爸从 CompUSA 回来,递给我一个盒子,里面是一台当时市面上最大的显示器,可能是一台 17 英寸的 CRT。他解释说:“考虑到你盯着显示器的时间,花点钱买个好的很值得。”要知道,我父母都是程序员,我从小大部分空闲时间都在电脑前度过。
从那以后,我就一直用我爸的这个逻辑来说服自己买高端的显示器,而且效果一直很好。我每年在电脑前要待 2500 小时。按每小时来算,高端显示器的成本几乎可以忽略不计。
而且,自从以 5120x1440px 的分辨率体验过 Hacker News 后,我就再也回不去了。

只有在 5120x1400px 的分辨率下刷过 Hacker News,才算真正体验过它。
学会使用带鱼屏
我的新电脑配件还没到齐,但新显示器已经先装上了。我很快就意识到,需要一套新的窗口管理策略。
旧显示器是 34 英寸的,我以前主要用 Win+左 / Win+右 把窗口贴靠到桌面的一半宽度。现在显示器有 5120px 宽,我想一次贴靠两个以上的窗口。
我试过 Komorebi,但觉得太复杂。后来找到了 Fancy Zones,它正好满足我的需求。它可以通过图形界面定义分区,然后用快捷键或鼠标把窗口贴靠到这些分区上。
我的四个分区是这样设置的:
- 1000x1440px - 主 VS Code 窗口
- 1000x1440px - 副 VS Code 窗口
- 1560x1440px - 主浏览器窗口
- 1560x1440px - 副浏览器窗口
我一般只会贴靠浏览器和 VS Code 的窗口。其他所有窗口都是短暂使用的悬浮窗口。
把 VS Code 限制在 1000px 宽度很有帮助,因为我喜欢只打开编辑区。如果屏幕空间更大,我就会忘关文件资源管理器之类的侧边栏。但在 1000px 下,我偶尔会打开侧边栏,但因为很显眼,用完后就会记得关掉,重新专注于主编辑区。


打开侧边栏的 VS Code(左) vs. 仅显示编辑器的 VS Code(右)
我本来以为自己不会在意 OLED 和 LED 在清晰度上的区别,但实际上我很在意。黑色更黑,让画面感觉更清晰。
同样,我本来以为自己不会在意刷新率,但 60 Hz 和 120 Hz 的区别我确实能感觉到。显示器支持 240 Hz,但 Windows 里不知为何没有这个选项,等换到 NixOS 后再去折腾一下。
收尾
完成了什么?
- 清理了博客的大量模板和 CSS 代码,并重新整理了首页。
- 为新的主力台式工作站挑选并下单了配件。
- 推进了 Refactoring English 的设计工作。
- 发布了一篇关于如何在 NixOS 上运行简单服务的快速教程。
经验教训
- 能让你对其他项目打自定义补丁的工作流,会带来一种自由的愉悦感。
- 你可以为所欲为,因为改动只影响你自己。而如果打补丁的工作流足够顺畅,你就不会觉得是在为构建一个特殊版本的代码而负担额外成本。
下月目标
- 完成《Refactoring English》的两章。
- 与设计师合作,完成《Refactoring English》的封面设计。
随机一篇博客
评论
登录后参与讨论