如何創建一個一流的SDK?

来源:http://www.cnblogs.com/shansheng/archive/2017/06/07/6957396.html
-Advertisement-
Play Games

怎麼樣的SDK算是一個好的SDK? 在做SDK的過程中我們走過非常多的彎路,是一個難以想象的學習過程,我們總結一個好的SDK應該具備的特質: 易用性,穩定性,輕量,靈活,優秀的支持. 一、易用性 因為工作的關係我接觸了很多的開發者,其中有行業知名的公司的開發者,也有極小的個人開發者.有一個現象很有意 ...


怎麼樣的SDK算是一個好的SDK?

在做SDK的過程中我們走過非常多的彎路,是一個難以想象的學習過程,我們總結一個好的SDK應該具備的特質:
易用性,穩定性,輕量,靈活,優秀的支持.

一、易用性

因為工作的關係我接觸了很多的開發者,其中有行業知名的公司的開發者,也有極小的個人開發者.有一個現象很有意思,不管是能力較強的開發者還是能力一般的開發者,他們都會不停的對你的SDK吐槽.因為他們對於好用的標準是不一樣的,所以你必須要將你的SDK易用性考慮到極致,不然後續的技術支持將是一個十分痛苦的事情.

  • 不要過度設計,過度設計是程式員常常犯的錯誤,如果只是一個演示demo,應該儘量的簡單,簡單到最基礎的程式員都能夠看懂.
  • 介面儘量的見名知義.
  • 要相信絕大多數的開發者都是不看文檔的.於是根據開發者的直覺去設計API,這樣聽起來是不是太靠譜?事實上比如你的SDK的生命周期設計方法跟系統差異性不大,比如你的播放器的介面設計跟系統播放器相差不大,那對開發者來講就是福音.
  • 介面能夠統一的儘量統一,比如iOS和Android的介面,應該儘量的統一.
  • 儘量多的預設參數,這裡面有一些小的技巧,以下我提一個小的例子,比如我們的SDK,我們有一個跳轉錄製的介面,事實上就是將一堆的參數給到下一個SDK頁面,讓SDK接收參數,我們選擇給一個結構體暴露給用戶,如下:

    AliyunVideoParam recordParam = new AliyunVideoParam.Builder()
                      .setResulutionMode(resolutionMode) //設置錄製解析度,目前支持360p,480p,540p,720p
                      .setRatioMode(ratioMode) //設置視頻比例,目前支持1:1,3:4,9:16
                      .setRecordMode(RecorderDemo.RECORD_MODE_AUTO) //設置錄製模式,目前支持按錄,點錄和混合模式
                      .setFilterList(eff_dirs) //設置濾鏡地址列表
                      .setBeautyLevel(80) //設置美顏度
                      .setBeautyStatus(true) //設置美顏開關
                      .setCameraType(CameraType.FRONT) //設置前後置攝像頭
                      .setFlashType(FlashType.ON) // 設置閃光燈模式
                      .setNeedClip(true) //設置是否需要支持片段錄製
                      .setMaxDuration(max) //設置最大錄製時長
                      .setMinDuration(min) //設置最小錄製時長
                      .setVideQuality(videoQuality) //設置視頻質量
                      .setGop(gop) //設置關鍵幀間隔
                      .build();
      AliyunVideoRecorder.startRecordForResult(this,REQUEST_RECORD,recordParam);
    這樣有什麼好處呢,我們事實上可以預製N個參數。這樣用戶調用一個錄製功能只需要做什麼呢?,如下:
    AliyunVideoParam recordParam = new AliyunVideoParam.Builder().build(); AliyunVideoRecorder.startRecordForResult(this,REQUEST_RECORD,recordParam);
    • 上面還說了開發者對於易用性的標準是不一樣的,面向的需求也是不一樣的,上面的需求只能滿足最基礎的簡單需求,如果要自定義界面,這個時候就需要暴露更加深
      的介面.於是我們將我們的介面設計分為多層.這樣就基本能夠滿足用戶最初級的要求和自定義屬性的要求.

      DEMO--->AliyunVideoRecorder(第一層介面)---->AliyunIRecorder(第二層介面)

二 、穩定性

如何保證一個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的時候的一些思考.如果覺得有一定意義,歡迎交流.:)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 嘗試用springmvc,mybatis,mysql做個工具平臺。 在本地mac筆記本上運行正常,但把包放置到伺服器上,啟動tomcat就報錯。類找不到了。 文件目錄: 實現需求:上傳文檔並記錄在資料庫中。自建了DocFile類。創建對應的mapper文件寫sql語句。 mapper.xml中nam ...
  • 通常我們的做法是(尤其是在學習階段):定義一個新的變數,藉助它完成交換。代碼如下: int a,b; a=10; b=15; int t; t=a; a=b; b=t; 這種演算法易於理解,特別適合幫助初學者瞭解電腦程式的特點,是賦值語句的經典應用。在實際軟體開發當中,此演算法簡單明瞭,不會產生歧義, ...
  • 一、編程規約 (一) 命名規約 1. 【強制】 代碼中的命名均不能以下劃線或美元符號開始,也不能以下劃線或美元符號結束。 反例: _nam / __name / $Object / name_ / name$ / Object$2. 【強制】 代碼中的命名嚴禁使用拼音與英文混合的方式,更不允許直接使 ...
  • 網上有很多人探討Java中異常捕獲機制try...catch...finally塊中的finally語句是不是一定會被執行?很多人都說不是,當然他們的回答是正確的,經過我試驗,至少有兩種情況下finally語句是不會被執行的: (1)try語句沒有被執行到,如在try語句之前就返回了,這樣final ...
  • jdk1.7.0_79 HashMap可以說是每個Java程式員用的最多的數據結構之一了,無處不見它的身影。關於HashMap,通常也能說出它不是線程安全的。這篇文章要提到的是在多線程併發環境下的HashMap——ConcurrentHashMap,顯然它必然是線程安全的,同樣我們不可避免的要討論散 ...
  • 1.什麼是生成器 通過列表生成式,我們可以直接創建一個列表。但是,受到記憶體限制,列表容量肯定是有限的。而且,創建一個包含100萬個元素的列表,不僅占用很大的存儲空間,如果我們僅僅需要訪問前面幾個元素,那後面絕大多數元素占用的空間都白白浪費了。所以,如果列表元素可以按照某種演算法推算出來,那我們是否可以 ...
  • __doc__ 查看尖的描述信息 __module__表示當前操作的對象所在的模塊 __class__表示當前操作的對象所屬的類 __init__構造方法 通過類創建對象自動執行 __del__析構方法,當前對象在記憶體中被釋放自動斬妖執行 __call__對象後面加括弧觸發執行 __dict__查看 ...
  • 初學時,對不太熟悉的markdown語法,有個簡單記錄 [公式][1] 公式一般用Latex書寫,線上[Latex編輯器][2]可以使用,有以下幾種方法供選擇 有然後保存為圖片gif格式,使用img標簽進行引用。 使用Google Chart的伺服器 `` 給個例子, 顯示結果為(博客園的markd ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...