Skip to main content

Phase 4.1 建立业务对话能力

目标:不只是"执行技术需求的工程师",而是能在需求阶段就识别风险、提出方案、推动决策的技术伙伴。


一、为什么业务对话能力是稀缺的​

大多数工程师接到需求的反应是:

"好,我来实现。"

少数工程师会问:

"等等,这个需求背后要解决的问题是什么?"

在金融系统中,后者的价值远高于前者。原因:

  1. 金融需求复杂且细节多:业务方不一定能把所有边界情况都想清楚
  2. 错误的代价高:金融 bug 是真实资金损失,发现越早成本越低
  3. 技术方案影响业务结果:选择同步还是异步,直接决定资金到账时间

二、需求评审中的有效提问​

提问的三个层次​

第一层(差):确认实现细节

"这个字段是 int 还是 long?"

第二层(好):理解业务规则

"如果账户余额刚好等于委托金额,允许下单吗?还是必须 > 委托金额?"

第三层(优):识别业务意图和边界

"这个限额是按账户算还是按实际控制人算?如果一个人控制多个账户,是分别计算还是合并计算?"

金融需求评审必问清单​

在接到任何金融系统需求时,逐一确认:

关于数据精度

  • 价格和金额字段用几位小数?四舍五入规则是什么?(HALF_UP 还是 HALF_EVEN?)
  • 是否有最小变动单位(tick size)?不符合 tick 的报价怎么处理:拒绝还是向下取整?

关于并发和时序

  • 同一账户的多笔订单可以并发处理吗?还是必须串行?
  • 如果成交回报乱序到达(Part 2 先于 Part 1 到达),怎么处理?
  • 如果消息队列重复投递(at-least-once),系统如何保证幂等?

关于边界条件

  • 零数量/零金额的操作是否合法?
  • 节假日怎么处理?(结算日跨越节假日如何计算?)
  • 跨时区场景:下单时区和结算时区不一致时,"今日"指哪个时区?
  • 账户被冻结期间收到成交回报,怎么处理?

关于失败场景

  • 风控检查超时(而非拒绝),订单应该通过还是拒绝?
  • 向交易所发送订单失败,是立即告知客户还是重试?重试几次?
  • 成交回报收到了但持仓更新失败,怎么保证一致性?

关于监管合规

  • 这笔操作需要审计日志吗?
  • 是否需要向监管机构上报?报告时限是什么?
  • 数据留存多少年?

三、用业务语言描述技术方案​

工程师常犯的错误:用技术语言解释技术决策,业务方听不懂,也不知道怎么决策。

错误示范​

"我们用 Kafka 做异步解耦,通过 Event Sourcing 保证审计链完整性, 同时用 Redis 缓存热路径数据降低 p99 延迟。"

业务方内心:??

正确示范​

"成交后持仓更新我们做了两层: 一层是毫秒级的内存更新,让风控实时看到最新持仓; 另一层是写入数据库,保证即使服务器重启,数据也不会丢失。 这样做既快又安全,代价是极端情况下两层可能有短暂的 1 秒以内的不一致, 你们的业务可以接受吗?"

转换技巧:

  1. 从业务影响出发,而非技术实现
  2. 量化"快多少"/"安全到什么程度"
  3. 明确说出权衡和代价,让业务方参与决策

四、识别需求中的业务逻辑漏洞​

金融系统的需求文档常常存在遗漏,工程师需要主动发现。

案例 1:分红再投资​

需求:账户收到股票分红后,自动买入同一只股票。

工程师应该追问:

  • 分红的资金到账时间是几点?是否在交易时间内?
  • 如果分红到账时,该股票已经涨停无法买入,怎么办?等次日?还是取消自动买入?
  • 分红金额不足一手(A 股 100 股)时,余额如何处理?
  • 如果当日已经有其他订单冻结了部分资金,分红金额够用吗?
  • 跨市场:港股分红是港币,自动买入用港币还是换汇?

案例 2:日亏损限额​

需求:账户日亏损超过 100 万元时,禁止当日继续下单。

工程师应该追问:

  • "亏损"指已实现盈亏,还是包含浮动亏损?
    • 浮动亏损随行情变化,下午 2 点触发了限额,2 点 30 行情回升,是否解禁?
  • 判断亏损的基准是"今日开仓成本"还是"昨收市值"?
  • 已经在途的订单(OPEN 状态)如何处理?立即撤单?还是让其自然成交?
  • 100 万是所有账户合并算,还是每个子账户单独算?

案例 3:T+1 限制下的卖出​

需求:A 股买入当天不能卖出(T+1 限制)。

工程师应该追问:

  • 今天买入 100 股,昨天已持有 50 股,今天可以卖出多少?
    • 只能卖昨天的 50 股?还是 150 股全部?
  • ETF 申购得到的份额,当天能卖吗?(实际上可以,规则不同)
  • 通过大宗交易买入的股票,T+1 规则适用吗?
  • 如果持仓快照在盘前不准确,导致误判,怎么补救?

