概览
客户端 SDK(Software Development Kit),顾名思义,是集成在应用客户端的 SDK。SDK 作为产品与app 开发者的交互,从下载集成开始,历经功能开发、测试、打包等流程后作为应用的一部分上线,最终交付给 app 用户。
客户端 SDK 特殊在哪里呢?首先是终端设备的多样化,比如移动端、桌面端、嵌入式设备、浏览器等;其次是操作系统的多样化,比如 Android、iOS、macOS、Windows、Linux、HarmonyOS、Chrome、FireFox、Safari;再次是技术栈的多样化,比如 Java、Kotlin、Objective-C、Swift、C++、C#、React Native、Flutter、Unity、Electron、Uniapp、React.js、Vue.js。为了尽可能满足客户的需求,客户端 SDK 通常会扩大支持范围,为自己赢得竞争优势。
如何保证美好的第一印象
对于 ToB 业务,用户(应用开发者)的初体验就是从 SDK 的下载集成到 TTFHW(Time To First Hello World),这也是用户对 SDK 的第一印象。
如何保证美好的第一印象呢?对于应用开发者来说,不需要什么花里胡哨的东西。他们只认准一点:能跑通就是最美好的体验。如果跑都跑不通,后面的功能再多也体验不到。
提供可跑通的示例项目和配套的跑通指南
很多做 ToB 业务的公司都会准备好示例项目,把常见的功能集成好。开发者拿到示例项目,只要能跑起来,就能参考这个示例项目开发自己的应用。但是跑起来这个事情本身好像也没那么容易。
拿一个放在 GitHub 仓库里的示例项目为例。开发者需要连续做对这些事情才能算真正跑通:
- 使用正确的开发设备。
- 正确配置开发环境。
- 把项目仓库拉下来。
- 为项目安装正确的依赖项。
- 在正确的运行环境下运行项目。
- 运行成功后看到期望的效果
技术文档工程师说:交给我吧!把项目的 README 写成一个详尽的跑通教程即可!当然,自己写的教程,自己必须能跟着跑通。最好还有不熟悉项目的开发者也能自主跑通。
这里是一个 Android 示例项目的 README。
有了这个跑通指南之后,仓库的 issue 就少了很多 “demo 怎么跑不通啊!” 的问题了。因为开发者基本都能一次跑通啦。
提供可跑通的手把手教程
跑通之后,开发者就要从项目里面看 SDK 的具体实现逻辑了。等一等,哪些是 SDK 的 API,哪些又是 Android 原生库,还有哪些是项目引用的第三方库呢?需要花点时间找了。对于没有耐心的开发者,也许就不看了,直接一句:“问客户支持吧“。
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
Log.i(TAG, "onSurfaceTextureAvailable");
mTextureDestroyed = false;
mSurfaceWidth = width;
mSurfaceHeight = height;
mEglCore = new EglCore();
mDummySurface = mEglCore.createOffscreenSurface(1, 1);
mEglCore.makeCurrent(mDummySurface);
mPreviewTexture = GlUtil.createTextureObject(GLES11Ext.GL_TEXTURE_EXTERNAL_OES);
mPreviewSurfaceTexture = new SurfaceTexture(mPreviewTexture);
mPreviewSurfaceTexture.setOnFrameAvailableListener(this);
mDrawSurface = mEglCore.createWindowSurface(surface);
mProgram = new ProgramTextureOES();
if (mCamera != null || mPreviewing) {
Log.e(TAG, "Camera preview has been started");
return;
}
try {
mCamera = Camera.open(mFacing);
/**It is assumed to capture images of resolution 640x480. During development, it should
* be the most suitable supported resolution that best fits the scenario.*/
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(DEFAULT_CAPTURE_WIDTH, DEFAULT_CAPTURE_HEIGHT);
mCamera.setParameters(parameters);
mCamera.setPreviewTexture(mPreviewSurfaceTexture);
/**The display orientation is 90 for both front and back facing cameras using a surface
* texture for the preview when the screen is in portrait mode.*/
mCamera.setDisplayOrientation(90);
mCamera.startPreview();
mPreviewing = true;
}
catch (IOException e) {
e.printStackTrace();
}
}
从示例项目里面扒代码确实是一个不错的方法,但是有没有对开发者更友好的方法呢?技术文档工程师回答:当然有!
以构建一个极简功能的应用为目标,从选择开发设备、配置开发环境开始,到使用 IDE(Integrated Development Environment)建立空项目、集成 SDK、实现基本逻辑、构建并运行项目、测试运行效果。一套全程保姆级的教程就诞生了。
下面是一个基于 Flutter 的客户端 app 教程:
等到运行完成的那一刻,开发者的 aha moment 就诞生了。
更进一步:可以实时互动的手把手教程
这是 Apple 的 SwiftUI 教程。设计感与可操作性的完美结合:
当然想做到苹果这样是不太容易的。但我们也可以做到类似的效果。
接下来,技术文档工程师还能做什么
开发者体验的提升永无止境。优秀的开发者体验,会给你的产品带来巨大的竞争优势。
举个例子,React.js 官方文档重构的事情:
issue 里提到了通过实际操作来学习 React。而目前的 Beta 文档站点也践行了这个目标:
这里使用了 codesandbox 的嵌入。
可以看到,开发者文档和代码的边界其实是比较模糊的。软件行业的技术文档工程师需要拥抱代码,才能在正确的方向上有效提升开发者体验。