Paternity Leave: Month 4

Michael Lynch

陪产假:第四个月

原文由 Michael Lynch 发布,订阅该博客

一句话总结

我得改掉拖延的毛病了。

本月亮点

  • 想方设法拖延写书。
  • 用模糊测试玩开源项目,玩得很开心。
  • 为一台用于软件开发的高端新台式机挑好了配件。

目标评分

每个月初,我都会定下当月想完成的目标。以下是本月的完成情况:

享受家庭时光

  • 结果:继续享受家庭时光。
  • 评分:A

在自主安排的陪产假期间,我依然在家庭时光与个人及职业项目之间保持平衡,乐在其中。

完成并发布Refactoring English的一章

  • 结果:写了一部分,但没有发布。
  • 评分:D

定这个目标时我低估了难度。几年前我就开始写这一章,之后断断续续回去改过。在我的印象里,这一章已经完成了 80%,但这次重新打开一看,感觉只完成了 20%。

这次我把进度推进到了大约 60%,但远没有做到全力以赴。

我得改掉写书时拖延的毛病

也许该换个字体

我开始写书的第一章,却总觉得网站平庸的设计让我分心。

我的图书网站用的是自己做的一套简洁主题,其实就是 Bootstrap 的默认 CSS 加上一些自定义样式。说不出具体哪里有问题,就是整体感觉不对劲。

于是我开始浏览自己喜欢的博客和网站,把它们的字体拿来在自己站上试试:

最适合图书网站的字体是 Concourse,于是我顺势把 Matthew Butterick 的所有字体都看了一遍。也是有生以来第一次,我没有用 Google Fonts 上的免费字体,而是花钱买了字体。标题用了 Concourse,正文用了 Heliotrope

我把 Refactoring English 网站的字体换成了 ConcourseHeliotrope

好字体带来的变化让我大吃一惊。感觉像作弊一样,我什么其他设计都没改,网站看起来却好了三倍。

也许该做个封面

换上漂亮的新字体后,我又开始琢磨起书的封面。我本来就打算在出版前请人设计封面,不如现在就做了。有个好看的封面,也会吸引更多人关注。于是我写了一份封面设计需求说明,并请了一位设计师来做。

也许该回到之前的想法

几天后,我收到一位读者的邮件,问能否付费获取《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

openc2eCreatures 游戏系列的开源重制版。

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 来开发,虽然大多时候没问题,但这种非主流的方式偶尔还是会出点岔子。

然后在过去一年里,发生了两个变化:

  1. 我发现自己想要的软件几乎在 Linux 上都有了。我对微软在 Windows 中越来越强的遥测和广告感到厌烦,已经准备好换到 Linux。
  2. 自从发现了 Nix 的按项目隔离开发环境后,我就不再使用按项目划分的虚拟机了,而是在一个装有 Nix 的 Debian 虚拟机里完成所有开发。

这两个变化意味着我不再需要虚拟机服务器和 Windows 台式机了。我打算精简为一台运行 NixOS 的 Linux 台式机,毕竟过去几个月我在 Framework 13 笔记本上用 NixOS 的体验一直很好。

把两台机器精简为一台,是个经济上很理智的选择,而这正是我说服自己在这套新机器上超预算的理由:

配件旧主机新主机
CPUIntel Core i7-4790KRyzen 9 7950X
主板ASRock X99 Extreme4Gigabyte X870 Aorus Elite
显卡ASUS GeForce GTX 970 STRIX 4GBMSI RTX 4060 Ventus 2X 8GB
内存G.SKILL Ripjaws 4 32GB DDR4G.Skill Trident Z5 RGB 64GB DDR5
存储Samsung 980 PRO 2 TBCrucial T705 2TB
机箱Cooler Master HAF 912Fractal Design Define 7 Compact
电源Corsair HX750i 750WSilverStone Platinum PS-ST55F-PT 550W
CPU 散热器Noctua NH-U9DXi4Noctua NH-U12S redux
显示器LG 34UMP95 34"Samsung Odyssey OLED G9 49" Ultrawide
显示器支架AmazonBasics Monitor ArmErgotron 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,它正好满足我的需求。它可以通过图形界面定义分区,然后用快捷键或鼠标把窗口贴靠到这些分区上。

我的四个分区是这样设置的:

  1. 1000x1440px - 主 VS Code 窗口
  2. 1000x1440px - 副 VS Code 窗口
  3. 1560x1440px - 主浏览器窗口
  4. 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》的封面设计。

本文章由 muse-spark-1.2-contributor 进行翻译

评论