57 篇

Tweet

上班學會的

  • 招人寫代碼太花錢了。無論是商業 IDE 許可證、AI API 、收費軟件庫還是收費託管服務,都不會比程序員的薪水本身高。只要是能讓程序員少寫代碼,提高寫代碼效率的,公司眼都不眨一下就會買,絕不造輪子。
    • 科技大公司想必一定非常豪爽,但員工亂花 token 還是會被叫停。説不定他們燒掉的錢比他們的工資還高,AI 真的太燒錢了,
  • 預製包裝食品分量少,平常是絕對不會買的。但午餐時間沒有辦法烹調和保存食物,包裝食物是餐廳之外的唯一選擇。如果分量少點能馬上吃得完,我甚至會願意多花錢呢。

Grill with docs

grill-with-docs (github) 是很好,在第一次開始做的時候就已經能得到前人的經驗,考慮所有偏門的狀況,第一次就做到完美。但是如果是在可以隨意犯錯的環境,靠自己的力量做出一個個短視的決定,然後在開發新的時候彌補過錯,才能更確實地累積經驗。

實習學會的

工作生活

  • 大學真可怕。沒有薪水、沒有規律的時間表、自己逼自己工作,還有目標不明。
  • 換個角度想,能畢業就確保了基礎的工作能力,僱主沒有任何理由聘用大學生以外的人。
  • 下班後的時間很不好用,回家後非常容易浪費在無意義的娛樂上,要很有決心才能發展興趣。
    • 但既然已經做了一天的正事,批評消費和娛樂浪費時間是不是太沒有良心了?這和學生的邏輯完全不一樣。所以大家下班後才會去肆意消費,所以晚餐總是特別貴。社會的一切都是圍繞着上班族設計的。
    • 沒有比好好睡覺,準時上班更重要的事。
  • 但正正是在這種結構裏面,精神疲勞但還有體力,才會琢磨怎麼利用時間。相比放假的時候精神活躍但體力不足,我很喜歡規律的生活,這才是最可怕的。

軟件開發

  • 在實際有人維護的代碼庫中的工作經驗是很寶貴的。只有自己工作的 git repository 永遠也不需要用到 git branchgit merge
  • 工作時間越是零碎,就越是容易在不清楚真正需求的情況下趕工,造出其實不需要的東西,浪費時間。
  • 不得不承認, OOP 和各種流行框架在團體開發的時候是必不可少的,能讓新人在不瞭解系統全貌的情況下靠約定和 API 工作。代價是拖累開發速度和增加系統的複雜度。單獨開發的時候完全沒有必要使用這些方法。

溝通成本

  • 雖然工作內容都是會向新手解釋一遍的,但因為溝通成本高和專家忘記了新手痛苦的關係,往往還是要自己研讀代碼,還有向同事了解工作的目的和隱藏的代碼規範。
  • 即時通訊是最有效率的交流方式,前提是依然需要同一個物理工作空間工作,這樣就不存在之前説過的信任問題。打斷別人寫代碼的思路是很損害工作效率的。

AI

  • 只要有 AI 魔法,就算完全不懂新語言語法的新人也能馬上開始工作,一個人頂兩個人用。
  • 完成任務最重要,很容易依賴 AI,但工作完成了之後就沒有理由再碰,弄懂自己在做什麼變成奢侈的事。過程中要儘可能爭取時間理解一點工作背景和周遭的代碼。
  • 如果想要讓 AI 工具在工作中落地,寧可放棄性能,也必須要有便宜可驗證的輸出結果。如果只用關鍵詞和傳統機器學習模型,又會覺得落後,需要權衡。
  • 不會被取代的。AI 只是個裁員的藉口。軟件開發是投資,無法創造直接利潤,賺不到錢的時候自然會被炒掉。AI 完成的工作越多,就會產生更多維護的工作。不清理,代碼庫就會逐漸腐爛。
  • 真正的危機來自學習速度的提升導致的知識貶值,而不是完成工作的速度本身。

帕斯卡三角形和二的次方

$$\binom{n}{0} + \binom{n}{1} + \cdots + \binom{n}{n} = 2^n$$

這個定理原來是這麼顯而易見的!這是因為我在研究 Stenograph Keyboard 的按鍵組合:

Stenograph Keyboard 鍵有四個元音鍵 AOEU,可以同時按下,總共能代表多少種元音組合?

如果是為了計算答案,就會用「每個按鍵有兩個可能的狀態,所以是二的四次方」這種作弊的方法思考。

但真的需要使用 EU、AO 這種組合鍵代表不同輔音的時候,真的要把所有組合列出來的時候,我就完全忘記了這回事,而是會用「n 個鍵的組合有多少」來思考。

自然就會從 $C_{1}^{n}$ 開始一路數到 $C_{n}^{n}$

  • A
  • O
  • E
  • U
  • AO
  • AE
  • AU
  • OE
  • OU
  • EU
  • AOE
  • AOU
  • AEU
  • OEU
  • AOEU

