跳到主要内容

世界不是平的 —— 经济学人特别报道:全球供应链

· 阅读需 8 分钟

影响供应链的两种力量:科技与政治

有两种全球化,一种是工业革命带来的大发散。一种是信息革命带来的大收敛,发达国家提供资本和高科技、去工业化,欠发达国家提供廉价劳动力、工业化。后一种全球化造就了供应链的黄金时代,但是它对世界的影响更加地突然而且难以控制。

而现在的我们处于后一种全球化的末尾,增长变慢,经济学人发明了一个词叫全球化趋势放缓 slowbalisation,比如英国脱欧、中美贸易战。

技术上的, AI、机器人、3D 打印、无人车、5G 等让供应链面对前所未有的大变革,这些变革让全球化更可控。然而,这种变革却受到了技术冷战的阻碍。

产业的变化

超过半数的公司认为应该在他们的公司引入供应链方面的 major change,十分之一的企业认为应该彻底推倒重来。这里有两个主要的考虑点:

一个是降低供应链成本带来的风险 - 你只是处在供应链网络的一部分节点上,难移控制网络上相邻节点的相邻节点。11年的日本台风,让一个半导体巨头花了100个 executive 超过一年的时间搞清楚他的供应链的拓展出来的网络具体有哪些公司。

一个是全球贸易不仅是带来了更多的产品,还带来了更多的服务。服务占贸易产值的三分之一,而且服务的增长比产品快 60%,在电信和信息产业能够快到 2 到 3 倍。

具体从三个产业看:

  1. 服装:有一些从中国移向东南亚、越南、孟加拉国、埃塞俄比亚。中国尽管成本有所提高但是熟练工仍然非常有竞争力。

  2. 汽车:区域化和枢纽化:墨西哥辐射北美、东欧和摩洛哥辐射西欧、东南亚和中国辐射亚洲。区域化的一个主要原因是消费习惯的不同,比如皮卡只有在美国很畅销;其他原因还有比如贸易战、汽车的电气化(部件要少很多很多)。

  3. 计算机:有一些公司搬离中国去越南、柬埔寨和墨西哥,甚至搬回美国。有很多公司发现搬离美国很难。深圳还是最牛逼,因为其自动化的能力和高附加值。

亚马逊和阿里巴巴仍然是下一场变革的标杆

亚马逊用数据、算法、机器人做到物流比大部分的竞争对手还要快三分之一。

数字化:新技术如何改造老行业?

  1. 可预测性
    1. 公司有用历史记录预测销售的传统,并相应调整制造和库存等等。AI 能够根据社交媒体用更多的数据、更精准地调和供应链上每个节点的参数。
    2. 调研发现,公司高管认为最应采用的技术是 congnitive analytics 和 AI ,区块链和无人机的排名有所下降。
    3. JDA 用 Blue Yonder 的深度学习的算法,让售空下架的情况减少了 30%,压货时间减少好几天。
    4. ORSAY 用 JDA 的自动定价系统来减少库存。
    5. 英特尔用预测模型省钱省了 $58m
  2. 透明性
    1. 对跨国企业而言,“东西在哪里?”仍然是一个巨大的未解难题。为什么?因为他们对于产品的控制不是最最直接的,他们不造、不运、不存、不卖产品。
      1. 举个例子,17 年德国货运业罢工,把 IBM 昂贵的主机晾在了停机坪上的冰雪里长达一个月,而因为无法精确定位货物,公司还以为被安全地存放在机场的仓库里。
    2. 物联网能够解决这个问题。传感器不仅能够汇报位置,还有方向、温度、适度等等参数。
    3. 新加坡用无人车自动化港口运输。
    4. IBM 和 Maersk 用区块链让运输无纸化和透明化,
  3. 速度
    1. 在硅谷 Tom Linton 的 Pulse command centre,看上去像是五角大楼的指挥中心,能够实时看到供应链上的92个变量,与客户通过手机和电脑共享数据和决策,让库存减少 11 天,释放出 $580m 的现金流。
    2. Li & Fung 让产品设计到上架,从原来的 40 周,减少到了现在的一半。
    3. 3D 打印独角兽 Carbon 帮助福特和阿迪达斯开发和生产产品。
    4. Uber or Airbnb for warehousing

安全上的挑战

