Refactoring English: Month 2

Michael Lynch

Refactoring English:第二個月

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

一句話總結

在 AI 革命的當下,我還該寫書嗎?

重點整理

  • 我開始懷疑自己是否該置身於 AI 革命之外。
  • 在投入更多時間之前,我得先向自己證明真的有顧客願意為這本書付費。
  • 我大概是全世界最後一個才發現用 RSS 讀部落格很棒的人。

目標評分

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

發表 2024 年的年度回顧部落格文章

我對這篇的成果很滿意。因為這一年由好幾個我已經寫過的重大事件拼湊而成,一開始很難決定該寫些什麼,但最終的結果算是對這一年的不錯總結。

它曾短暫登上 Hacker News 第一名,但突然被降到第 63 名,我也不太清楚原因。

完成書中的另一個章節

實際完成的比預期多一點,因為原本沒打算加上測驗。這個測驗稱不上完美,但把文字內容結合一點互動性,感覺挺有趣的。

根據讀者回饋修改教學章節

我根據讀者的建議做了一些細部的文字修正,但最大的改動是新增了一整節。好幾位讀者希望能有關於如何在範例中使用實用假資料的指引,我也覺得這確實應該納入文章中。

在 AI 革命期間寫書是不是很蠢?

對我來說,很明顯 AI 正在軟體開發領域掀起一場革命。

現在的 AI 模型已經具備稱職的初階工程師水準。以它們進步的速度,兩年內在大多數程式設計任務上,AI 將會超越最頂尖的人類。

我預期整個軟體產業將會圍繞著 AI 進行重組。在我有生之年,最接近的類比就是從桌機軟體轉向網際網路的那次轉變。

我現在沒有工作、也不用經營公司,所以有完全的自由去做任何想做的事,來搭上這波 AI 發展的順風車。

而我卻在寫一本跟 AI 完全無關的書……

我不想只是盲目追逐最新、最炫的東西,但同時也覺得,缺席這場 AI 革命,就像在 90 年代末看到網際網路興起時,卻說:「我想把軟體燒成光碟,讓顧客透過郵購來訂購。」

當初選擇專心寫書的理由至今依然成立,只是機會成本比我半年前規劃時預期的還要大得多。

這本書真的有市場嗎?

另一個問題是,寫這本書是一項長期的投入,但我還沒把握真的有人想讀。

釋出的第一個章節獲得不錯的迴響,但那是比較有趣、受眾廣泛的章節。我擔心像〈Passive voice considered harmful〉這類章節,比較像是「吃青菜」式的功課。大家或許知道它有益,但讀起來並不有趣。而且像 Hacker News 或 reddit 這種我常出沒的地方,也不太可能推薦一篇談被動語態的文章。

問題是,我書中的大多數章節都是這種「吃青菜」型的內容。

我可以重新調整結構,把「把文章大聲唸出來」這類技巧放進部落格寫作的章節裡,但這樣不太合理,因為這個技巧適用於各種寫作,不只限於部落格。

但或許是我的切入角度錯了。瀏覽網頁的人大概不會想點開一篇談被動語態的文章,但如果他們已經決定要讀一本關於有效寫作的書,大概就會願意讀那個章節。

我原本以為在網路上免費釋出的試讀內容,必須和書中的章節一字不差,但其實不需要這樣。我可以隨意為網路調整內容,所以就算在部落格寫作的試讀章節裡談「大聲朗讀」,也沒關係。在正式的書中,我可以把這個技巧安排在別處,而不是放在部落格章節裡。

不過,在繼續投入好幾個月的時間之前,我還是得先驗證這本書是否真的有付費讀者。所以我的計畫是,先專注完成另一個有趣、容易入手的章節,像是〈Write blog posts that developers read〉,然後以頭三個章節為基礎,在 Kickstarter 上開放預購。我得設定一個我認為合理的最低預購門檻,來決定是否值得繼續寫下去。

後知後覺:RSS 真的很棒

RSS 已經存在 25 年了,但我從來沒有養成用 RSS 讀文章的習慣。

我在 2011 年試過 Google Reader,但當時訂閱的內容不夠多、不夠有趣,所以後來就沒再打開,漸漸也忘了它。

過去幾年,有幾件事讓我對 RSS 重新產生興趣:

  • 我以前在 Twitter 上追蹤的科技圈人士,現在都分散到不同的平台了。
  • 我也越來越意識到,社群媒體更傾向於放大譁眾取寵的貼文,而不是有趣的技術內容。
  • 我把作業系統換成了 NixOS,讓我可以輕鬆地自行架設免費、開源的 RSS 閱讀器
  • 我發現自己不喜歡用 Email 訂閱部落格,因為那會塞爆收件匣,還會讓我在不想閱讀的時候,產生非讀不可的壓力。
  • 隨著 AI 產生的粗製濫造內容充斥網路,我更想追蹤自己真正喜歡的特定作者。

於是我安裝了fusion 這款 RSS 閱讀器,結果發現它成了我最喜歡的閱讀新文章方式之一。現在只要在社群媒體上看到喜歡的部落格文章,我就會去瀏覽那個作者的其他文章;如果發現他寫的東西很對我的胃口,就直接加入我的訂閱清單。

我最近開始使用 RSS 閱讀器 fusion 來追蹤感興趣的部落格

業餘專案

wordword:在部落格文章中找出詞彙幻覺

我最近讀到 Matt Might 的一篇部落格文章,他在裡面解釋了「詞彙幻覺」(lexical illusions)的概念。指的是你在閱讀時,沒有察覺到文字中重複的單字,例如:

Many readers are not aware that the
the brain will automatically ignore
a second instance of the word “the”
when it starts a new line.

我在寫部落格時常犯這種錯誤,所以想做個工具來自動幫我揪出這類問題。

這個工具我很大程度是靠Cline 這個 AI 助理完成的。我覺得既驚艷又有點害怕,Cline 根據我的提示和測試案例來實作工具的能力竟然這麼強。

而且這個工具效果很好。我用它在已經發表的文章中找出了七個詞彙幻覺

# Find lexical illusions (and also some false positives like "Duck Duck Go").
$ wordword ./content/
./content/retrospectives/2019/11/index.md:114: the
./content/retrospectives/2022/05/index.md:175: Duck
./content/retrospectives/2022/05/index.md:175: Duck
./content/retrospectives/2022/05/index.md:175: Duck
./content/retrospectives/2022/05/index.md:175: Duck
./content/retrospectives/2022/05/index.md:177: Duck
./content/notes/nix-git-bash-shell/index.md:78: time
./content/notes/cypress-vs-playwright/index.md:278: makes
./content/posts/simple-vue-pre-rendered/index.md:36: for
./content/posts/bootstrapped-founder-year-6/index.md:132: case
./content/posts/ansible-role-clipbucket/index.md:83: a
./content/posts/bootstrapped-founder-year-1/index.md:177: NOW
./content/posts/bootstrapped-founder-year-1/index.md:177: NOW
./content/book-reports/chaos-monkeys/index.md:8: names
./content/book-reports/go-programming-blueprints/index.md:50: of
212 total files checked
15 total errors found

我已經把 wordword 加到部落格的CI 建置流程git pre-commit hook 中。

而且因為是用 Zig 寫的,速度非常快。它檢查部落格裡 212 個 Markdown 檔案,只花了 28.7 毫秒:

$ hyperfine 'wordword ./'
Benchmark 1: wordword ./
  Time (mean ± σ):      28.7 ms ±   1.3 ms    [User: 11.7 ms, System: 16.5 ms]
  Range (min … max):    26.8 ms …  31.7 ms    90 runs

其他小事

我加入了 Codeberg 成為會員

我一直在尋找一個更不那麼商業化、更開源的 Git 代管服務。

我之前用的是 GitLab。但他們做了一個很奇怪的決定:每兩週就強制讓所有使用者登出

每次我要用 GitLab 時,都發現自己已被登出。而要重新登入時,GitLab 還會打斷我的工作流程,逼我去收 Email 找一次性驗證碼,而不是讓我的密碼管理器自動填入帳密。

我試了Codeberg,很喜歡。它比 GitLab 簡單許多,這正合我意,因為 GitLab 對我來說一直太過複雜。而且它是完全開源的,用 Go 和 HTML 樣板實作,這正是我最喜歡的網頁技術組合。

我看到支持 Codeberg 的方式之一,就是加入成為具有投票權的會員,所以我就加入了。我還沒用這個會員身分做過什麼,但感覺自己像是合作社的一份子,而不只是使用者,感覺還不錯。

Codeberg 最大的缺點是,似乎沒有任何提供代管服務的持續整合(CI)廠商支援它:

  • WoodpeckerCI:沒有廠商提供付費的代管服務。
  • Forgejo Actions:實驗性專案,沒有付費支援。
  • CircleCI:不支援 Forgejo/Gitea。
  • Garnix:不支援 Forgejo/Gitea。
  • Buildkite:不支援 Forgejo/Gitea。
  • Drone:有支援 Forgejo/Gitea,但似乎只有企業版才提供代管服務。
  • Harness:這似乎是 Drone 的新名稱,但我搞不清楚它們是否支援 Forgejo/Gitea。

