听阿里云工程师谈谈如何开发一个优秀的SDK

作者简介:德胜 现任阿里视频云团队资深开发工程师,多年移动端音视频经验,现在从事业务架构设计、客户技术支持等相关工作。

越来越多的开发者选择使用SDK来辅助开发,作为一种工具,它可以帮助你快速建立应用软件,而省去了编写硬件代码和基础代码架构的过程。我们团队一直致力于移动视频领域SDK的开发,踩过坑趟过河,遇到了很多问题也总结了一些经验,下面是我们总结的一个好的SDK应该具备的特质:易用性,稳定性,轻量,灵活,优秀的支持.

一、易用性

因为工作的关系我接触了很多的开发者,其中有行业知名的公司的开发者,也有极小的个人开发者.有一个现象很有意思,不管是能力较强的开发者还是能力一般的开发者,他们都会不停的对你的SDK吐槽.因为他们对于好用的标准是不一样的,所以你必须要将你的SDK易用性考虑到极致,不然后续的技术支持将是一个十分痛苦的事情.

不要过度设计,过度设计是程序员常常犯的错误,如果只是一个演示demo,应该尽量的简单,简单到最基础的程序员都能够看懂.

接口尽量的见名知义.

要相信绝大多数的开发者都是不看文档的.于是根据开发者的直觉去设计API,这样听起来是不是太靠谱?事实上比如你的SDK的生命周期设计方法跟系统差异性不大,比如你的播放器的接口设计跟系统播放器相差不大,那对开发者来讲就是福音.

接口能够统一的尽量统一,比如iOS和Android的接口,应该尽量的统一.

尽量多的默认参数,这里面有一些小的技巧,以下我提一个小的例子,比如我们的SDK,我们有一个跳转录制的接口,事实上就是将一堆的参数给到下一个SDK页面,让SDK接收参数,我们选择给一个结构体暴露给用户,如下:

这样有什么好处呢,我们事实上可以预制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的健壮性性要强. </br>要做到以上任何一点都需要经验的支持,绝对不要想当然,尽量的从开发者的角度去设计,会让自己收获很多.

API可扩展:在业务过程中我们总是面对产品不断的需求压迫,但是从设计开始的时候就需要尽可能的考虑多的业务需求的可能性,这里有一个技巧,如果你不能确定你未来的需求增加,你应该保证尽量少的接口支持尽可能多的业务,不然到后期你会发现你的对外接口越来越多,一堆冗余接口.:)

接口可测试性,一些小的技巧可以让你的SDK具备可测试性为了测试,有时我们需要进行模拟,模拟(mock)类作为真实类的仿制类,它没有真实操作,并且允许被重写调用和验证.  如果有些类是final的就很难模拟,并且是一个基于状态的单例的话,就比较恶心了,这时候我们就需要考虑考虑在设计上尽量的规避.比如尽量避免单例,避免final.   需要有测试用例,不管是开发人员还是测试开发人员都需要根据测试用例编写.

API的健壮性 大多数的开发者经常都是不耐烦的,他们看到很长时间都找不到出错的原因是会有非常负面的情绪的,所以有一些错误应该尽早的抛出,这就好像比如你要build一个项目,如果一些错误能够在编译期间就暴露,一定好于完成编译之后才出现错误.所以你需要写清楚一些exception抛出给用户.  尽量的保证接口的生命周期,如果是有序的需要在文档说明.

五、优秀的支持

如果以上四点你已经做得非常好了,这个时候你的文档和技术支持直接就决定用户是否选择你的SDK.也直接决定用户对你的评级.所以好的支持就非常重要了.你需要建立开发者社区,apple文档,javadoc,readme.甚至集成文档,示例教程.

需要有demo代码,demo代码应该尽可能的简单.让使用的人可以遵循你的代码进行尝试.一定一定不要让你的示例代码写的过于复杂.不要在无关紧要的交互模式上纠结.不然没有用户会花大量的时间去学习你的示例代码.而且他们还会有很多疑问,或者bug. (解决方案除外)

如果有些接口需要废弃,你应该添加废弃的注解   一定要有一个更新list.清晰的版本更新日志.要相信不是所有的开发者会选择最新版本的,你需要保证你的每一个版本都是稳定可用的.

作为一个SDK,你的功能一定不能是自己臆想出来的.你应该常常跟开发者交流,了解用户的需求。每个功能都需要有客户反馈作为依据.

以上几个点肯定不是建设一个伟大的库的全部.只是我们在开发短视频SDK的时候的一些思考.如果觉得有一定意义, 欢迎交流.:)SDK交流钉钉群号:11759425

该文来自 阿里云云栖社区转载请联系@阿里云云栖社区官方微博