供应链管理正在经历从直觉和经验驱动过渡到数据驱动,主要有三大安全方面的挑战:

  1. 华为。替换掉华为的产品会提高成本,而 5G 采取不同的不兼容的技术标准会逼着不同国家站队,而 5G 技术对 IoT 至关重要 。
  2. 黑客攻击。新式的 IoT 设备急于投入使用,没有完备地考虑安全,然而“没有人会愿意开着坦克上班”,因为这实在是太慢了。比较好的应对方法是见招拆招、快速反应。
  3. 贸易战。政策可以一天一个样子,但是工厂可不是想搬就搬。

设计实时联想搜索或自动完成功能

· 阅读需 3 分钟

需求

  • 为社交网络(如 Linkedin 或 Facebook)提供实时 / 低延迟的联想和自动完成功能
  • 使用前缀搜索社交资料
  • 新添加的账户在搜索范围内即时出现
  • 不是用于“查询自动完成”(如 Google 搜索框下拉),而是用于显示实际的搜索结果,包括
    • 通用联想:来自全球排名方案(如人气)的网络无关结果。
    • 网络联想:来自用户的第一和第二度网络连接的结果,以及“你可能认识的人”评分。

Linkedin 搜索

架构

多层架构

  • 浏览器缓存
  • 网络层
  • 结果聚合器
  • 各种联想后端

Cleo 架构

结果聚合器

这个问题的抽象是通过前缀和术语在大量元素中查找文档。解决方案利用这四种主要数据结构:

  1. InvertedIndex<前缀或术语, 文档>:给定任何前缀,找到所有包含该前缀的文档 ID。
  2. 为每个文档准备一个 BloomFilter<前缀或术语>:随着用户输入的增加,我们可以通过检查它们的布隆过滤器快速过滤掉不包含最新前缀或术语的文档。
  3. ForwardIndex<文档, 前缀或术语>:之前的布隆过滤器可能会返回假阳性,现在我们查询实际文档以拒绝它们。
  4. scorer(文档):相关性:每个分区返回所有真实命中及其评分。然后我们进行聚合和排名。

性能

  • 通用联想:延迟 < = 1 毫秒在一个集群内
  • 网络联想(第一和第二度网络的超大数据集):延迟 < = 15 毫秒
  • 聚合器:延迟 < = 25 毫秒

Lyft 的营销自动化平台 -- Symphony

· 阅读需 5 分钟

获取效率问题:如何在广告中实现更好的投资回报率?

具体来说,Lyft 的广告应满足以下要求:

  1. 能够管理区域特定的广告活动
  2. 以数据驱动的增长为指导:增长必须是可扩展的、可衡量的和可预测的
  3. 支持 Lyft 独特的增长模型,如下所示

lyft growth model

然而,最大挑战是管理跨区域营销的所有流程,包括选择竞标、预算、创意、激励和受众,进行 A/B 测试等。您可以看到数字营销人员一天的工作:

营销者的一天

我们发现 执行 占用了大部分时间,而 分析,被认为更重要的,所花的时间要少得多。一个扩展策略将使营销人员能够专注于分析和决策过程,而不是操作活动。

解决方案:自动化

为了降低成本并提高实验效率,我们需要

  1. 预测新用户对我们产品感兴趣的可能性
  2. 有效评估并在各渠道分配营销预算
  3. 轻松管理成千上万的广告活动

营销绩效数据流入 Lyft 的强化学习系统:Amundsen

需要自动化的问题包括:

  1. 更新搜索关键词的竞标
  2. 关闭表现不佳的创意
  3. 按市场更改推荐值
  4. 识别高价值用户细分
  5. 在活动之间共享策略

架构

Lyft Symphony Architecture

技术栈包括 - Apache Hive、Presto、ML 平台、Airflow、第三方 API、UI。

主要组件

生命周期价值(LTV)预测器

用户的生命周期价值是衡量获取渠道效率的重要标准。预算由 LTV 和我们愿意在该地区支付的价格共同决定。

我们对新用户的了解有限。历史数据可以帮助我们在用户与我们的服务互动时更准确地进行预测。

初始特征值:

特征值

随着互动历史数据的积累,预测会得到改善:

根据历史记录判断 LTV

预算分配器

在预测 LTV 之后,接下来是根据价格估算预算。一个形式为 LTV = a * (spend)^b 的曲线拟合数据。在成本曲线创建过程中将注入一定程度的随机性,以便收敛到全局最优解。

