聽阿里雲工程師談談如何開發一個優秀的SDK
作者簡介:德勝 現任阿里視頻雲團隊資深開發工程師,多年移動端音視頻經驗,現在從事業務架構設計、客戶技術支持等相關工作。
越來越多的開發者選擇使用SDK來輔助開發,作為一種工具,它可以幫助你快速建立應用軟體,而省去了編寫硬體代碼和基礎代碼架構的過程。我們團隊一直致力於移動視頻領域SDK的開發,踩過坑趟過河,遇到了很多問題也總結了一些經驗,下面是我們總結的一個好的SDK應該具備的特質:易用性,穩定性,輕量,靈活,優秀的支持.
一、易用性
因為工作的關係我接觸了很多的開發者,其中有行業知名的公司的開發者,也有極小的個人開發者.有一個現象很有意思,不管是能力較強的開發者還是能力一般的開發者,他們都會不停的對你的SDK吐槽.因為他們對於好用的標準是不一樣的,所以你必須要將你的SDK易用性考慮到極致,不然後續的技術支持將是一個十分痛苦的事情.
- 不要過度設計,過度設計是程序員常常犯的錯誤,如果只是一個演示demo,應該盡量的簡單,簡單到最基礎的程序員都能夠看懂.
- 介面盡量的見名知義.
- 要相信絕大多數的開發者都是不看文檔的.於是根據開發者的直覺去設計API,這樣聽起來是不是太靠譜?事實上比如你的SDK的生命周期設計方法跟系統差異性不大,比如你的播放器的介面設計跟系統播放器相差不大,那對開發者來講就是福音.
- 介面能夠統一的盡量統一,比如iOS和Android的介面,應該盡量的統一.
- 盡量多的默認參數,這裡面有一些小的技巧,以下我提一個小的例子,比如我們的SDK,我們有一個跳轉錄製的介面,事實上就是將一堆的參數給到下一個SDK頁面,讓SDK接收參數,我們選擇給一個結構體暴露給用戶,如下:
AliyunVideoParam recordParam = new AliyunVideoParam.Builder()n .setResulutionMode(resolutionMode) //設置錄製解析度,目前支持360p,480p,540p,720pn .setRatioMode(ratioMode) //設置視頻比例,目前支持1:1,3:4,9:16n .setRecordMode(RecorderDemo.RECORD_MODE_AUTO) //設置錄製模式,目前支持按錄,點錄和混合模式n .setFilterList(eff_dirs) //設置濾鏡地址列表n .setBeautyLevel(80) //設置美顏度n .setBeautyStatus(true) //設置美顏開關n .setCameraType(CameraType.FRONT) //設置前後置攝像頭n .setFlashType(FlashType.ON) // 設置閃光燈模式n .setNeedClip(true) //設置是否需要支持片段錄製n .setMaxDuration(max) //設置最大錄製時長n .setMinDuration(min) //設置最小錄製時長n .setVideQuality(videoQuality) //設置視頻質量n .setGop(gop) //設置關鍵幀間隔n .build();n AliyunVideoRecorder.startRecordForResult(this,REQUEST_RECORD,recordParam);n
這樣有什麼好處呢,我們事實上可以預製N個參數。這樣用戶調用一個錄製功能只需要做什麼呢?,如下:
AliyunVideoParam recordParam = new AliyunVideoParam.Builder().build();nAliyunVideoRecorder.startRecordForResult(this,REQUEST_RECORD,recordParam);n
上面還說了開發者對於易用性的標準是不一樣的,面向的需求也是不一樣的,上面的需求只能滿足最基礎的簡單需求,如果要自定義界面,這個時候就需要暴露更加深的介面.於是我們將我們的介面設計分為多層.這樣就基本能夠滿足用戶最初級的要求和自定義屬性的要求。
DEMO--->AliyunVideoRecorder(第一層介面)---->AliyunIRecorder(第二層介面)n
二 、穩定性
如何保證一個SDK的穩定性?自動化測試、適配測試、API的穩定、代碼審查、內存檢測、可測試性都缺一不可。
- 自動化測試:依賴系統的自動化測試工具就可以完成人工絕大多數的自動化UI測試.能夠解放黑盒測試的雙手,這個時候如果有使用Jenkins之類的持續集成的系統,你還能夠讓你的開發者及時的能夠發現問題、解決問題。
- 適配測試:一個安卓永遠的痛,現在基本沒有很多好的方法,只有去找一些規律找機器適配,但是做多了就會發現還是有規律可循的,比如GPU的型號,系統版本,使用的硬體差異,甚至品牌.早期我們也是按CPU,GPU型號去買機器的.
- API的穩定: 一個好的SDK設計的API應該從一開始就需要考慮擴展性,盡量多的考慮將來可能的需求,盡量將這些需求包進來.我見過很多開發者懊惱如果讓我再設計一次一定能夠將這個介面設計的更好一些
- 代碼審查:一個好的團隊在代碼質量上會下很大的功夫,所以不讓代碼審查淪為形式是一個好leader應該考慮的事情.大團隊會做一些交叉review,開啟git的pull request,寫單元測試等都是不錯的方式
三、輕量
現如今手機App的大小直接決定用戶買單不買單(16G的iPhone哭暈在廁所),在我接觸客戶中發現越是大公司越在乎對App的大小增加,因為他們的應用已經非常龐大了,像微信,手淘,支付寶這樣的大體量他們都對大小有著極其嚴苛的態度,產品和技術團隊會直接評估大小增加對用戶的影響.所以你的SDK是否輕量直接決定用戶是不是選擇你的SDK.那如何做到輕量?
- 盡量少的使用第三方庫,如果非要使用這個庫需要考慮這個庫中的源碼是否能夠裁剪,有必要時需要產品一起評估這個功能對大小的增加,有必要時要求產品幹掉這個功能
- 代碼耦合度盡量的低,比如用戶只要一個錄製功能,這個時候就需要評估你的錄製模塊是否獨立,能不能單獨的抽離.你應該盡量的讓你的代碼耦合度低
- 第三方庫需要暴露實現給用戶.特別是非常常見的庫,比如你一個json解析的代碼。你應該定義一些介面,然後實現的類直接暴露給用戶.如果用戶有強烈的替換第三方庫要求,應該讓用戶有權利去替換
- SDK不要包含view層實現和資源,如果有必要,將view層的實現暴露出去.比如:我們在做SDK的時候我們始終在考慮怎麼樣讓用戶盡量簡單的接入我們的SDK,盡量少的讓用戶接入的成本低,盡量少的讓用戶少寫代碼.這樣就不可避免需要做一些應用層的事情,於是我們就將View層的所有實現都暴露給用戶,然後讓用戶只修改UI即可.這樣資源用戶也可以替換,十分方便.
四、靈活
靈活包括幾個點:API靈活可擴展,API的可測試性,API的健壯性性要強.
要做到以上任何一點都需要經驗的支持,絕對不要想當然,盡量的從開發者的角度去設計,會讓自己收穫很多.- API可擴展:在業務過程中我們總是面對產品不斷的需求壓迫,但是從設計開始的時候就需要儘可能的考慮多的業務需求的可能性,這裡有一個技巧,如果你不能確定你未來的需求增加,你應該保證盡量少的介面支持儘可能多的業務,不然到後期你會發現你的對外介面越來越多,一堆冗餘介面.:)
- 介面可測試性,一些小的技巧可以讓你的SDK具備可測試性
- 為了測試,有時我們需要進行模擬,模擬(mock)類作為真實類的仿製類,它沒有真實操作,並且允許被重寫調用和驗證.
- 如果有些類是final的就很難模擬,並且是一個基於狀態的單例的話,就比較噁心了,這時候我們就需要考慮考慮在設計上盡量的規避.比如盡量避免單例,避免final.
- 需要有測試用例,不管是開發人員還是測試開發人員都需要根據測試用例編寫.
- API的健壯性
- 大多數的開發者經常都是不耐煩的,他們看到很長時間都找不到出錯的原因是會有非常負面的情緒的,所以有一些錯誤應該儘早的拋出,這就好像比如你要build一個項目,如果一些錯誤能夠在編譯期間就暴露,一定好於完成編譯之後才出現錯誤.所以你需要寫清楚一些exception拋出給用戶.
- 盡量的保證介面的生命周期,如果是有序的需要在文檔說明.
五、優秀的支持
如果以上四點你已經做得非常好了,這個時候你的文檔和技術支持直接就決定用戶是否選擇你的SDK.也直接決定用戶對你的評級.所以好的支持就非常重要了.你需要建立開發者社區,apple文檔,javadoc,readme.甚至集成文檔,示例教程.
- 給對外暴露的代碼儘可能多的注釋,最好是相關聯的說明使用示例,比如你的這個介面跟另外一個介面是配套使用的。
- 需要有demo代碼,demo代碼應該儘可能的簡單.讓使用的人可以遵循你的代碼進行嘗試.一定一定不要讓你的示例代碼寫的過於複雜.不要在無關緊要的交互模式上糾結.不然沒有用戶會花大量的時間去學習你的示例代碼.而且他們還會有很多疑問,或者bug. (解決方案除外)
- 如果有些介面需要廢棄,你應該添加廢棄的註解。
- 一定要有一個更新list.清晰的版本更新日誌.要相信不是所有的開發者會選擇最新版本的,你需要保證你的每一個版本都是穩定可用的。
- 作為一個SDK,你的功能一定不能是自己臆想出來的.你應該常常跟開發者交流,了解用戶的需求。每個功能都需要有客戶反饋作為依據.
以上幾個點肯定不是建設一個偉大的庫的全部.只是我們在開發短視頻SDK的時候的一些思考.如果覺得有一定意義, 歡迎交流.:)
程序員客棧 - 程序員的經紀人,國內最大的中高端程序員線上工作平台。通過簽約經驗豐富的程序員,採用線上組隊開發和雲端工作等方式,幫助企業解決軟體開發和技術用人難題,為中高端程序員提供穩定的線上工作機會:自由工作、遠程工作、兼職工作。
推薦閱讀:
※矽谷和國內的 iOS 開發到底有何不同?
※「流量融合SDK平台」作為手游渠道,是便捷還是坑?
※如何創建有效的推送
※手游第三方服務商興衰史:建立核心競爭壁壘方能始終