Paternity Leave: Month 4

Michael Lynch

育嬰假:第四個月

原文由 Michael Lynch 發布,訂閱此部落格

一句話總結

我得改掉拖延的毛病。

亮點

  • 我找到了各種方法來拖延寫書。
  • 玩開源專案的模糊測試玩得很開心。
  • 為軟體開發挑選了一台新的高階桌機零件。

目標成績單

每個月月初,我都會宣告這個月想完成的事。以下是這個月的達成情況:

享受家庭時光

  • 結果:持續享受家庭時光。
  • 成績:A

這段自己安排的育嬰假期間,我持續在家庭時光與個人及工作專案之間取得平衡,樂在其中。

完成並發表 Refactoring English 的一個章節

  • 結果:有在寫,但什麼都沒發表。
  • 成績:D

我當初訂這個目標時太低估它了。好幾年前我就開始寫其中一章,之後斷斷續續回去改。在我的印象中,那一章已經完成了八成,但這次回去看,卻感覺只完成了兩成左右。

這次我把進度推進到大概六成,但投入的專注度其實還可以更高。

我得停止在寫書這件事上拖延

也許我需要換一套字型

我開始寫書的第一章,卻一直被網站平庸的設計分心。

我的書的網站用的是我自己做的一個簡潔主題,其實就是 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》的重製版先完成。

也許我該專心一點

到這個時候,我才發現自己找了一大堆事情來做,就是沒有在寫書。

很容易分心,因為把書寫完感覺是個非常遙遠的目標。而且因為這是一本關於寫作的書,我總覺得自己的文字必須完美,結果就一直卡在反覆雕琢字句上。

我想,等我發表第一個範例章節、看到讀者的回饋後,對這本書的感覺應該會更踏實。在那之前,我就先硬著頭皮繼續推進。

模糊測試超好玩

撇開上一節不談,上個月我在模糊測試上玩得非常開心。

十一月的大部分時間裡,我在等三個月大的寶寶夜裡第一次醒來時,有幾個小時的空檔,時間長短不一定,可能是把他哄睡後的一到四小時。這段時間很難專心寫程式,因為整天累了,而且隨時可能被打斷,但卻非常適合做模糊測試。模糊測試不太需要高度專注,大部分只是在反覆嘗試把環境架起來。

對 openc2e 做模糊測試

Nix 讓模糊測試工作流程的架設變得非常簡單,我覺得大家好像還沒發現這件事。

有天晚上,我讀到一篇關於對 Facebook 發布的某個隨機開源工具做模糊測試的部落格文章,於是我花了一小時用 Nix 把那個模糊測試流程重現出來

幾天後的夜裡,我又花了幾個小時為 openc2e 寫了一個 fuzzer,openc2e 是《Creatures》遊戲系列的開源重製版。

openc2eCreatures 遊戲系列的開源重製版。

1996 年的原版 Creatures 包含了一套自訂的腳本語言和對應的虛擬機器。這個語言叫做 Creatures Agent Object Script(CAOS),讓玩家可以為遊戲製作自訂的外掛程式。

CAOS 是一種低階語言,看起來有點像組合語言:

SETS VA00 "he"
ADDS VA00 "llo"
DBG: ASRT VA00 eq "hello"

愛好者們在 openc2e 裡重新實作了 CAOS 直譯器,我懷疑從來沒有人對它做過模糊測試。但它其實很值得測,因為如果你安裝外掛,它就會去解析不受信任的第三方程式碼。

我先從 CAOS 語言的詞法分析器(lexer)開始測,馬上就發現一堆當機。

開始模糊測試不到一分鐘,我就在 openc2e 裡發現了 20 個不重複的當機。

其中一個當機只是因為一個沒有結尾的雙引號,這更證實了我的猜測:這段程式碼從來沒被模糊測試過。

* The following line crashes openc2e's CAOS lexer.
"

我發了一個 pull request 修掉最簡單的那個當機,還附上單元測試來展示修正,但這個專案有點半荒廢了,可能要過一陣子才有辦法把所有修正都合併進去。希望他們最後有時間審核,因為我覺得這個 PR 做得還不錯。

模糊測試代表你可以隨心所欲

用 Nix 做模糊測試最有趣的一點,就是你可以隨意擺弄底層專案,完全不會打擾到任何人。

當我試著對 openc2e 做模糊測試時,發現我想連結的程式碼被編進了一個不太好連結的物件檔裡。我本來還在想該怎麼連結,後來才意識到,我直接在自己的 repo 裡 patch 他們的 Makefile,想怎麼改就怎麼改就好了。

平常在貢獻開源專案時,如果我想做像把某個函式庫從私有改成公開這種比較大的更動,就得花很多時間搞清楚它一開始為什麼要設成私有,然後還要向維護者說明為什麼公開是合理的。但做模糊測試時,我只是在自己的沙盒裡玩,想怎麼搞就怎麼搞。

