有人言,API設計是編程工作中最難的事情。甚至有人認為至少要有10年的工作經驗才能接觸它。其實通過好的培訓或導師學習這個進度可以縮短很多,也有這樣或那樣的時候,一些沒有經驗的程序員卻設計出好的API。不過這里引發出一個問題:“究竟是構建什么樣的庫需要花費10年的學習時間?”
在走出校門后,我很幸運地加入到Atalasoft公司,這是一家生產設計API的公司。在這里我受到了嚴格的訓練。我的導師Steve Hawley是一個喜歡把大部分時間都花費在研究各種困難問題上的人,并且他會把這些問題壓縮到一個非常精美的包里。Steve沒有太多的耐心教他的下屬,他愛好刻錄光碟,在這樣的環境下,雖沒達到青出于藍而勝于藍的地步,但卻讓我學到很多。
在他的價值觀里是沒有清晰明確的聲明或者條條框框的東西,我稱為90-9-0.9。他希望90%的人僅通過剪切和粘貼幾行代碼就可以解決常規問題。下面9%的目標是用來進行簡單地配置,通過查看文檔以及技術支持來解決問題,甚至有些問題在幾分鐘內就可以解決。0.9%的人會用各種亂七八糟的方式來扭曲你開發的庫,有時是因為性能原因,有時卻是利用其他一些你意想不到的古怪(但可執行)手段。為客戶的需求犧牲0.9%是完全正常的,只要保證客戶需求可以實現且文檔按照要求顯示出來。
最后,還有1%的人會誤解你的產品能力,這些人會讓你非常不高興。忽視還是重視?最好做個市場調查,看看他們的是否值得你去擴展庫且讓他們成為其中的一員。
Atalasoft的條形碼產品是一個很好的例子,在產品上花很多精力去仔細調優和預處理,掃描許多文檔且沒有發現問題。預處理后,在許可證允許的前提下默認會全力嘗試各種類型的條形碼。這已經相當快了,在這么短的時間里可以給任何人進行掃描操作。盡管有時候會借助一些昂貴的設備給用戶進行大規模批量化掃描,但速度還是不夠理想,所以掃描者可以修改一個簡單的枚舉屬性進行配置。偶爾有些掃描的確很困難,比如掃描一個帶有條形碼的香蕉。對于這樣的事情,可能會讓你中斷乃至更換條形碼引擎。但是誰會拿著這樣的產品去讀狗身上剃出來的條形碼呢?如果你是這樣的人,建議你去尋找其他產品用吧!
第一次看到這種情況的時候,我認為這樣的設計真糟糕。整個組件就像一個非常不統一且基于DIY(do-it-yourself)事件的插件系統。雖然如你所見,Atalasoft不會為一名架構宇航員的美感進行優化,他們會為減輕客戶支持負擔而進行不斷調優。正如我不喜歡用面向對象的思想來編寫內部庫一樣,在開放一個所有級別都能操作的簡單接口上,我認為沒有比這更好的范式。
在過去的兩年里,我一直在Bayard Rock公司負責API方面的工作,我們一直在研發一些反洗錢方面的項目。這意味著會做許多小型或中型實驗項目并且在以后會被整合到同行大的平臺上。在大多數情況下,Atalasoft風格的黑色裝箱(black-boxing)是起不到任何作用的。我們只有一個客戶并且我們會根據他們的需求調整我們的外部API。
然而,在一個細粒度級別中代碼重用是非常重要的,在這種情況下,最重要的是構建大型庫,即把許多分類函數快速的組合在一起(通過簡單的組合和沒有全面的單元測試),目前,我們正在進行優化實驗并且快速發展我們的組件。
那么,什么是好的API設計?其實,正如Steve所言,沒有什么清晰明確的框架可套,也更沒有什么捷徑可走。我們既需要按照常規來進行設計,還需要綜合客戶要求將我們的設計理念融入進去,當然,得預防那些像掃描香蕉那樣稀奇古怪的事情的發生。或許這就是為什么它會如此困難?我們也曾發表過《設計公共API的六個注意事項》文中作者根據自己的親身經驗總結了幾條API設計注意事項,大家不妨一起品嘗下!