Codeberg 官方推薦自行架設 Woodpecker CI,這聽起來有趣但不太實際,所以我花了一天在我的免費 Oracle Cloud VM 上把它架起來。現在我為 wordword 和其他幾個專案自行架設 CI。但我不相信自己能把它保護得像付費廠商那樣安全,所以不願意在上面存放機敏資訊。這讓它作為真正的 CI/CD 解決方案,用途受到很大限制。

換了一台 10 Gbps 路由器

我的網路服務供應商(ISP)第一次提供了 2 Gbps 對稱頻寬,所以我想充分利用這個速度。

我原本的路由器是 Qotom Q355G4,它一直表現不錯,只差在不能上機架,而且只有 1 Gbps 的連接埠。

我本想向 OPNsense 或 Protectli 這種值得信賴的硬體廠商買路由器,但 OPNsense 最便宜的 10 Gbps 機架式路由器要價1,200 美元,而 Protectli 根本沒有可上機架的選項。

最後我買了Qotom C3758R 1U 10 Gbps 路由器(含運費與稅金共 417 美元),並在上面安裝了 OPNsense 商用版。

我買了一台 Qotom C3758R 10 Gbps 路由器(由上數來第三台),為了充分利用 ISP 新推出的 2 Gbps 方案。

我本來一直擔心路由器的記憶體或硬碟空間不夠,但 OPNsense 幾乎不需要什麼資源。我選了 8 GB 記憶體和 128 GB 硬碟。剛剛在跑測速時看了一下系統負載,記憶體使用率從未超過 13%,CPU 最高也只到 30% 左右,所以這台硬體對我來說綽綽有餘。要說明一下,我沒有設定很多防火牆規則,也沒有使用 OPNsense 的 IDS/IPS 功能。

正式改用 Rackstuds

在我發表了關於打造第一座家用伺服器機櫃的文章後,有幾位讀者推薦我改用Rackstuds,取代傳統的籠式螺母(cage nuts)。

我覺得 Rackstuds 比標準的籠式螺母好用多了。

我一開始很懷疑,因為 Rackstuds 是塑膠製的,感覺比金屬的籠式螺母更容易斷。但 Rackstuds 有實驗室測試顯示它們可以承重高達 40 磅

Rackstuds 絕對比籠式螺母好用多了。用籠式螺母安裝設備很麻煩,尤其是重的設備。你得一手扶著設備、保持水平,另一手還要鎖螺絲來固定。

Rackstuds 解決了這個問題,因為你可以先把 studs 裝好,然後直接把設備掛上去就好。

讓我困惑的一點是,Rackstuds 有兩種版本:紅色和紫色。它們的差異讓人有點摸不著頭緒。紫色版本的產品頁面寫道:

Suitable for rails between 2.7mm/0.106 and 3.2mm/0.125". If ≤ 2.2mm/0.086", use the new red version instead

蛤?

我原本以為伺服器機櫃裡的「rails」(滑軌)是指裝在伺服器上、讓你能把伺服器滑進機櫃的東西,它們各個面向的尺寸都遠大於 3 公釐。

我原本以為伺服器機櫃裡的「rails」就是這種滑軌。

後來我終於搞懂,Rackstuds 所說的軌道厚度,其實是指機櫃正面的那片金屬:

在我的 StarTech 機櫃上,紫色的 Rackstuds 似乎更合適。

另一個要注意的地方是:如果你買 Rackstuds Duo,它只適用於剛好是 1U 高的設備,而散裝的 Rackstuds 則可以安裝任何可上機架的設備。我先買了 8 入的試用包,之後又買了一包 20 入的,留給未來的機櫃設備使用。

總結

完成了什麼?

經驗與收穫

  • 我需要重新評估,考量到所需的時間以及更能善用 AI 變革的其他專案,寫書這個策略是否仍然合適。
  • 我可以為網路調整書中的內容以吸引讀者。試讀內容不需要和正式書中的內容百分之百一致。

下個月的目標

  • 完成《Refactoring English》的部落格寫作章節。
  • 開始為《Refactoring English》進行預購。

徵求協助

  • 如果你知道比 Kickstarter 更專注於電子書出版的替代平台,歡迎告訴我
    • 我知道 LeanPub,但我想要的是像 Kickstarter 那種「達到最低門檻才算成功」的機制。
  • 歡迎聯絡我或在下方留言,告訴我你對於「用能同時輸出 PDF 和 HTML 的標記語言來寫書」的工具有什麼建議。
    • 我目前考慮的選項有:
      • AsciiDoc
      • mdBook
      • Pollen - 我喜歡這個想法,但得先學 Pollen,也就是要學 Racket,也就是要學 Lisp,所以要學的東西有點多。

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

留言