产品设计

Strava:在同一段路上,看清自己快在哪里

Strava 帮助跑步和骑行者记录活动、查看运动表现。路段比较把注意力放到同一段路线,让人回顾自己的多次成绩,并选择明确的比较基准。

先尝试拆解问题、设计和实现,再展开思路,检查状态、边界与取舍,并设计验证用例。思路提供分析路径,不给出完整实现。

01
代码思考

把成绩比较的单位和边界放在一个模块里

假设你负责运动应用的成绩比较卡片。记录可能使用秒或毫秒,卡片需要一个统一接口判断两次成绩能否比较,再说明当前成绩相对基准快了还是慢了。

  1. 输入: 实现 compareEfforts(current, baseline),current 是当前成绩,baseline 是基准成绩。每份数据含 segmentId(路段编号)、sport(运动类型:run 为跑步,ride 为骑行)、duration(用时)与 unit(s 为秒,ms 为毫秒)。duration 保证是大于零的有限数字,其他字段也符合上述类型。
  2. 规则: 仅同路段且同运动类型可比较;否则返回 {ok:false,reason:"not-comparable"},表示比较不成立。可比较时统一为毫秒,返回 {ok:true,deltaMs,relation}。deltaMs 是当前用时减基准用时;负数的 relation 为 faster(更快),零为 same(相同),正数为 slower(更慢)。不修改输入。
  3. 验收: 同路段同运动时,当前 60s、基准 62000ms 得到 −2000 和 faster;当前 60000ms、基准 60s 得到 0 和 same;当前 63s、基准 62s 得到 1000 和 slower。换成另一段路或将 run 换为 ride 时,均返回 not-comparable。
  4. 交付: 提交这个小模块、返回结果的说明及本地示例验证。检查调用后输入未变;不查询排行榜或绘制图表。
查看思路
  1. 先决定哪些输入具有可比较性,把“没有意义的比较”与“确实相同的成绩”区分为不同返回结果。

  2. 在模块边界统一时间单位,再解释差值符号;不要让每个调用页面自行猜测单位。

  3. 用混合单位、同值和不同对象的例子检查接口,确认输入在调用后保持原值。