广告投放系统(二)

自家广告组件的演化历程。

2017年的时候,我们发布了自家小程序,当时小程序还不支持任何广告变现,所以上线之后一段时间并没有任何广告内容。

后来,随着小程序商业化的推进,小程序平台推出了原生的平台广告组件,因此我们也第一时间接入了下小程序的平台广告。

Read More

客户端产品重要的事

本人所经历的产品主要面向移动 C 端用户,同时产品对外提供各种应用级别的开放服务。

本文只是个人的经验记录,以下所有内容——非参考,非规范,非权威。

最最重要的方面

对 C/S 形式的产品来说,最最最最最重要的事,就是

版本升级机制!

最初我们都没有任何经验,因此一开始谁都没有在乎这一点,直到后面碰到各种问题特别是接口被盗取的时候,才开始认真考虑。

产品本身对版本升级应该支持的内容包括:

  1. 自主可控的升级提示和升级渠道。对于iOS这种无法控制渠道的,也应在应用内保留完整的升级提示机制,并提供打开升级AppStore的快捷方式。
  2. 对于因版本问题引发的产品问题,一定要给用户强反馈,并引导用户升级。比如,如果由于接口安全升级导致用户无法查询,那么在检测到接口数据的特定标志后,应该给用户一个弹框,告知具体原因并引导升级。

重要的方面

1. 用户体系

产品开始的第一天,就应该确定下来产品的用户访问模式,一个产品可以选择支持游客模式或者注册模式,或者两者都支持,典型代表:

名称 游客模式 注册模式
今日头条 支持 支持
微信 不支持 支持

需要指出的是,如果产品一开始只支持游客模式而不支持注册模式,那么在引入注册模式之前,尽量不要做任何带有用户成长性质的活动。同一个用户从游客模式转化到注册模式的时候,数据合并策略也应该想清楚衔接方案,保持平稳过渡。

如果选择了注册模式,一定要考虑跨平台的迁移问题。

唯一入口

对于对外开放服务的应用,需要坚持的原则:

  1. 保持对外沟通的入口与协议的唯一性
  2. 对外提供的协议应屏蔽任何功能的实现细节
  3. 禁止任何第三方应用绕开入口或使用非标准协议访问产品功能

次要的方面

次要的方面不是核心问题,但在前期也比较重要。不过这些方面通常有其他方式可以实现基本功能,只有在这些方式确实不满足需求的时期,才需要考虑自行设计实现方案。

原则:做得差的实现,比不做影响更恶劣。

数据统计

统计数据的方式大致有:

  1. 后台请求数据
  2. 应用市场的后台数据
  3. 服务商的后台数据
  4. 第三方统计SDK
用户反馈

获取用户反馈的方式大致有:

  1. 应用市场的评论
  2. 服务商的后台
  3. 微博、贴吧等大众论坛
  4. 用户的主动反馈
  5. 运营的用户访谈
用户分享

与“用户反馈”类似

账号管理

现在基本上所有认证都是通过手机,所以一些重要的认证信息,绑定的手机号有两种选择:

  1. 全部使用创始人的手机
  2. 新办理一个手机号挂在创始人名下,专门用于账号认证

前期不重要的方面

只要产品实现度完成了核心功能,并且没有bug,其他方面都暂不重要。

防抖与节流的通俗解释

防抖

用自动门来类比,我们在通过自动门的时候,当门检测到人通过之后,会先保持开启状态约 15 秒钟,如果在这 15 秒之内,再没有人通过,那么门会自动关上。
但是,如果在这 15 秒之内不断有人通过,自动门在确认最后一个人通过 15 秒之后,才会关门。

对于自动门来说,不断通过的人就是抖动,所以有 15 秒的时间来进行防抖。

我们用 lodash 来实现这个机制就是:

1
2
3
4
5
6
7
const WAIT_TIME = 15 * 1000;

function closed(){
console.log('门关了);
}

function close = _.debounce(closed, COLD_TIME);

节流

玩过 moba 游戏(比如王者荣耀)的都知道,很多英雄的被动都有一个冷却时间,在这个冷却时间内,被动技能只能触发一次。比如项羽的被动:

陷阵之志:
冷却值:120秒
被动:当生命低于30%,项羽可在6秒内获得30%伤害与40%免伤加成,此效果有120秒CD

意思就是说在项羽在挨揍的时候,从血量掉到30%以下触发被动效果。同时,这一刻开始,往后的 120 秒内都不能再触发被动了,哪怕这120秒内被打死了,都不会获得被动。

我们用 lodash 来实现这个机制就是:

1
2
3
4
5
6
7
const COOL_DOWN = 120 * 1000;

function buff (){
console.log('获得30%伤害与40%免伤加成');
}

function passive = _.throttle(buff, COOL_DOWN); //被动技能

总结

所以,从目的来讲,防抖是为了避免用户误操作触发的尴尬,节流是为了限制用户想连续触发的意图。

finalhandler.js

很多 Node 的 Web 框架中用到了这个 finalhandler.js 模块,它的作用按照官方文档描述如下:

Node.js function to invoke as the final step to respond to HTTP request.

主要是在 req 的处理中作为最后的兜底处理器——错误处理。

Read More

Arrow Function

起源:有人发给我下面一段代码:

1
2
3
4
5
6
7
8
9
10
11
<script>
var name = '11';
var obj = {
name:'22',
fun1:()=>{
console.log(this.name);
}
};
obj.fun1(); // '11'
</script>

问了两个问题:

为什么打印出来的不是 '22'?
为什么打印出来的不是 undefined?

Read More

var & let & const

关于这个话题,我想要讨论的问题只有一个:什么时候应该用var,什么时候应该用 let,什么时候应该用const?

我的观点是,对于现代前端项目,有三个原则:

  1. 任何时候都不要用 var
  2. 能用 const 的地方都用 const
  3. 不能用 const 的地方,就用 let

Read More