# SDK和API的區別? 講個小故事:研發人員A開發了軟體A,研發人員B正在研發軟體B。有一天,研發人員B想要取用軟體A的部分功能來用,但是他又不想從頭看一遍軟體A的原始碼和演算法(難懂、又累又花時間…),那怎麼辦呢? 研發人員A想了一個好主意:我把軟體A裡你需要的功能打包好,寫成一個一個的函數,並集合成函數庫,你就按照我說的流程,從函數庫中取用自己需要的函數,你把它寫在軟體B裡,就能直接用我開發出來的功能了! API就是研發人員A說的那些函數(或稱函數庫),英文全名為Application Programming Interface(應用程式介面)的縮寫,可以不用管這個拗口的英文術語,知道它是什麼就好。 ### 那SDK又是什麼? SDK是Software Development Kit 的縮寫,翻譯成中文就是「軟體開發工具包」。這是一個覆蓋面相當廣泛的名詞,可以這麼說:只要是你拿來開發某個作品的軟體工具,都可以叫做SDK。 我們先看簡單的例子,大家或許聽過魔獸爭霸的DOTA,這種玩法並不是官方做的,是玩家們利用官方提供的SDK所開發出來的玩法,但後來卻比官方制式的玩法更受歡迎,甚至衍生了例如英雄聯盟(LOL)等等的塔防攻守類型的遊戲。 官方所提供的魔獸爭霸SDK是一套有GUI的地圖和事件編輯器,因為玩家大部分都不是專業的軟體工程師,地圖編輯器一定要做的非常容易使用才行。官方提供這套SDK,最初的目的是讓玩家創造自己的地圖來對戰,豐富遊戲樂趣,延長遊戲壽命。 只不過,官方提供的這套SDK功能實在太強大了,不只是能製作對戰地圖而已,而想像力豐富的玩家們便超越了官方的想像,開發出了DOTA這類遊戲的玩法,甚至讓DOTA成為魔獸爭霸的代名詞。 另外,紅極一時的絕對武力(Counter Strike,簡稱CS)也是在玩家顫慄時空(Half-Life)遊戲所提供的SDK環境中所開發出來的,火紅程度甚至完全取代了官方原本的遊戲,讓許多玩家甚至根本忘了原來CS是顫慄時空的SDK所做的,反客為主。 回到軟體開發的例子,SDK被開發出來的目的,是為了減少程式設計師的工作量,尤其是一款具有GUI(圖形化使用者介面)的SDK,更是幫助很大。 例如,現在開發遊戲會用到的SDK,最有名的就是Unity(一種「電玩遊戲引擎」),Unity讓軟體工程師在開發遊戲時不必像開發其他軟體一樣,在純文字的介面中辛苦的打字,可以透過滑鼠點擊加入功能或插入程式碼,並且可以即時預覽成果,可以把它想成「開發遊戲專用的套裝軟體」。Unity這種用來開發遊戲的SDK(遊戲引擎)的出現,讓即使是非專業人員,只要有心的玩家都可以自己獨力開發遊戲,只要具有一定的程式基礎,準備好素材,就可以較快速、較簡便的自己做出一個遊戲,這都是因為開發了Unity幕後的工程師所辛苦努力的做整合,讓使用者能更加便利的做出遊戲。 其實我們常用的微軟Office系列的Word、Excel、Power point廣義來說都屬於SDK,因為有了這些軟體,我們才可以不必懂程式設計,只要用滑鼠點選和打字,就可以做出一篇圖文並茂的文章、試算表或投影片,這都是因為微軟公司那些懂得程式設計的軟體工程師,幫我們做出的SDK。 當然,SDK的例子講都講不完,基本上電腦使用的一切能夠做出東西來的軟體,都屬於SDK的範疇。 把API和SDK比較的話,API的整合性比較低,而且不一定有GUI介面,算是其他軟體工程師開放特定功能(把它做成函數庫的形式)開放給其他軟體工程師使用,便可節省其他軟體工程師的燒腦過程和開發時間。例如今天你要開發一款美食通報的App,它會告訴使用者附近有哪些美食,所以你的App會和Google地圖(Google Map)互相搭配,這時你就一定需要Google官方所提供的,關於Google Map的API,透過這些API,你才能在撰寫程式碼的時候使用Google Map已經開發出來的功能,讓Google Map和你的程式連動,在地圖上顯示美食的地點。 因為你通常並沒有能力開發出一款地圖軟體,所以就必須依賴有錢有勢有高手的Google官方所提供的Google Map的API讓你使用。而API並不總是免費的,很多公司的API都是收費,依賴提供API給其他開發者賺取利潤。 或者你想要開發一款在facebook上自動推文的軟體,因為facebook不是你開發的軟體,想要和facebook連動,就一定要使用facebook公司開放(免費或收費)給其他開發者的API。 相比於API,SDK的整合性一般都比較高,而且大多都具有GUI介面,目的通常是讓比較沒有程式基礎的大眾都能更簡易的開發出某些東西。除了前面舉的例子,例如專門做建築與空間規劃的SketchUP軟體、做3D建模與動畫的Blender、3DS MAX、Maya … 等、做影像處理的Photoshop、做影片剪輯的Premiere Pro … 都屬於廣義的SDK的範疇,例子實在是太多了。而SDK一樣也分成免費與收費,像前述遊戲公司提供的地圖編輯器通常和遊戲本體一起被安裝,玩家可自由免費創作;而像一般商用軟體,通常都是收費的,而且也有非常貴的SDK,例如工業用的製圖軟體Solidworks、UG NX … 等。 要是沒有這些SDK,要玩家自己從撰寫程式碼開始創作遊戲地圖、工程師從程式碼開始撰寫3D繪圖軟體 … 這樣事情怎麼進行的下去,也本末倒置了,因此我們必須仰賴其他專門製作SDK的公司所開發的軟體來完成我們的工作。 所以其實SDK的範疇是把API也包含在裡面的,因為公司在開發一款SDK時,總是不免會用到其他人開發的API裡面的一些功能。簡單來說,你就把SDK想成是一部汽車,大多數人只要學習如何開車,不一定要學習如何改車與修車。而API就是汽車的零件,汽車製造商所需要的全部零件不可能都是自己做的,會有很多外購的零件,例如油壓系統是向日本採購的、電控系統是向德國採購的、輪胎是向美國買的…等等。 雖然你可以自己去買所有的零件來組成一輛汽車,但這樣成本很高也很花時間,你也不一定有知識和工具來做到。不過你可以去買一輛現成的汽車(SDK)來改裝部分零件(API),使得這輛汽車更符合你的需求,這樣實現起來更加簡單也更符合現實。 而如果你不想拆車改裝,也可以加購外掛套件,例如空力套件、高品質音響…等等,這些「外掛」的改裝套件,就像軟體的外掛程式(plugin)一樣,可以在不更動主程式的情況下,附加上新的功能。例如遊戲的資料片或DLC(DownLoad Content,可下載新的遊戲關卡、新的角色、新的劇情…等)也是差不多的意思。 用汽車和汽車零件的例子來比喻的話,就能快速理解SDK和API的差別。