得出結論,總組合數就是
$C_{1}^{4} + C_{1}^{4} + \cdots + C_{4}^{4}$,這個是帕斯卡三角形第四層的總和減一。

等到我突然想起還能用二次方計算的時候,這個定理也就重新被我發現了。明明學離散數學的時候完全不明白。

特別是我根本不會去考慮 $C_{0}^{4}$ 的情況,因為什麼都不按根本不能用來代表一個元音。所以是 $\binom{n}{1} + \binom{n}{2} + \cdots + \binom{n}{n} = 2^n - 1$。乾脆把三角形的左邊的一排 1 劃掉好了。

  • 1
  • 2 1
  • 3 3 1
  • 4 6 4 1
  • 5 10 10 5 1

時間管理工具

不工作跑去研究工具是沒有好下場的。不過 Super Productivity 和 ActivityWatch 用起來都不錯。要怎樣運用徹底監控電腦使用時間得到的數據,才能把生活變成數值管理遊戲?不過總之先記錄,其他問題以後再想。


我想破頭之後總算明白了,我手上的時間管理工具在功課上派不上用場。

待辦清單適合處理繁瑣的工作,但我通常只有四五份功課,根本不需要特意記下來,每一份又要花幾天才能做完,一定要先拆成一個個簡單的步驟,才能放進待辦清單,但沒做過,又怎麼知道任務能不能拆開?空泛地亂拆又沒有用。

這樣一來,似乎根本不需要用什麼時間管理工具,埋頭苦幹一天做完就行了。但「埋頭苦幹一天」太嚇人了,結果只會拖着,永遠不會開始。而且,一天做完的作業質量肯定不好。和寫文章一樣,要每過幾天重新看一次,不斷修改才可以。

靠軟件幫忙安排工作,一邊做一邊分拆任務,把拆開的任務分成很多天處理,每次只做一小部分,減輕內心的恐懼,是最好的做法。但是軟件的排程不會理會截止日期,沒法保證一定能在規定的時間內完成。

説到底,截止日期這個概念本來就是想當然的產物。如果能明確地預測工作時間的話,就直接用那個時間好了。但工作時間當然是無法預測的,只能設一個過分充裕的期限,讓人變得拖拖拉拉。

我理想的時間管理工具該有的要素:

  • 任務隊列,按照緩急輕重和完成的收穫自動安排每日的任務,出現什麼就做什麼,沒得選。
  • 每項任務都是一個文本檔案,因為無論什麼任務都需要寫工作筆記。
  • 遇見複雜的任務可以拆開,形成樹狀分支
  • 任務清單,能觀察自己每個項目的進度,彌補任務隊列把任務拆得亂七八糟,見樹不見林的不足

有了會很好:

  • 能自動打開任務需要的檔案,減少切換的麻煩
  • 遊戲化,在完成任務的時候會「叮」的一下加分。
  • 能製作記憶卡,混入任務隊列
  • 時間追蹤,提醒自己不要在同一個任務上花太多時間。

雖然把一大堆工具合併起來用就能滿足上面的所有要求,但如果還是要奢望有一個萬能的合體機器人的話,就只會走上 emacs 的不歸路。怎麼辦,好像很吸引人……


又不小心研究了一會 emacs,因為 orgdown 的語法好像比 markdown 好。練習快捷鍵除了輸入的時候比較爽快沒有什麼意義。我很滿意 vim。過早的優化是萬惡之源。有些人連盲打都不會呢,照樣能寫出好的程序。


記錄行動的目的不是獲得數據,而是用記錄作為行動的開關,有意識地「浪費」時間。逃避結束的時候同時結束記錄,作為切換狀態的訊號。計時是讓無意義的按按鈕儀式變得有意義的把戲,順帶能了解自己的習慣,知道自己真正需要多少逃避的時間。主動搞清楚自己的娛樂有多少是需求,多少是逃避,多少是無意識的習慣。

被動地用軟件記錄,或者記錄不會重複的事件都是沒有意義的。

正正是因為這是個沒有意義的儀式,才有了能不讓人反感地堅持的機會。

逃避行為:

  1. 思考抽象宏大的問題

  2. 學習不迫切的知識

  3. 觀看流行的新聞和娛樂影片

  4. 搜尋新的音樂

  5. 發呆、踱步

  6. 無目的地聊天和抱怨

  7. 寫反省的文章

  8. 研究新項目

  9. 重温喜歡的故事

  10. 沉溺幻想

  11. 無限滾動是沒有辦法抵抗的

  • 你能做的就只有按下按鈕,讓時間流逝,然後看到累的時候,讓按取消按鈕逼自己站起來離開。中途沒有任何意志力介入的空間。
  • 所以不能讓無限滾動存在,要用一切手段禁止。
  1. 逃避的時間是沒有辦法減少的
  • 每個行動都是在我按下按鈕後授意自己去做的,但我是沒有辦法控制自己的行動的
  • 內心有逃避的軟弱,就必然有滿足這種軟弱的需求
  • 內心有對新聞和流行內容的好奇,就會想辦法補足
  1. 就算知道自己已經無法承認自己的行動,也沒有什麼可以做
  • 連按鈕都按不下去,明確知道自己沒有精神確認自己的狀態了,就應該休息了。
  • 我覺得用按不了按鈕用來做判斷疲勞的標準是很準確的,因為這個行為沒有任何附加意義,也沒有逃避的理由。
  • 但就算知道,還是會想同時做矛盾的事情,一邊做作業一邊看動畫,一邊睡覺一邊複習
  • 讓人保持理智的技巧往往需要理智才能實行
  1. 確認自己的行動狀態不是這麼簡單的
  • 我經常忘記自己已經按過按鈕,甚至不知不覺間就會切換到別的狀態。
  • 就算是有意識的決定也會被無意識的習慣蓋過去

