产品设计

Descript:收齐录制,再像改文章一样剪片

Descript 是以文字编辑音频和视频的创作工具。播客与团队内容制作者可以收集素材、调整讲述顺序,再把完成的作品交给别人观看。

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

01
代码思考进阶

让公开导出版本只向前移动

实现一个教学用的导出状态模块,语言不限,不连接真实视频服务。快照指提交导出时固定下来的一份稿件,之后编辑不会改变它。

  1. 输入和输出。 输入是 Edit、StartExport、ExportSucceeded、ExportFailed 事件;导出事件有唯一 jobId,成功回调包含该任务固定的版本和产物 URL。输出当前稿版本、各任务状态、公开版本和公开 URL。版本为递增正整数。
  2. 发布规则。 允许多个导出任务并行。成功只能发布自己冻结的版本;旧版本成功晚到时不能把公开版本倒退。失败不改变公开指针。同一 jobId 的重复回调应幂等,即重复接收不会再次改变结果;相互矛盾的终态回调应报告冲突,不覆盖已有终态。
  3. 小例子。 稿件 v=7 时启动 J1,编辑到 v=8 后启动 J2;J2 先成功,J1 后成功。写出每步公开版本。再考虑 J2 失败而 J1 成功:旧任务不是仅因启动较早就必须丢弃。
  4. 范围。 产物视为不可变,不实现存储上传、页面评论或权限服务;公开指针只向前移动。开始任务时要验证 jobId 未被别的快照使用,回调中的版本必须与任务记录一致。
  5. 交付。 给出数据模型、状态转移与错误类型,手工推演两条示例,以及重复成功、先失败后成功、伪造版本、无已发布版本四类边界。写明预期公开版本和原因。
查看思路
  1. 分开记录工作稿、任务快照和公开指针,先回答一次 Edit 会改变哪一个对象。
  2. 用 J2 先成功的轨迹找出公开版本不倒退的不变量,再用 J2 失败的轨迹检验“只认最新启动任务”是否误丢可用结果。
  3. 先验证任务身份和版本,再讨论成功是否推进公开指针;未知任务与版本不符都不能发布。
  4. 为每个任务确定一次终态,区分同一结果重放和互相矛盾的回调。失败不会改公开指针,但应保留可诊断记录。
  5. 用事件序列验证无初始发布、乱序、重复和失败,不把本题规则推断成真实产品的后台实现。