预算计算

竞标者

竞标者由两个部分组成 - 调整器和执行者。调整器根据价格决定特定渠道的确切参数。执行者将实际竞标传达给不同的渠道。

一些在不同渠道应用的流行竞标策略如下所示:

投放策略

结论

我们必须重视自动化过程中的人类经验;否则,模型的质量可能会是“垃圾进,垃圾出”。一旦从繁重的任务中解放出来,营销人员可以更多地专注于理解用户、渠道以及他们想要传达给受众的信息,从而获得更好的广告效果。这就是 Lyft 如何以更少的时间和精力实现更高的投资回报率。

设计 Airbnb 或酒店预订系统

· 阅读需 4 分钟

需求

  • 对于客人
    • 按位置、日期、房间数量和客人数量搜索房间
    • 获取房间详情(如图片、名称、评论、地址等)和价格
    • 按日期和房间 ID 从库存中支付并预订房间
      • 作为访客结账
      • 用户已登录
    • 通过电子邮件和移动推送通知进行通知
  • 对于酒店或租赁管理员(供应商/房东)
    • 管理员(接待员/经理/租赁所有者):管理房间库存并帮助客人办理入住和退房
    • 清洁工:定期清理房间

架构

组件

库存 <> 预订 <> 用户(客人和房东)

供应商在库存中提供他们的房间详情。用户可以相应地搜索、获取和预订房间。在预订房间后,用户的付款也会更改 reserved_roomstatus。您可以在 这篇文章 中查看数据模型。

如何查找可用房间?

  • 按位置:使用 空间索引 进行地理搜索,例如 geo-hash 或四叉树。
  • 按房间元数据:在查询数据库时应用过滤器或搜索条件。
  • 按入住和退房日期及可用性。两种选择:
    • 选项 1:对于给定的 room_id,检查今天或更晚的所有 occupied_room,将数据结构转换为按天的占用数组,最后在数组中找到可用的时间段。这个过程可能会耗时,因此我们可以建立可用性索引。
    • 选项 2:对于给定的 room_id,始终为占用的日期创建一个条目。这样更容易按日期查询不可用的时间段。

对于酒店,同步数据

如果这是一个酒店预订系统,那么它可能会发布到 GDS、聚合器和批发商等预订渠道。

酒店预订生态系统

为了在这些地方同步数据,我们可以

  1. 使用幂等性重试来提高外部调用的成功率,并确保没有重复订单
  2. 向外部供应商提供 webhook 回调 API,以在内部系统中更新状态。

支付与记账

数据模型:复式记账

为了执行支付,由于我们调用外部支付网关,如银行或 Stripe、Braintree 等,保持不同地方的数据同步至关重要。我们需要在交易表和外部银行及供应商之间同步数据。

提醒/警报的通知者

通知系统本质上是一个延迟调度器(优先队列 + 订阅者)加上 API 集成。

例如,每日定时任务将查询数据库以获取今天要发送的通知,并按日期将其放入优先队列。订阅者将从优先队列中获取最早的通知,并在达到预期时间戳时发送。如果没有,则将任务放回队列,并让 CPU 空闲以进行其他工作,如果今天有新的警报添加,可以中断此过程。

设计 Memcached 或内存中的 KV 存储

· 阅读需 2 分钟

需求

  1. 高性能,分布式键值存储
  • 为什么分布式?
    • 答:为了存储更大规模的数据
  1. 用于小数据对象的内存存储
  2. 简单的服务器(将复杂性推给客户端),因此可靠且易于部署

架构

大局:客户端-服务器

  • 客户端
  • 给定一组 Memcached 服务器
  • 根据键选择服务器
  • 服务器
  • 将 KV 存储到内部哈希表中
  • LRU 驱逐

键值服务器由固定大小的哈希表 + 单线程处理程序 + 粗粒度锁组成

哈希表

如何处理冲突?主要有三种解决方法:

  1. 分离链:发生冲突的桶链表中包含相同索引的多个条目,您可以始终将新发生冲突的键值对附加到列表中。
  2. 开放寻址:如果发生冲突,转到下一个索引,直到找到可用的桶。
  3. 动态调整大小:调整哈希表的大小并分配更多空间;因此,冲突发生的频率会降低。

客户端如何确定查询哪个服务器?

请参见 数据分区与路由

