天天看點

第八章 Fetchmail成熟了

現在有了一個簡潔新穎的設計,我确信代碼運作穩定,因為我每天都在用,公測名單也枝繁葉茂。我逐漸發現,我不再隻是研發一個可能隻有少數人才會用到的瑣碎的個人軟體了。而是在主持一個所有使用SLIP/PPP郵件接口的Unix使用者都切實需要的軟體。

憑借SMTP轉發功能,fetchmail把競争對手遠遠的甩在了後面,成了一個潛在的“領域殺手”。一個在同領域鶴立雞群的殺手,它讓對手們不但被抛棄而且被遺忘。

這種結果是可遇而不可求的。一個卓有建樹的設計構想會把你順理成章,甚至命中注定地推向成功。而找到這類構想的方法無非是擁有很多值得嘗試的創意——或者能用工程的眼光把其他人的創意發揮到令原作者都難以想像的境地。

安迪·塔能鮑姆[1]首先為IBM PC機開發了一個簡單的原生Unix系統,他的本意是把它作為一個教學工具(他稱之為Minix)。李納斯則把Minix的概念推臻至安迪想像不到的境地,讓它成了這個奇妙的玩意。類似的(隻是規模小些),我從卡爾·哈裡斯和哈利·豪切斯那裡借得創意并把它們深化。我們都不是“原創”——那種人們浪漫想像中的天才。話說回來,大多數科學、工程和軟體的成果都不是來自原創天才,恰恰相反,是銳意進取鑄就了神話。

這兩個項目(指Linux和fetchmail——譯者按)都成果斐然——事實上,這正是每個黑客畢生求索的成功!這同樣意味着我不得不加高要求自己的标準。為了讓fetchmail達到預期的目标,我不僅要為自己程式設計,還要額外地加入别人需要的功能。與此同時,還必須保證程式的簡潔和健碩。

意識到這點之後,我加入的第一個也是至關重要的功能就是“集體收發”——從一組使用者的郵箱中收取郵件,之後在分發給不同的收件人。

我添加集體收發功能不僅是因為很多使用者吵着要用,更主要的是我覺得通過這個方法可以迫使我更全面的處理位址問題,進而擺脫單信投寄中的缺陷。結果得我所願。正确地完成RFC822[2]位址解析耗費了我很長時間,并不是因為它的某一部分很難,而是它牽扯了一堆互相關聯的煩人細節。

添加集體收發成為了一項傑出的設計決策,隻因為:

<b>14.</b><b>任何工具都應該起到預期的作用,而一個真正傑出的工具會帶來出乎意料的用途。</b>

Any tool should be useful in the expected way, but a truly great tool lends itself to uses you never expected.

加入集體收發的一個出乎意料的用途是讓通過網絡相連的用戶端可以儲存郵件清單和别名擴充。也就是說,通過ISP上網的個人使用者不需要持續通路ISP的别名檔案就可以管理郵件清單了。

我的公測人員要求加入的另一個重要功能是支援8位的MIME(Multipurpose Internet Mail Extensions,多用途的網際郵件擴充協定)操作。這很容易辦到,因為我之前就很小心的保留了對代碼的8位相容性(就是,沒有強迫ASCII字元集中未曾用到的第8比特位去攜帶程式資訊)。這并不是因為我有先見之明,而是遵循了另一個原則:

<b>15.</b><b>在寫任何網關軟體的時候,都該花點功夫盡可能不去幹擾資料流——除非使用者強迫你,否則</b><b></b><b>永遠</b><b></b><b>不要抛棄任何資訊!</b><b></b>

When writing gateway software of any kind, take pains to disturb the data stream as little as possible—and <b>never </b>throw away information unless the recipient forces you to!

假設我不曾遵循這個原則,那麼加入8位MIME支援就會很困難而且毛病多多。事實上,我現在做的隻是讀一下MIME标準(RFC1652)[3],然後加入一條小小的标頭生成規則。

一些歐洲使用者請求我加入了一個選項,來限制每次連接配接可下載下傳的郵件數目(這樣他們可以節流昂貴的電話上網費)。我曾長時間抵觸這種做法,就算現在也不是心甘情願。但是如果你是在為外界編寫程式,那麼你就必須聽從你的客戶——即使他們不付錢也應如此。

譯者按:

1.安迪·塔能鮑姆:安德魯·斯圖爾特·塔能鮑姆(Andrew Stuart Tanenbaum)昵稱安迪(Andy)美國計算機學家,現定居荷蘭。

2.RFC822:Standard for the format of ARPA Internet text messages,标準ARPA 網際網路文本消息格式。

3.SMTP Service Extension for 8bit-MIMEtransport,SMTP 8bit-MIME傳輸服務擴充。