相關閱讀 |
>>> 讀書—連接古今充實信仰 >>> | 簡體 傳統 |
七 Popclient變成了Fetchmail
項目的真正轉折點來自一份哈利·豪切斯的草擬程序,通過它我們可以將郵件轉發至客戶機的SMTP端。幾乎在收到程序的同時,我就意識到,這個功能會讓其他的郵件傳送模式都成為歷史。
我曾用幾周的時間擺弄fetchmail,當時總覺得雖然界面還能用但是卻不夠漂亮,到處是用處不大的選項。“將收取到的郵件歸檔”或者“標準輸出”選項尤其讓人心煩,可我卻說不出個所以然來。
(如果你對網絡郵件的技術細節不感興趣,那么就可以安心的略過下面兩段。)
當我考慮加入SMTP轉發的時候,才發現popclient包攬了太多的事情。它身兼兩職——既是一個郵件傳輸工具(MTA)又是一個本地投寄工具(MDA)。但是如果有了SMTP轉發功能,它就可以擺脫MDA的工作。像sendmail一樣專注于MTA并把郵件的本地投寄工作交給其他軟件。
幾乎每個支持TCP/IP的平臺都預留了25號端口,那么何必去折騰復雜的代理設置或者“添加-鎖定”本地郵箱呢?特別是,這樣可以保證收到的郵件看上去就和一封直接投寄的普通SMTP郵件一樣。這才是我們想要的!
(承前段……)
就算你沒看懂前面的技術細節,這里還是有幾條值得學習的重要經驗。首先,這個SMTP的創意是我效法李納斯的最大收獲。用戶提供好的創意——而我要做的僅僅是理解它的含義。
11.自主創意很好,能認可源自用戶的點子也不錯。有時借筆生花更具成效。
The next best thing to having good ideas is recognizing good ideas from your users. Sometimes the latter is better.
有趣的是,你會很快發現,即使你謙卑地坦陳別人為此做出多大的貢獻,外界也不會這么看。大多數人認為是你創造了一切,而你只是為自己的天賦表示出適當的謙虛。李納斯就是個生動的例子!
(1997年8月,我在第一屆Perl大會上發言時,杰出的黑客拉里·沃爾正坐在前排。當我講到上面那句的時候,他醍醐灌頂般的叫出聲來:“說下去,說下去,哥們!”引得哄堂大笑。因為大家知道,這一點對于Perl的發明人也不例外。)[1]
在以同樣的精神將項目運營了幾周后,我開始收到類似的褒獎。不僅來自我的用戶,而且來自對此有所耳聞的人。其中一些郵件被我收藏起來了,萬一哪天我開始懷疑我生命的意義了,就翻出來看看:-)。
12.通常,當你確信自己在解決一個錯誤問題的時候,會激發最具突破和創造力的方案。
Often, the most striking and innovative solutions come from realizing that your concept of the problem was wrong.
把popclient開發成一個組合軟件(作為MTA兼MDA,讓他支持五花八門的本地投寄模式),實際上等于在嘗試解決一個錯誤的問題。fetchmail應該被重新設計為一個純粹的MTA,作為常規SMTP郵件傳輸路徑的一部分。
當你在開發中碰壁(絞盡腦汁也無法做出下一個補丁)的時候,通常應該問問自己:“我是否找到了正確的答案?”或者“我是不是找對了問題?”。也許有些問題需要重新定義。
好,我這就重新定義我的問題。顯然,正確的做法是:(1)在主驅動中加入SMTP轉發支持,(2)把它設置為默認模式,(3)最后,拋棄所有其他傳輸模式,尤其是“本地歸檔”和“標準輸出”兩項。
第三步讓我躊躇頗久,因為担心會流失依賴此模式的老用戶。理論上,他們可以立即使用forward格式文件或者非sendmail的類似功能來達到同樣的效果。但實踐中,這種轉變大費周章。
一旦真這么做了,我發現好處非明顯。驅動代碼中的癥結就此消失,配置選項也大大簡化了。再不需要圍著系統的MDA和用戶的本機郵箱打轉了,也不需要為操作系統是否支持歸檔文件鎖定而傷腦筋了。
而且,惟一可能出現郵件丟失的情況也沒有了。過去,假設你指定了郵件歸檔路徑,而恰好磁盤滿了話,你的郵件就沒了。而這在SMTP轉發中不會出現。因為除非傳送完成或至少已經暫入緩存了,不然SMTP接收端不會發送確認信號。
同時,性能也提高了(盡管這不是你運行一次就能感覺到的)。另外值得一提的是,用戶手冊也簡化了許多。
日后,為了應付一些來自動態SLIP[2]的糾葛,我又不得不重新加入了可由用戶制定MDA功能。但是做起來簡單多了。
這說明了什么?只要不損失效率,就不要對丟棄一些功能而舉棋不定。圣-埃克蘇佩里[3](當他不寫作經典兒童書籍的時候,是一個飛行員兼飛機設計師)曾說過:
13.“完美(的設計)意味著沒有東西可以再被加入,而是沒有東西可以移除”
`“Perfection (in design) is achieved not when there is nothing more to add, but rather when there is nothing more to take away.”
當代碼變得高效又簡潔的時候,就可以說是走上正軌了。在這個過程中,fetchmail有了自己的特設,脫離了前代的popclient。
到了該換名字的時候了,新的設計和老的popclient相比,更像是sendmail的搭檔。二者都是MTA,不同的是sendmail是向外投寄,而新的popclient是接收轉發。所以,開工兩個月之后,我把它更名為fetchmail。
在這個將SMTP轉發加入fetchmail的故事中,有一則普遍的經驗。那就是不僅調試可以平行展開,開發和(也許這很令人吃驚)探索設計空間同樣也可以。當采用快速短周期開發模式的時候,開發很可能成為針對原有的冗余設計或開發觀念的一個特殊“調試-修補”環節。
即使在更高層次的設計中,能有許多協作開發者圍繞著你的產品設計空間隨機游走也是很有價值的。試想一下,一灘水是如何找到排水口的,或更貼切一點,一群螞蟻是如何找到食物的:實際上就是在分散搜索之后,以一個可延伸的通訊機制加以協調。這很管用,就像哈利·豪切斯和我一樣,一個同行之人很可能在你身邊開啟寶藏,而你只不過是太過專著才一葉障目罷了。
譯者按:
1.拉里·沃爾 :Larry Wall,著名黑客,第一屆自由軟件獎得主。也是Perl語言的發明人,所以作者說“對……也不例外”。
2.SLIP:Serial Line Internet Protocol,即串行線路IP協議,早期的一中IP封包協議,目前基本已不再使用。
3.圣-埃克蘇佩里:安托萬·瑪麗·羅杰·德·圣-埃克蘇佩里(Antoine Marie Roger de Saint-Exupéry),法國作家、飛行員。著作頗豐,1943年出版的《小王子》令他譽滿全球。
埃里克.斯蒂芬.雷蒙 2014-07-01 18:21:32
稱謂:
内容: