云原生微信小程序开发实战读书笔记-1

数据很关键

数据是连接市场与企业的桥梁,这就是它的意义,同时也是技术人关注数据的原因。 因为数据决定了产品的迭代方向,也就决定了对于技术研发的业务需求,进而决定了我们面临什么样的挑战和创新。

数据的生命周期

数据的生命周期可以简单地分为两部分:第一是统计,第二是分析。数据的分析需要专业的岗位或者平台负责,比如数据科学家这种岗位或者一些数据分析平台;对于我们开发者来讲,我们要做的就是统计数据。细细分来,我们需要做两件事:

  • 数据建模,明确需要统计的数据类型
  • 采集方案,制定手机数据的具体措施

数据建模

一个应用程序需要统计的数据从类型划为:性能数据用户数据异常数据,这三种数据类型同样适用于微信小程序。

  • 性能数据

    • 启动性能

      减少用户打开小程序(或某个页面)后的等待时间

    • 运行时性能

      提高用户操作小程序的流畅度

  • 用户数据

    • 静态数据

      用户的年龄、性别、地域等信息,这些数据叫“用户画像”

    • 动态数据|用户行为数据

      用户在使用小程序期间的一些交互操作数据,比如点击某个按钮,从页面A切换到页面B;用户的行为踪迹,比如先点击页面A的某个按钮然后点击另一个按钮最后切换到页面B……

    在现实场景中根据业务类型的不同还会演化出更多领域专属的行为数据类型(如图所示):

用户数据

  • 异常数据
    • 端侧的代码异常,比如小程序 JavaScript 脚本的某段逻辑执行报错
    • 服务异常,不过这类异常情况不仅仅是小程序服务端的问题,也可能是用户设备所在网络环境造成的 HTTP 请求失败
    • 行为异常,最常见的一种就是爬虫脚本频繁地请求某个服务接口

性能数据、用户数据和异常数据三者相对独立,而我们统计数据的目的并不是收集这些独立的数据,而是希望将它们综合在一起进行分析,这样才能从多维度、多方面获取数据隐藏的信息。也就是将所有数据通过一定的联系归属到在更上一层的领域内分析。在小程序场景下,把这三种类型数据联系到一起的上层领域就是小程序的每个页面-Page。页面再上一层的领域就是小程序的运行环境(包括用户设备信息和小程序的版本信息)。

数据采集

不同类型的数据在采集方案上也有一定的不同,其中性能数据、异常数据相对于用户数据来说与业务的关联度并不高,所以对应的采集方案也更具有通用性。而用户数据数据量更庞大、与业务场景的关联性比较高,所以需要提取一些具备普适性的方案讲述。

  • 性能数据采集

    性能数据的采集通常会放在小程序发布前的研发或测试阶段,将其作为自动化测试的一部分

    性能数据的采集方法上,主流的有两种:

    结合两种采集方法的优缺点,得到了一个综合方案:

    • 使用截图+图片比对的方法应对所有类型的设备,获取相对粗粒度的性能数据
    • 在 Android 设备上使用性能 Trace 工具获取更精细的数据。
  • 异常数据和用户数据采集

    异常数据的采集也可以称为异常监控,采集到异常本身并不是主要目标,更重要的是能够采集到引起异常的用户行为路径。用户行为数据的采集也是这样。我们要获取的并不仅仅是用户点击了哪个按钮,还需要采集到这个按钮所在的页面,如果此页面是由其他页面跳转而来还需要采集前序页面的路径信息。

代码的技巧:

借助ES6中Proxy和Relfect,实现API代理。

Page = new Proxy(Page, {
  get(target,key,context){
    const originHandler = Reflect.get(target,key,context);
    // 只代理函数
    if(typeof originHandler === 'function'){
      return function(...args){
        reportClientLog({
          // ...上报数据
        });
        originHandler.call(context,...args);
      }.bind(context);
    }
    return originHanlder;
  }
});

然后将其封装为一个独立的javascript文件,在小程序中引入。

require('./report.js');
Page({
  // ...
})

这样每次调用Page的API都会上报数据,但是这样数据就会很多,我们仅需要几个特定的API,所以就需要使用白名单,下面这段代码不仅加入了白名单机制,而且还把被代理的对象改成了动态的参数,这样代码更具有普适性,比如小程序的App和Page对象:

export default function report(obj,apilist){
 return new Proxy(obj, {
  get(target,key,context){
    const originHandler = Reflect.get(target,key,context);
    // 只代理列表内的函数
    if(typeof originHandler === 'function'&&apiList.includes(key)){
      return function(...args){
        reportClientLog({
          // ...上报数据
        });
        originHandler.call(context,...args);
      }.bind(context);
    }
    return originHanlder;
  }
}); 
}

//调用时
const report = require('./report.js');
// app.js
App = report(App, [
  'onShow',
  'onLoad',
  'onLaunch'
]);
App({
  // ...
});
// page.js
Page = report(Page, [
  'onShow',
  'onHide',
  'onLoad',
  'gotoCart'
]);
Page({
  // ...
});

数据分析

数据分析需要非常深入的领域专属知识甚至特定的岗位,这指的是的对用户数据的分析,包括用户画像数据和行为数据,这些数据会影响产品的决策和迭代策略。

性能数据能够帮助技术研发人员发现影响应用程序性能的不良因素,然后进行专项优化。

异常数据主要的作用是监控线上环境存在的问题,然后根据问题影响面的大小制定告警策略,比如当监控到影响功能逻辑的严重脚本错误,后台监控服务会通过邮件、短信、电话的方式通知责任人督促尽快解决。

整体的数据监控体系简化为下图:

Drawing 14.png

Decorator实现API的代理

export default function report(target: Function, type: string, descriptor: PropertyDescriptor) {
   reportClientLog({
      // ...上报商品页数据
    });
  descriptor.value(args)
}

//调用
@report