打造我的新開發用桌機

我打算對自己的軟體開發習慣來個大轉變:我要像個正常人那樣寫程式了。

大約十年前,我發現用 Linux 開發軟體比較方便,但主要作業系統還是比較喜歡 Windows。我的解法是在 Windows 桌機上用 VirtualBox 跑 Linux VM。為了避免依賴衝突(例如 Python 2 專案搞壞 Python 3 專案),我每個專案都用獨立的 VM。

2017 年,我受夠了每次重開 Windows 系統就得把所有 VM 全部重開,於是組了第一台 homelab VM 伺服器

到 2019 年,我已經全部改用 VS Code 加 Remote SSH 來開發,雖然大致上可行,但因為用法有點非主流,偶爾還是會出問題。

然後在過去一年,發生了兩個變化:

  1. 我發現自己想要用的軟體幾乎在 Linux 上都有了。微軟在 Windows 裡越來越侵入性的遙測和廣告也讓我越來越受不了,所以我準備要跳槽到 Linux。
  2. 自從發現了 Nix 的 per-project 環境後,我就不再用每個專案一個 VM 的方式,改成只在一個安裝了 Nix 的 Debian VM 裡做所有開發。

這兩個變化代表我不再需要 VM 伺服器或 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 吋的 Samsung Odyssey G9 是我的新桌機中最奢侈的一項。

我還清楚記得 11 歲時的那份喜悅——我爸從 CompUSA 回來,拿出一個裝著當時最大尺寸螢幕之一的盒子,大概是 17 吋的 CRT。他解釋說:「考慮到你盯著螢幕的時間這麼長,我們不如就投資一台好一點的。」順帶一提,我爸媽都是程式設計師,從小我就把大部分空閒時間花在電腦前。

從那之後,我就一直用我爸的邏輯來合理化買高階螢幕,這招一直很管用。我一年在電腦前待 2500 小時,平均下來,高階螢幕的成本根本微不足道。

而且,體驗過 5120x1440 解析度的 Hacker News 之後,我就回不去了。

沒用 5120x1440 的解析度逛過 Hacker News,就不算真正逛過。

學著使用超寬螢幕

我的新電腦零件還沒全到,但新螢幕已經先架好了。我很快就發現,需要一套新的視窗管理策略。

舊螢幕是 34 吋,我大多用 Win+Left / Win+Right 把視窗對半停靠。換到新螢幕有 5120px 寬之後,我想要一次能停靠兩個以上的視窗。

我試過 Komorebi,但覺得太複雜。後來找到 Fancy Zones,完全符合我的需求。它讓我可以透過圖形介面定義區域,然後用快捷鍵或滑鼠把視窗停靠到那些區域。

我的四個區域是這樣分的:

  1. 1000x1440px - 主要的 VS Code 視窗
  2. 1000x1440px - 次要的 VS Code 視窗
  3. 1560x1440px - 主要的網頁瀏覽器視窗
  4. 1560x1440px - 次要的網頁瀏覽器視窗

我通常只會停靠網頁瀏覽器和 VS Code 視窗,其他都是短暫使用的浮動視窗。

把 VS Code 限制在 1000px 寬很有幫助,因為我喜歡只開著編輯區。如果螢幕空間太大,我就會忘記把檔案總管之類的側邊面板關掉。但在 1000px 的寬度下,偶爾打開側邊面板會很明顯,用完後我就會記得把它關掉,回到專注在主編輯區的狀態。

VS Code 開著側邊面板(左)與只開編輯器(右)的對比

我本來以為自己不會在意 OLED 和 LED 的清晰度差異,但實際上我很能感受到差別。黑色更黑,讓整個畫面感覺更銳利。

同樣地,我本來也以為自己不會在意更新率,但 60 Hz 和 120 Hz 的差異我確實感受得到。螢幕支援到 240 Hz,但 Windows 不知為何沒顯示那個選項,等換到 NixOS 再來研究看看。

總結

完成了什麼?

  • 清理了部落格大量的樣板和 CSS 程式碼,並重新整理了首頁
  • 挑選並下訂了新的主要桌機工作站零件。
  • 處理了《Refactoring English》的一些設計元素。
  • 發表了一篇關於如何在 NixOS 上跑簡單服務的快速教學。

學到的事

  • 能讓你對其他專案套用自訂 patch 的工作流程,會帶來一種愉悅的自由感。
    • 你可以隨心所欲,因為這些改動只影響你自己。而且如果工作流程讓 patch 變得很輕鬆,你就不會覺得維護一個特別版本是種負擔。

下個月的目標

  • 完成《Refactoring English》的兩個章節。
  • 和設計師合作完成《Refactoring English》的封面設計。

本文章由 muse-spark-1.2-contributor 進行翻譯

留言