如何使用缓存?

请参见 键值缓存

如何进一步优化?

请参见 Facebook 如何扩展其社交图存储?TAO

Lyft 的营销自动化平台 Symphony

· 阅读需 4 分钟

获客效率问题:广告投放如何花更少的钱用更少的人得到更高回报?

具体来讲,Lyft 的广告投放要服务如下特点

  1. 管理基于地域的 campaign
  2. 数据驱动的增长:增长必须是规模化的、可测量的、可预测的
  3. 支撑起 Lyft 独特的增长模型,如图:

lyft growth model

主要的挑战是:难以规模化管理跨地域营销中的各个环节,广告竞标、预算、素材、激励、选择受众、测试等等。下图是营销者的一天:

营销者的一天

我们可以发现“执行”占去了大部分的时间,而更少的时间花在了更重要的“分析和决策”上。规模化意味着减少繁复的操作,让营销人员专注于分析与决策。

解决方案:自动化

为了降低成本,提高做实验的效率,需要

  1. 预测新用户是否对产品感兴趣
  2. 多渠道优化,有效评估和分配预算
  3. 方便地管理上千个 campaigns

数据由 Lyft 的 Amundsen 系统做增强学习。

自动化的部分包括:

  1. 更新 bid 的关键词
  2. 关掉效果不好的素材
  3. 根据市场改变 referrals values
  4. 找到高价值的用户 segment
  5. 在多个 campaign 中共享策略

构架

Lyft Symphony Architecture

技术栈:Apache Hive, Presto, ML platform, Airflow, 3rd-party APIs, UI.

具体的组成模块

LTV 预测模块

用户的终身价值是衡量渠道的重要标准,预算由 LTV 和我们愿意为该地区的获客付出的价格共同决定。

我们对新用户的认知有限,随着交互的增多,所提供的历史记录会更准确地预测。

一开始的特征值:

特征值

随着历史上的交互记录的积累,做出的判断就会越准确:

根据历史记录判断 LTV

预算分配模块

搞定了 LTV,接下来是根据价格定预算。拟合出 LTV = a * (spend)^b 形式的曲线以及周围的区间里类似参数的曲线。为了找到全局最优,需要付出一些随机性的代价。

预算计算

投放模块

分为两部分,一部分是调参者,一部分是执行者。调参者根据定价,设定基于渠道的具体的参数;执行者把这些参数执行到具体的渠道上。

有很多流行的投放策略,在各色的渠道中,是共通的:

投放策略

总结

要注意人的经验在系统中的重要性,否则会 garbage in, garbage out. 当人从繁琐的投放任务解放出来,专注于理解用户、理解渠道、理解自身要传达给受众的信息之后,就能够获得更好的投放效果——花更少的时间达到更高的 ROI。

为什么 Side Project 应该是傻傻的

· 阅读需 2 分钟

Spotify 的设计主管从15岁辍学开始做各种 side project,几十年的经验让他认为,成功的 side project 必须是“傻傻的”,这样探索的时候就不会有包袱而更大胆更有乐趣。所有的大事一开始都是小事,谷歌 50% 的新项目诞生于著名的 20% 的业余项目。规模化、融资、竞品分析各种繁杂的问题会拖累你的进度。做事情比学习重要,因为别人不会比你更聪明,别人的经历你很难感同身受。很多成功的创业不是计划出来的。项目会吸引志同道合的人。

Side project 还有一个心里上的好处就是“很爽”,你是你的老板,你决定做什么都可以,没有人能够阻止你 :)

如何编写稳健的代码?

· 阅读需 2 分钟

他喜欢它

  1. 同理心 / 视角转换是最重要的。

    1. 意识到代码首先是为人类阅读而编写的,然后才是为机器执行。
    2. 软件是如此“柔软”,有很多方法可以实现同一目标。关键在于做出适当的权衡,以满足需求。
    3. 发明与简化:Apple Pay RFID 与 微信扫码二维码。
  2. 选择可持续的架构,以减少每个功能的人力资源成本。

  1. 采用模式和最佳实践。

  2. 避免反模式

    • 缺少错误处理
    • 回调地狱 = 意大利面条代码 + 不可预测的错误处理
    • 过长的继承链
    • 循环依赖
    • 过于复杂的代码
      • 嵌套的三元操作
      • 注释掉未使用的代码
    • 缺少国际化,特别是 RTL 问题
    • 不要重复自己
      • 简单的复制粘贴
      • 不合理的注释
  3. 有效的重构

    • 语义版本
    • 永远不要对非主要版本引入破坏性更改
      • 两腿变更