五、主动参与业务决策​

从"被动接需求"到"主动参与决策"需要做以下事情:

1. 理解业务目标,不只是功能清单​

每个需求背后都有业务目标,理解目标比理解功能更重要:

功能需求:新增"持仓预警"功能,当持仓亏损超过 10% 时发送提醒

业务目标:降低客户大额亏损的流失率

基于业务目标,工程师可以补充:
✓ 预警阈值是否应该可配置(不同客户风险偏好不同)?
✓ 预警后如果客户没有操作,是否需要升级提醒(电话/短信/APP 推送)?
✓ 浮亏 vs 实现亏损:日内高频波动会导致反复预警,是否需要冷却时间?

2. 评估需求的 ROI​

有时候工程师比业务方更清楚某个功能的实现成本,要敢于提出来:

业务方:能不能做一个"智能止损",根据波动率自动调整止损价格?

工程师评估:
技术复杂度:需要实时计算各种证券的历史波动率,维护动态止损单,
处理订单状态的复杂状态机,约 2-3 个月工作量

主动提出替代方案:
"我们先做一个简单的固定比例止损(如 -10% 触发),2 周可以上线。
收集用户使用数据后,再决定是否需要复杂的动态止损。
这样可以更快验证用户需求,避免做了没人用。"

3. 提前识别合规风险​

这是最体现"懂金融"的能力:

案例:业务方提出允许用户授权他人代为操作账户

工程师应该识别:
× 这可能涉及"代客理财"资质(需要基金管理牌照)
× 被授权人是否需要经过 KYC?
× 操作日志如何归属?合规报告中是用授权人还是账户主人?

主动建议:
"这个功能建议在上线前确认法务意见,
因为代为操作他人账户在某些情况下可能触及监管红线,
历史上有平台因为这个被处罚过。"

六、技术评审中的主动贡献​

不只是在自己负责的模块发声,还要对整体方案提出建设性意见。

数据流图的必要性​

每次技术评审前,先画出数据流图:

用户下单 → API 网关 → 风控服务 → OMS → FIX 网关 → 交易所
↓ ↓ ↓
审计日志 持仓缓存 订单 DB

在图上标出:

  • 哪些地方可能出现延迟瓶颈?
  • 哪些地方如果失败会导致数据不一致?
  • 哪些地方需要特别的幂等保护?

识别单点故障​

方案中有单点 → 主动提出:
"这个 FIX 网关如果宕机,是所有交易都中断吗?我们是否需要主备切换?
考虑到交易时间是确定的(9:30-15:00),宕机恢复的 RTO 要求是多少?"

提出可观测性需求​

业务方通常不会主动要求监控,但工程师应该主动加上:

"这个功能上线后,我建议加上以下监控:
1. 风控检查的平均延迟和 P99 延迟(告警阈值:P99 > 100ms)
2. 订单拒绝率(分原因统计)
3. 成交回报处理延迟

这样出现问题时我们能快速定位,也方便评估上线效果。"

七、实战练习:需求评审模拟​

练习 1:接到如下需求,写出你的追问清单。

需求:实现"条件单"功能。用户可以设置:当某只股票价格突破某个价格时,自动下一笔买单。

参考追问方向(自己先想,再对照):

参考答案
  1. 价格判断:是成交价突破,还是最新报价(Bid/Ask)突破?两者差别可以达到几个 tick
  2. 延迟要求:触发条件满足到下单的延迟要求是多少?(价格转瞬即逝)
  3. 触发后的订单类型:是市价单(保证成交)还是限价单(可能又没成交)?
  4. 条件单是否支持撤销?在触发过程中用户撤销怎么处理?
  5. 同一账户多个条件单同时触发,资金不够怎么办?先触发的先执行?
  6. 系统重启后条件单是否还有效?(需要持久化存储)
  7. 盘前/盘后时间触发条件,在开盘时才下单?还是忽略?
  8. 是否支持重复触发?(比如价格每次突破都触发,还是只触发一次)

练习 2:用业务语言描述以下技术决策。

技术决策:成交后持仓更新使用乐观锁(版本号),并发冲突时重试最多 3 次,超过后进入死信队列人工处理。

要求:用 3 句话向业务方解释这个方案的含义和影响。


本节小结​

业务对话能力不是一夜之间能建立的,它来自:

  1. 积累提问习惯:每次接需求,先问"为什么"和"如果...怎么办"
  2. 主动理解业务流程:不只读技术文档,也读业务流程手册和合规手册
  3. 翻译能力:在技术语言和业务语言之间自如切换
  4. 勇于发声:发现潜在问题时不要沉默,哪怕可能是自己想错了

核心原则:你对业务的理解越深,你提出的技术方案就越准确,你的价值就越不可替代。

下一节:Phase 4.2 交易系统深度方向