1. 从一份需求规格说明书说起:共享单车小程序到底要解决什么问题
做过出行类产品的朋友大概都有体会,共享单车这门生意表面上看是“扫码—骑行—关锁—扣费”四步走,简单到不能再简单,但真正落到一份需求规格说明书上,你会发现它牵扯的东西远比想象中复杂。我前后参与过几个两轮出行相关的项目,从早期的校园单车到后来的城市级共享单车小程序,每次写需求文档都会重新梳理一遍业务闭环,因为这类产品的需求边界特别容易失控——运营想加红包车,市场想加裂变分享,财务想加信用免押,法务想加实名认证,最后需求池里堆了几百条,真正上线时又发现核心链路还没跑通。
这份《共享单车小程序需求规格说明书》要解决的,本质上是一个“轻前端+重后端+强运营”的出行服务系统的需求定义问题。它面向的读者包括产品经理、后端开发、小程序前端、测试工程师、运营人员以及后续接手的维护团队。一份好的需求规格说明书,不是把功能列一遍就完事,而是要让每个角色都能从中找到自己关心的部分:产品看到业务闭环,开发看到接口边界,测试看到验收标准,运营看到数据埋点。
我见过太多团队把需求文档写成“功能清单”,结果开发阶段天天扯皮,测试阶段反复返工。所以这篇文章我会从实际落地角度,把共享单车小程序的需求规格说明书拆成几个核心模块来讲:整体设计思路、核心业务细节、实操落地要点、常见问题排查。每个部分我都会补充实际项目中踩过的坑和总结出来的经验,尽量让不同基础的读者都能直接拿去参考。
2. 整体设计思路与需求分层拆解
2.1 为什么共享单车小程序的需求要分层写
共享单车小程序看起来是一个独立产品,实际上它是整个共享出行系统的一个“轻量入口”。后端有车辆管理、订单中心、支付网关、风控系统、运维调度等多个子系统,小程序只是把这些能力以用户可感知的方式呈现出来。如果需求文档不分层,把所有内容混在一起写,开发看到的就是一团乱麻。
我习惯把需求分成四层:用户交互层、业务逻辑层、数据服务层、运营支撑层。用户交互层描述小程序页面、交互流程、状态反馈;业务逻辑层描述扫码开锁、计费规则、关锁结算等核心流程;数据服务层描述车辆状态同步、订单数据存储、位置服务等;运营支撑层描述红包车配置、骑行卡管理、活动投放等。
这样分层的好处是,每个模块的负责人只需要关注自己那一层,接口边界清晰。比如前端开发重点看交互层和业务逻辑层的状态定义,后端开发重点看业务逻辑层和数据服务层,运营重点看运营支撑层的配置项。需求评审时也能按层拆分,避免几十个人挤在一起讨论一个页面按钮的颜色。
2.2 核心业务流程的闭环设计
共享单车小程序的核心流程其实就一条主线:找车—扫码—开锁—骑行—关锁—结算—支付。但这条主线背后有大量分支和异常情况需要定义清楚。
找车环节,用户打开小程序后看到的是地图上的车辆标记。这里的需求要点包括:地图加载策略、车辆聚合展示、定位权限处理、附近车辆排序规则。我见过有的项目地图上密密麻麻全是车,用户根本点不中,后来加了聚合算法才解决。还有定位漂移问题,用户在室内打开小程序,定位到几百米外,这时候需要引导用户手动选点。
扫码环节,用户扫描车身上的二维码。需求要定义清楚:扫码权限申请、二维码识别失败处理、车辆编号手动输入兜底、扫码后车辆状态校验。这里有个容易忽略的点——二维码被破坏或涂改的情况。实际运营中这种情况不少见,需求里必须写明手动输入车辆编号的入口和校验逻辑。
开锁环节是整个流程中最关键的一步。需求要定义:开锁指令下发、开锁超时处理、开锁失败原因分类、开锁成功后的计费起点。我踩过的坑是开锁超时没有明确处理,用户点了开锁等了三十秒没反应,以为失败了就走了,结果后台其实开锁成功了,订单一直在计费。后来我们在需求里明确写了“开锁指令下发后15秒内未收到成功响应,自动触发关锁并释放订单”。
骑行和关锁环节,需求要定义:骑行中状态保持、关锁操作触发、关锁成功判定、异常关锁处理。这里有个细节是关锁时的位置校验,如果用户没停在指定区域,需要提示并引导。还有关锁后如果车辆状态上报失败,订单不能一直挂着,要有超时自动结算机制。
结算和支付环节,需求要定义:计费规则、优惠券抵扣、支付方式、支付失败处理、订单申诉入口。计费规则是重灾区,不同城市、不同车型、不同时段的价格可能都不一样,需求里必须把计费模型抽象清楚,不能写死。
2.3 需求优先级与版本规划
一份需求规格说明书如果所有需求都是“必须做”,那等于没有优先级。我在实际项目中会把需求分成P0、P1、P2三档。P0是核心链路,没有它产品跑不起来,比如扫码开锁、计费结算、支付。P1是体验优化和运营必需,比如骑行卡、优惠券、车辆预约。P2是增值功能和远期规划,比如社交分享、碳积分、骑行路线推荐。
版本规划上,我建议第一版只做P0,把核心链路跑通,验证商业模式。第二版加P1,提升用户留存和运营效率。第三版再考虑P2的增值功能。很多团队第一版就想把所有功能做完,结果工期拖了半年,上线时市场窗口已经过了。
3. 核心功能模块的细节拆解与实操要点
3.1 用户端小程序的功能需求
用户端小程序是需求规格说明书里篇幅最大的部分,因为它直接面向用户,交互细节最多。我把它拆成几个子模块来写。
首页与地图模块。需求要定义:地图初始化时的默认中心点、定位权限申请时机、车辆图标的展示规则、车辆聚合策略、地图缩放级别限制。这里有个实操经验:定位权限不要在用户一进小程序就申请,先展示一个默认城市的地图,等用户点击“定位”按钮时再申请,这样用户拒绝率会低很多。车辆图标建议用不同颜色区分可用、预约中、故障车,但颜色不要超过三种,否则用户认知负担太重。
扫码开锁模块。需求要定义:扫码入口的显眼程度、扫码权限申请、扫码失败后的手动输入入口、开锁进度反馈、开锁失败提示。我建议扫码入口放在首页最显眼的位置,最好是一个大按钮,因为用户打开小程序的目的就是扫码。开锁进度反馈要有明确的文案和动画,比如“正在开锁,请稍候”,超过10秒要变成“网络较慢,正在重试”,超过20秒要提示“开锁失败,请重试或更换车辆”。
骑行中模块。需求要定义:骑行时长和费用的实时展示、临时锁车功能、骑行路线记录、紧急求助入口。临时锁车是个容易被忽略但很实用的功能,用户中途去便利店买东西,不想结束订单,可以临时锁车。需求里要写明临时锁车的计费规则——通常是继续计费,但有些城市规定临时锁车期间不计费,这个要按当地运营策略配置。
关锁结算模块。需求要定义:关锁操作方式、关锁成功反馈、费用明细展示、优惠券选择、支付方式、支付结果反馈。关锁方式有手动关锁和自动关锁两种,手动关锁是用户手动拨动锁扣,自动关锁是车辆检测到静止后自动锁车。需求里要明确当前支持哪种方式,以及关锁失败的兜底方案。
个人中心模块。需求要定义:用户信息展示、骑行记录、钱包充值、骑行卡管理、优惠券管理、客服入口、设置项。这里有个细节是实名认证,根据监管要求,共享单车用户需要实名认证后才能使用。需求里要写明实名认证的触发时机——是注册时就认证,还是首次骑行前认证。我建议首次骑行前认证,这样注册转化率更高。
3.2 后端服务与数据模型需求
后端服务是共享单车小程序的大脑,需求规格说明书里要定义清楚各个服务的职责和数据模型。
车辆服务。负责车辆状态管理、位置上报、开锁指令下发、关锁状态接收。数据模型上,车辆表要包含车辆编号、二维码编号、当前状态、当前位置、所属区域、车型、投放时间、最后心跳时间等字段。这里有个关键点是车辆状态同步的实时性,需求里要定义心跳上报频率和状态同步延迟容忍度。我一般建议心跳间隔30秒,状态同步延迟不超过5秒。
订单服务。负责订单创建、计费、结算、支付回调处理。订单表要包含订单号、用户ID、车辆编号、开锁时间、关锁时间、骑行时长、骑行距离、订单金额、优惠金额、实付金额、支付状态、订单状态等字段。计费模型要抽象成可配置的规则,而不是写死在代码里。我见过有的项目计费规则写死了,后来调整价格要改代码重新发版,非常被动。
用户服务。负责用户注册、登录、实名认证、信用分管理、骑行卡管理。用户表要包含用户ID、手机号、实名信息、信用分、注册时间、最后登录时间等字段。信用分是个很重要的设计,用户违规停车、忘记关锁、损坏车辆都会扣信用分,信用分低于阈值时限制使用或提高押金。
支付服务。负责支付下单、支付回调、退款处理、对账。支付服务要对接第三方支付渠道,需求里要定义清楚支付超时时间、支付失败重试策略、退款触发条件。这里有个坑是支付回调的幂等处理,同一个订单可能收到多次回调,需求里必须写明幂等逻辑。
运营服务。负责红包车配置、骑行卡管理、优惠券发放、活动配置。运营服务的数据模型要足够灵活,支持按区域、按时段、按用户标签配置不同的运营策略。
3.3 运营后台的功能需求
运营后台是给内部人员用的,需求规格说明书里不能忽略。运营后台通常包括车辆管理、订单管理、用户管理、财务管理、活动管理、数据看板等模块。
车辆管理。要支持车辆列表查询、车辆详情查看、车辆状态修改、车辆调度、故障车标记。这里有个实操经验:车辆调度功能要支持批量操作,因为运维人员一次要调度几十辆车,如果只能一辆一辆操作,效率太低。
订单管理。要支持订单查询、订单详情、异常订单处理、订单申诉审核。异常订单包括开锁失败但计费的、关锁失败一直计费的、支付成功但订单状态不对的。需求里要定义每种异常订单的处理流程和补偿方案。
数据看板。要展示核心运营指标,比如日活用户、日均订单量、车辆周转率、平均骑行时长、故障率、投诉率。数据看板的指标定义要清晰,避免不同部门对同一个指标的理解不一致。比如“车辆周转率”是按自然日算还是按24小时算,需求里要写清楚。
4. 实操落地:从需求到上线的关键环节
4.1 需求评审与跨部门对齐
需求规格说明书写完只是第一步,关键是需求评审。我组织过几十场需求评审会,总结下来有几个要点。
第一,评审前把文档发给所有参会人,要求提前阅读并标注疑问。评审会不是朗读会,是讨论会。第二,评审时按模块拆分,不要一次评审所有内容。用户端、后端、运营后台分开评审,每次控制在两小时内。第三,评审结论要当场确认,有争议的点记录下来,会后单独讨论,不要在会上僵持。
跨部门对齐是另一个难点。产品、开发、测试、运营、法务、财务,每个部门的关注点不同。产品关注用户体验,开发关注实现成本,测试关注验收标准,运营关注配置灵活性,法务关注合规性,财务关注对账准确性。需求文档要尽量覆盖这些视角,评审时也要让每个部门都有发言机会。
4.2 接口定义与联调准备
需求规格说明书里要包含接口定义,至少是核心接口的入参、出参、错误码。我习惯用表格来定义接口,清晰直观。
| 接口名称 | 请求方式 | 入参 | 出参 | 错误码 |
|---|---|---|---|---|
| 扫码开锁 | POST | 车辆编号、用户ID、位置信息 | 订单号、开锁指令ID | 1001车辆不存在、1002车辆故障、1003用户信用不足 |
| 关锁结算 | POST | 订单号、关锁位置 | 骑行时长、订单金额、优惠金额 | 2001订单不存在、2002关锁失败、2003计费异常 |
| 订单支付 | POST | 订单号、支付方式、优惠券ID | 支付流水号、支付状态 | 3001支付失败、3002优惠券不可用 |
接口定义清楚后,前后端就可以并行开发。前端用Mock数据先跑通页面逻辑,后端按接口定义实现服务。联调时按接口逐个验证,避免一次性联调所有接口导致问题难以定位。
4.3 测试用例设计与验收标准
需求规格说明书里的每个功能点都要有对应的验收标准,测试团队据此设计测试用例。我一般要求测试用例覆盖正常流程、异常流程、边界条件三类。
正常流程比如:用户扫码开锁成功、骑行10分钟、关锁结算、支付成功。异常流程比如:扫码时车辆已被预约、开锁时网络超时、关锁时位置不在运营区、支付时余额不足。边界条件比如:骑行时长刚好1分钟、骑行距离刚好超过免费时长、优惠券刚好过期。
验收标准要量化,不能写“开锁速度要快”,要写“开锁指令下发后3秒内返回结果,超过5秒视为超时”。量化标准让开发和测试都有明确目标,避免扯皮。
4.4 上线部署与灰度策略
需求规格说明书里最好也包含上线部署方案,虽然这不是传统意义上的需求,但对项目落地很重要。共享单车小程序的上线通常分几步:内部测试、小范围灰度、全量发布。
灰度策略要定义清楚:灰度城市、灰度用户比例、灰度时长、回滚条件。我建议第一版上线时选一个城市灰度,用户比例从5%开始,观察一周没有严重问题再逐步扩大。回滚条件要明确,比如“核心链路成功率低于95%立即回滚”。
5. 常见问题与排查技巧实录
5.1 开锁失败问题排查
开锁失败是共享单车小程序最高频的问题之一。根据我的经验,开锁失败的原因主要有几类:车辆离线、锁控故障、网络超时、用户信用不足、车辆已被预约。
排查思路是这样的:先看车辆最后心跳时间,如果超过5分钟,大概率是车辆离线;再看锁控日志,如果有指令下发但无响应,可能是锁控故障;如果指令下发就超时,可能是网络问题;如果返回信用不足,查用户信用分;如果返回已被预约,查预约记录。
需求文档里要定义每种失败原因的提示文案和处理建议。比如车辆离线提示“车辆暂时不可用,请更换车辆”,锁控故障提示“车辆故障,已为您上报”,网络超时提示“网络较慢,请重试”。
5.2 计费异常问题排查
计费异常也是常见问题,用户投诉“我只骑了5分钟为什么扣了10块钱”。排查计费异常要看几个时间点:开锁时间、关锁时间、订单创建时间、支付时间。
常见原因有:开锁成功但用户没骑,订单一直计费;关锁成功但状态上报失败,订单没结束;计费规则配置错误,比如免费时长配置成了0分钟;优惠券未生效,导致原价扣费。
需求文档里要定义计费异常的补偿流程。我一般建议:用户申诉后,客服核实骑行轨迹和关锁记录,如果确实是系统问题,按实际骑行时长重新计费,多扣部分原路退回。
5.3 支付回调丢失问题排查
支付回调丢失是支付环节的经典问题。用户支付成功了,但订单状态还是“待支付”,导致用户重复支付或无法关锁。
排查思路:先查支付渠道的回调日志,看是否收到回调;如果收到回调但订单状态没更新,查回调处理逻辑是否有异常;如果没收到回调,查支付渠道的异步通知配置。
需求文档里要定义支付回调的补偿机制:定时任务轮询支付渠道的订单状态,发现支付成功但本地订单未更新的,主动更新订单状态。轮询间隔建议30秒,补偿时效建议24小时。
5.4 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| 扫码无反应 | 扫码权限未授权、二维码损坏 | 检查权限设置、手动输入车辆编号 | 引导用户授权、提供手动输入入口 |
| 开锁超时 | 车辆离线、网络问题 | 查车辆心跳、查网络日志 | 提示更换车辆、自动释放订单 |
| 关锁失败 | 位置不在运营区、锁控故障 | 查关锁位置、查锁控状态 | 引导移至运营区、上报故障 |
| 计费异常 | 计费规则错误、关锁状态未上报 | 查计费配置、查订单时间线 | 重新计费、退还多扣金额 |
| 支付失败 | 余额不足、支付渠道异常 | 查支付渠道状态、查用户余额 | 引导更换支付方式、稍后重试 |
| 订单状态不同步 | 回调丢失、消息队列积压 | 查回调日志、查消息队列 | 定时补偿、手动同步 |
5.5 实操避坑经验
最后分享几个我在实际项目中踩过的坑。
第一个坑是车辆状态缓存不一致。小程序地图上显示车辆可用,用户扫码后提示车辆已被预约。原因是地图数据有缓存,车辆状态更新后缓存没及时失效。解决方案是地图数据缓存时间不超过10秒,车辆状态变更时主动推送更新。
第二个坑是计费规则硬编码。早期项目把计费规则写死在代码里,后来调整价格要改代码发版,非常被动。后来我们把计费规则抽象成配置项,支持按城市、按时段、按车型配置不同价格,运营在后台就能改。
第三个坑是关锁位置校验太严格。早期要求用户必须停在指定停车点才能关锁,结果用户投诉很多,因为停车点定位不准。后来改成“推荐停车点+允许在运营区内关锁”,体验好很多。
第四个坑是客服入口太深。用户遇到问题找不到客服,投诉率很高。后来我们把客服入口放在订单详情页和首页显眼位置,投诉率明显下降。
共享单车小程序的需求规格说明书不是一次写完就完事的,它需要随着业务发展不断迭代。我建议每季度回顾一次需求文档,把已经上线的功能标记为“已实现”,把新的需求补充进去,保持文档的时效性。另外,需求文档最好和接口文档、测试用例、运营手册关联起来,形成一个完整的知识库,这样新加入的团队成员也能快速上手。