SDK设计之我谈
最近招聘过程中,看到许多面试者都有编写SDK的经历。于是提问:设计开发一个SDK需要考虑哪些方面内容? 这是一个开发性问题,就像一千个读者有一千个海姆雷特。实际上这个问题非常考验人,综合考虑面试者的思考力、架构设计能力等各方面综合能力。
下面谈谈我对设计实现一个SDK的看法,也不一定对,欢迎大家一起探讨:)
首先,要设计一个SDK一定要考虑用户需求,确定边界,SDK需要包含哪些功能。个人认为SDK应当精简,专注实现一部分功能即可。功能太多反而不利于后面演化,会不会设计成一个app更加合适呢?用户可以通过组合各种sdk来实现各种需求,类似于linux中的shell管道。这方面Retrofit可以说是非常好,只专注实现网络库架构,其他的异步、序列化、网络引擎都可以插拔配置。
确定好需求后一定要明确目标,以目标为导向才能保证过程不会走偏。SDK的功能性需求一定要满足,并且不能有bug,这个是基础。试想下如果你在使用一个sdk,连基本功能都有偏差或者有bug,你是什么感受,还会继续使用吗?实现功能性需求是最重要的。
此外除了功能性需求,软件设计开发中还要考虑非功能性需求。比方说稳定性、性能、安全等。
- 稳定性:如果sdk不稳定,功能时好时坏,用户是不是很懵逼。如果sdk有bug,导致了宿主应用崩溃,对实际用户造成体验多不好。故而一个高水准的sdk一定是一个稳定性非常好的sdk。
- 性能:性能实际包含多个方面,比方说包体积、电量、内存等。这些因素对于sdk设计者挑战非常大,但又是对用户影响十分深远的部分。要设计好一个sdk,性能必须满足一定标准。
- 安全:前两者是面向用户的,安全大多数情况是对自己而言的。在编写sdk中,应当要考虑如何保证容器代码安全,保证核心数据、接口不被暴露,保证核心代码不被获取。
在编码过程中,个人觉得需要遵循几个基本原则。一个是接口隔离,设计应当小而精简;另一个是开闭原则,对于扩展开放,对于内部修改封闭。对外交互部分尽量面向接口编程,实现抽象。另外还要注意接口易用性,设计符合“人性”的接口,面向“大众”的接口,减少奇技淫巧的使用。sdk是给别人使用的,不是用来炫技的,朴实就好。
还有一个部分经常被很多人遗忘,就是在sdk升级时,需要考虑到向后兼容。不能让用户升级你的sdk后原有功能不可用了。想想python吧…需要需要废弃原有可能,请使用Deprecated,并标注在什么版本后会进行下线。请给用户一定时间来升级适配。针对每个版本sdk,也可以提前最晚支持的时间点。
最后,完成sdk编码工作后,一定要记得编写文档。俗话说,程序员最讨厌两件事,一个是写文档,另一个是使用的sdk没有文档。一份好的文档能让用户事半功倍,快速接入使用sdk,并减少后续bug。对于自己来说也能减少技术支持答疑时间。
以上是个人的一些拙见,限于本人的经验和视野,可能有遗漏或错误,欢迎大家拍砖。