产品的衡量指标

· 阅读需 3 分钟

指标让含糊的点子变成好点子

  • 大致估算即可
  • 专注于如何评估一个伟大的产品
  • 注意,不要担心总的市场大小
    • 单纯问“最终会很大吗?”就足够了

关于产品,我们该衡量什么?

  • 用户是否得到了价值?
    • 活跃用户
    • 利润
    • 交易量
    • 留存

留存很重要

下图显示的是每年的时间群组下在一段时间之后的留存率

如果群组留存率一直在跌没有下限的话,你的增长就好像田里的火环一样没法持续燃烧,因为

  • 老用户都会被烧光
  • 新用户会越来越少

你应该保持留存率处在某条线之上

相反,如果群组留存率随着时间增加了,那说明你的产品很牛逼。举个例子:

  1. Whatsapp
  2. Uber
  3. Facebook

Tom Tunguz: 留存高意味着高估值

增长

如果你要求很高,想要达到指数级的增长,那么,评估你每周的增长率。努力让这个每周的增长率平平的,你就会拥有指数级的增长。

迭代速度

  • 越小的公司迭代速度越有优势
  • 衡量指标是指导迭代方向的关键
  • 衡量迭代本身的速度

你应该多么重视衡量指标呢?

  1. 不够重视
    • 容易糊弄自己和鬼打墙
  2. 非常重视
    • 你的决策会是审慎的
  3. 过于重视
    • 你增加了数值,但没有增加价值

现实会是痛苦的

  • 衡量指标会打破幻觉,有时候会有点痛
  • 大多数的领导靠幻觉吸引下属
  • 你应该
    • 学习过去
    • 厘清现在
    • 笑对未来

为啥聪明人会有烂主意

· 阅读需 4 分钟

Paul Graham 和 Robert Morris 在 30 岁左右做的第一个 startup,把艺术展放到网上最后被证明是个烂主意,更何况 20 多岁的年轻人。

为啥聪明人会有烂的商业主意?

  1. 烂主意是直觉的产物。
    1. 人们往往看到什么就想到要干什么;而事实上,如果要干什么事情干几年的话,你最好事先掂量一下几个不同的想法。
    2. 而最悲剧的是接下来的宜家效应:尽管这是个烂主意,因为你在上面付出了心力,你会喜欢上这个主意。
    3. 怎么办?快速上手做是好事,但一定要认识到==花时间不一定会让情况变得更好。反复问自己:会有人愿意为它付钱吗?==
  2. 烂主意只图牛逼不图挣钱
    1. 要挣钱就别怕脏:越是脏活累活,越少人愿意干,供求关系就越紧张,你来做,你得到的议价权就越高。
    2. 因为挣钱很难,所以你的第一目标最好是要挣钱,否则你就挣不了钱。
  3. 烂主意屈服于对竞争的胆怯
    1. 竞争可能不像媒体描述的那么激烈,他们又不懂技术又不会写代码。
    2. 为什么我们会害怕?懂编程不懂商业?其实上无所谓“商业”这个词,这个词太大太抽象,以至于屏蔽了下面实实在在的问题:卖产品、搞促销、搞清楚客户想要什么、定价、客户支持、付账单等等。搞定了这些细节问题,就搞定了“商业”。
  4. 烂主意太浅薄
    1. 大多数的想法是博客、日历、约会网站、社交网络的杂交。而远处有更好的、未解的难题,需求旺盛,却没有人去解决。
    2. 为什么人们难以研究客户到底想要什么?现有的教育体制教导人们如何解决问题,却无法教人们如何问问题。

搞清楚用户想要什么,这件事情里面,最难的是,你要意识到你需要花时间精力去做这件事情。如果你不知道如何开始下手?答案在卡内基的那本经典的《如何贏取友谊与影响他人》里面 —— 答案是换位思考,也就是同理心。

好在用户调研这能力是可以习得的,“聪明的创客”与“用户调研”简直就是天作之合,可以爆发出无尽的力量。

千言万语一句话:创造人民群众喜(le)闻(yu)乐(tao)见(qian)的产品和服务。