如何理解「如果你寫程序沒用 undocumented API,那一定是因為你的程序沒什麼了不起的功能」?

在這裡(http://lukhnos.org/blog/zh/archives/581/index.html)看到。為了便於理解,在題目中將繁體轉為簡體。

原文為:

如果你寫程式沒用 undocumented API,那一定是因為你的程式沒什麼了不起的功能。


可以從兩方面理解:

1. 「了不起的功能」意味著壁壘。需要用到 undocumented API 的功能意味著沒有公開的解決方法,可以擋住低劣的模仿者,給高水平模仿者跟進造成一定的研發成本;

2. 從可維護性上看 undocumented API 是萬分不鼓勵使用的。但既然被使用了就說明是為了獲得非常核心的價值。「了不起」 到值得拿些犧牲去換的。相反,沒有逼你去做些犧牲換來的功能,可能價值還不夠大。

總之,別理解成「用了 undocumented API 的功能就了不起」就行了。


原文的上下文是指 Carbon 的 API,擴展來看我們一般會對整個 OS X 的 API 這麼說,因為在 10.5 甚至 10.6 以前官方的 API 提供的功能是相當貧瘠的,而 Apple 自己的 app 會使用很多私有的 API 實現定製的界面和試驗性的新功能,所以公開 API 總是慢一到兩個版本 (比如 Apple 在 10.4 就開始用 Core Text,10.5 才提供給第三方開發者)。對於第三方的 app 獲得這些界面和功能只有兩條路:

  1. 等第三方開發者把這些功能重新實現一遍然後包裝成庫,比如當時常見的 BWToolkit 就是這種;
  2. 直接用 Apple 用的 private API,因為 OS X 下當時也沒什麼限制,不像現在想上 app store 的應用不敢用這些 API。

一般來說前者出現得比較慢,而且需要增加編譯和分發第三方庫的依賴 (當時也不像現在有 CocoaPods),所以後者對於短平快的開發來說是偏好的,另外考慮到以後系統升級這些 private API 也有可能直接變成 public API,省去許多移植的麻煩。舉幾個利用 private API 例子,到現在都還是這樣的:

  • 類似 Terminal 那樣的半透明窗口;
  • 像 iTunes 等應用一樣在定製窗口的標題欄。

所以就像現在大部分精心製作的 iOS 都會有自定義的 UI 而不會照搬 UIKit 的默認 UI 一樣,當時稍微精心製作一點的 app 都難免會用到 private API,如果沒用到多數是因為開發者太照本宣科根本沒考慮開發什麼有新意的功能或者把 UI 做得接近新的系統。


注意原文作者的描述:

undocumented API 不見得要是沒見光的,即使是 open source 的 framework 也經常暗藏秘技、邪惡的 higher-order techniques,或者是曲折離奇的 message sending path。

既然是high-order,那麼一定是大多數人用不到,並且難以用三言兩句解釋清楚的東西。對於這樣的東西,如果還要為其做長篇大論的解釋的話,一定是一個吃力不討好的事情。時間和腦力對於程序員來說就是金錢,應該把它們用到可以最大程度滿足更多的用戶的需求的地方去,這樣程序員才可能會開得起豪車買得起別墅抱得來女神呀,所以怎麼可以為這些大多數用戶都不買賬,但卻酷到寧願不寫注釋也要公開出來的API浪費時間寫注釋呢。

不過呢,也正是因為大多數人用不到,所以,如果你用到了,那麼十有八九你要用它實現的功能會和大多數人所實現的不一樣,所謂「物以稀為貴」,自然就「了不起」了。還有,你願意花時間去研究undocumented API這也是一個「了不起」的點。


說點個人理解吧。

Coder 們如何知道自己使用的工具和框架有 Undocumented API 的?那一定是去讀源碼了啊。知道、理解、運用這些隱藏的功能一定是對所使用的東西有很深刻的了解和理解,在此之上當然可以實現一些別人無法實現的功能。

但這個事情也要二分的看了。Undocumented 的東西要麼是不完善,要麼是人家不推薦或者不想讓你使用的(懶得寫文檔的除外...),關鍵是未必每個人都能對 undocumented 的東西運用自如,別人接手這段代碼必然就有更高的學習成本,甚至可能面臨著根本不知所云的情況。所以,慎用啊!


undocumented API應該是軟體作者預留的或者極少被用到的API,所以沒有出現在文檔里。
只能說,如果你用到了這個API,說明你閱讀過源碼,而不僅僅是看文檔,但是我覺得這並不能說明了不起


純屬胡扯!
用戶給你付賬的時候,不是看你用了什麼神奇的API。而是看你有沒有高效準確的實現用戶的真實需求。對於用戶來說,沒有什麼比高效準確的實現用戶的真實需求更了不起的了。
就像,你打車的時候不會因為計程車司機在盤山路上做出了無數個漂亮的甩尾而多給他錢一樣。


推薦閱讀:

Shader的編寫到底應該是美術的事情還是程序的事情?
請別人來做一個電影網站模板需要多少錢?
如何才能真正的提高自己,成為一名出色的架構師?
我要如何從0到有 進入SCE或任天堂上班?
暴風影音因 「肥胖症」 公開道歉,中國客戶端軟體面臨囚徒困境,說明了什麼?

TAG:軟體開發 | API | 如何理解X |