另一方面,按鈕也可以當作像番茄鐘一樣的啓動器。面對不想面對的事情,只要自己確定了要去做,就按下去。和番茄鐘不一樣的是,沒有強制要做多久。只要誠實地確認行動的開始和結束就可以。

  1. 確認資訊
  2. 工作
  3. 出門
  4. 發訊息
  5. 洗澡
  6. 睡覺
  7. 做飯

不是所有時間都是需要記錄的,像是通勤時間和上課時間一樣,無法避免的不受控時間沒有必要記錄。不過還是看自己的感覺能不能掌控。

爲了讓系統不會失敗,還有一個逃脫按鈕,當你確認自己不想確認自己的行動的時候,就按下去。要是連逃脫按鈕都按不下去的話,無論處於什麽狀況,都毋庸置疑是不受控的時間,所以也不用愧疚。


做了輔助工具,但輔助工具本來會帶來更多的工作量的時候,就有應該先做哪個的問題

從 CLI 到 GUI

如果不用別人寫好的工具,到底要怎麼做出有圖形界面的程序呢?簡單的編程練習總是在純文字的界面打轉。需要用到圖形界面的時候,就要導入一些神奇的函式庫。

只是自己寫給自己用的話,軟件根本不需要有圖形界面,在終端裏輸入命令就足夠了。


要和操作系統交互才能畫出窗口,所以需要導入函式庫和用 C++,Python 本身是做不到的。
how to make gui in python without tools (stackoverflow)
瀏覽器是最通用的渲染引擎,所以用網站做 UI 應該是最簡單的……


UI 也算是數據可視化的一種吧?


UI 是狀態機,所以應該用狀態機圖來設計。Construct User Interface with Statecharts 這本書説明了,最基礎的狀態轉移圖 (State Transition Diagram) 根本不可能用來描述複雜的軟件,一定要使用帶有層級、記憶、分離等常見模式的符號的 Statechart,才能把狀態數量壓縮到可理解的狀態。

我覺得這本書太着重符號的定義了,對於個人開發來説是過度工程。而軟件沒有實體,定義狀態本身就不容易,狀態轉移式的代碼也和 JavaScript 的 event action 設計模式不太適配。

Vibe coding 的代價

AI 寫代碼看似是無本生利,但確實是有代價的。本質是用學習動機和創作欲望作爲抵押,借來馬上得到的成果和能完成事物的信心,只是一般人不把這些當作是代價而已。你真的能利用這些預支的資產,繼續產生動機和知識嗎?

當你以為自己完成了 90% 的工作的時候,距離能正式交付其實還差 50%。這是讓自己滿意和讓別人滿意的差距。AI 拿走了前 90% 的成就感,還要接着完成剩下 50% 的工作。當然這剩下的工作也可以讓 AI 來做,但是因為自己對工作沒有投入任何感情,所以不會容忍任何不符合自己預期的地方。


2026-06-11

「僅僅想要讓事物誕生,不是自己做的也沒關係。」要有這種想法,才適合在項目裏面應用 AI。

直播

對了,可以直播!和博客的異步邏輯是一樣的!只需要宣告存在,不知道有沒有人在看,不需要互動和評價的社交方式!

但是應該播什麼呢?我很不喜歡被監視的感覺。

習慣系統

培養習慣的時候,不要期望有太完美的紀律。自己的習慣的意義,是敵不過外部要求的意義的。如果習慣的意義依賴紀律,一旦被外部壓力打亂節奏,就很難重拾回來。

無論在什麼時候中斷習慣,過程的記錄和成果都要有獨立的意義。這樣無論過了多久以後,都不是從零開始。

意志消磨了

  • 家會空起來,不想離開。

  • 嚮往正常,害怕逼自己。

  • AI 延遲了危機感。

但是沒有不逼迫自己的心態和條件,失掉了唯一的武器


舒適的環境好像沒什麼意義,但是會影響情感經驗。雖然可能覺得只要解決主要的痛苦就什麼都好,但這種想法正正是無法更從容地應對的原因。

分清楚什麼是讓自己真正不舒服的,和應該讓自己不舒服的。

可能是温度,可能是風。舒服的可能是不舒服的。不舒服的可能是自在的。