(http://weibo.com/p/1006061939498534)

更多技术干货及好文,请关注

官方微博:@阿里云云栖社区   现在有免费赠手机的活动哦

官方微信:云栖社区(yunqiinsight)

官方知乎号:阿里云云栖社区

时间: 2024-10-07 00:54:11

听阿里云工程师谈谈如何开发一个优秀的SDK的相关文章

在阿里云容器服务上开发基于Docker的Spring Cloud微服务应用

本文为阿里云容器服务Spring Cloud应用开发系列文章的第一篇. 一.在阿里云容器服务上开发Spring Cloud微服务应用(本文) 二.部署Spring Cloud应用示例 三.服务发现 四.服务间通信与集成 五.服务智能路由 六.集中配置管理 七.高可用和容错 八.监控和日志 九.服务的部署和发布策略 微服务概述 单体应用通常指在一个程序中满足多个业务或技术领域的需求,不同的需求领域内化为模块.假定我们要开发一个Web应用,通常的MVC模式可以满足要求.针对不同领域有不少代码生成工具

egret+git+阿里云code搭建团队开发

准备: GIT客户端 廖雪峰老师GIT教程 GIT客户端安装完成后,打开Git Bash ,输入代码 ,设置git提交与获取的git账户信息 git config --global user.name "阿里云code账户名" git config --global user.email "邮箱" 1.创建阿里云code项目 登录阿里云code,点击NEW PEOJECT创建一个项目.创建一个项目名为Test项目,项目的可见级别,根据项目需要选择 注* 此步骤完成后

开个坑, 写个阿里云开放储存服务(OSS)的C++版SDK以及客户端

这应该是继我研究手册QQ协议后的第2个稍微正式一点的网络程序, 不只是Scoket套接字编程, 还涉及到更多的HTTP协议知识! 阿里云开放储存服务OSS官方已经提供了不少SDK, 包括PHP/Python/Java/C#, ... 但唯独没有C/C++的, 很可惜. 不过, 论坛上倒是收集了不少C/C++版本的SDK. 但我还是想自己写一个试试, 于是就有了这个坑!!! 这个坑, 不是今天开的, 具体时间应该回到6号(今天10号), 不过我都不敢相信, 排除第3方代码, 已经有80多KB了啊!

【技术干货】听阿里云CDN安防技术专家金九讲tengine+lua开发

一.介绍 二.安装 三.运行 四.开发 1.介绍 Tengine:轻量级.高性能.高并发.配置化.模块化.可扩展.可移植的Web和反向代理 服务器,Tengine是nginx超集,但做了很多优化,包含了很多比较有用的模块,比如直接包含了lua.proc等很有用的模块. Lua:一个很轻量级的 脚本,也号称性能最高的 脚本.代码总共不到600k,32个C文件,23个头文件: [email protected] ~/lua-5.1.5/src# du -sh ./ 572K    ./ [email

Web开发从零单排之一:在新浪云平台SAE上开发一个html5电子喜帖

需求描述: 本人大婚将至,女朋友说“现在都流行在微信上发电子请帖了,你不是技(cheng)术(xu)宅(yuan)嘛,不会连这个都搞不定吧” 本人嘴上说这等小事何足挂齿,但心里还是七上八下的,虽然自认为几年开发经验在工作上还算得心应手,但也因为工作项目局限,对Web开发特别是前端和建站技术接触不多 于是打开搜索引擎和女朋友一起看看现在市面上的服务,基本上都是给出一套模板,自己填上内容和照片后,生成电子请帖,而形式有网页也有单张图片的 收费也不贵,都在百元左右.但收费是小,面子是大啊,作为一个软件

【技术干货】听阿里云CDN安防技术专家金九讲SystemTap使用技巧

1.简介 SystemTap是一个Linux非常有用的调试(跟踪/探测)工具,常用于Linux 内核或者应用程序的信息采集,比如:获取一个函数里面运行时的变 量.调用堆栈,甚至可以直接修改变量的值,对诊断性能或功能问题非 常有帮助.SystemTap提供非常简单的命令行接口和很简洁的脚本语 言,以及非常丰富的tapset和例子. 2.何时使用 定位(内核)函数位置 查看函数被调用时的调用堆栈.局部变量.参数 查看函数指针变量实际指的是哪个函数 查看代码的执行轨迹(哪些行被执行了) 查看内核或者进

想学习大数据却搞不懂Hadoop?阿里云工程师带你三步解读Hadoop!

一.什么是Hadoop? Google发表了两篇论文:描述如何以分布式方式存储海量数据的Google文件系统和描述如何处理大规模分布式数据的MapReduce:大型集群上的简化数据处理.受这两篇论文的启发,DougCutting实现了这两篇基于OSS(开源软件)的论文的原则,Hadoop诞生了. Hadoop是一个用于分布式存储和处理大型数据的开源平台.Hadoop作为一个大规模的分布式数据处理平台,已经成为许多程序员的重要技能. 二.Hadoop能做什么? 大数据时代已经到来,给我们的生活.工

阿里云服务器开发总结(2014-08-25)

阿里云服务器开发总结(这2周工作总结) 1.阿里云暂时只提供C#和Java的sdk,所以需要编写C++代码去调用Dll,以前学习过DLL的显式链接和隐式链接使用两种方式,在工作中加强了对DLL的灵活使用,DLL还分为32位和64位,因为DLL导出的函数指针有32位和64位之分.所以要编译32位和64位下不同版本的DLL来供客户来使用. 2.学习了用C#编写COM组件,网上教程不少,几点注意事项, 2.1 所要导出的类必须为公有 2.2 要导出的属性.方法必须使用接口方式,如果没有在接口中声明,即

在阿里云上搭建一个简单的node服务器

一.阿里云服务器以及node环境的搭建 服务器可以去阿里云官网购买一个ECS云服务器,价格还是有点小贵的,如果想使用免费的阿里云服务器,那么阿里云官网每天也是有抢免费的服务器的,每天上午十点,新人能抢到为期半年的服务器. 然后有了服务器以后,首先搭建一个node的运行环境,保证node 能正常使用,这个不是本文的内容就不多加赘述了. 如果没有搭建的小伙伴可以参考这里. 二.远程服务器上的代码管理 在阿里云服务器上可以安装一个 git 版本控制器,将自己的代码放置在自己的 GitHub 上,然后在