有一位做 SAP 实施的朋友跟我说过一句话:顾问分两种,一种是写 FS 的,一种是看不懂 FS 的。话虽然有点绝对,但做项目的人心里都清楚,功能说明书(Functional Specification,FS)就是业务顾问和开发顾问之间的"翻译合同",也是项目验收时扯皮概率最高的那张纸。我从做后勤模块的项目助理开始,一路摸到 SD、MM 甚至 PP 的边界,经手过的 FS 少说也有几十份,自己写废的、被开发打回来的、被客户指着鼻子说"这不是我要的"的,全都经历过。今天把写 FS 这件事从头到尾拆开聊,不是讲什么高深理论,就是告诉你一份真正"无懈可击"的功能说明书是怎么搭出来的,以及为什么你写的东西总被人看不懂、做不出来、反复返工。
这个内容适合谁看?刚入行正在被"FS 怎么写"折磨的初中级业务顾问,偶尔要提开发需求的模块顾问,还有那些被迫去审别人 FS 的项目经理或开发组长。你要知道一个残酷的事实:开发顾问一天看七八个 FS,他根本没空替你揣摩需求,你写不清楚,他就按自己理解做,最后交付的东西不对,背锅的还是你。所以这不仅仅是文笔问题,是你的职业护身符。
1. 先想明白:FS 到底在解决谁的什么问题
很多新人拿到一个需求就开始敲键盘,标题一写、目的二写、逻辑三写,写完发出去,过两天被退回来,还委屈得不行。你问他这份 FS 是给谁看的,他答不上来。这是最大的问题:你根本不知道这份文档要服务谁。
1.1 FS 不是写给你自己的,是写给三类人看的
第一类是开发顾问,他要按你的描述写 ABAP 代码、配增强、建表、写接口。他关心的不是业务有多复杂,而是"你告诉我字段从哪来、逻辑判到哪一层、异常情况怎么处理"。你没写清楚,他就自由发挥,自由发挥的结果通常都不是你想要的结果。
第二类是客户方业务用户和关键用户,他们要在测试阶段拿这份 FS 当剧本去验证系统对不对。问题是他们绝大多数看不懂技术描述。你写"在 VBAK 表按 VBELN 关联检查",客户看到的是天书,但开发觉得你说得挺清楚。这就埋下矛盾:客户验收的时候说"这不是我要的",开发说"我按 FS 做的",FS 成了罗生门。
第三类是后续维护团队的顾问。项目上线半年后出个新需求,或者某个增强出 bug,接手的人会翻出 FS 看当初怎么设计的。你这张纸写得好,他半小时能看懂逻辑;写不好,他恨不得顺着网线爬过来问你。
1.2 一份好 FS 的隐藏功能:保护你自己
干过项目的都懂,业务顾问最怕的就是验收现场客户翻旧账。今天说"我当时说的不是这个意思",明天说"你那个逻辑有问题导致我们库存错了"。如果 FS 写得不清楚或者有歧义,你就是大家的靶子。
一份把字段来源、判断逻辑、异常处理、权限边界都写得明明白白的 FS,实际上就是你的挡箭牌。客户签字确认之后,不管是开发做错还是测试没覆盖,你都能拿着文档把责任掰扯清楚。这不是推卸责任,是项目管理里最基本的可追溯性。你连可追溯都做不到,就别怪别人把锅甩给你。
2. 动笔之前必须做好的三件准备工作
不夸张地说,好的 FS 有一半的功夫在动笔前。准备工作做足了,写起来就是填空;准备不充分,你写出来的 FS 一定是虚的,开发随便一问就能把你问倒。
2.1 第一件:把"用户说想要的样子"翻译成"系统能做出来的样子"
业务用户告诉你的是需求意图,"我希望订单保存的时候自动给销售发一封邮件提醒他抓紧审批"。这能直接写进 FS 吗?能,但不能这么写完就完事。你得想清楚几件事:邮件发到哪个邮箱?如果用户主数据里没有维护邮箱怎么办?一个订单下多行项目,是发一封邮件还是每行一封?订单重复保存会不会触发重复邮件?
你不把这些边界想清楚,开发做完你会发现四个场景里三个是错的。怎么想清楚?去配一个真实场景,把用户的具体动作拆成一步步的操作流程,然后对着流程问:每一步系统做什么,判断条件是什么,取数从哪来,结果展示到哪里。把这一串搞明白了,需求才算是从空中落到地上。
2.2 第二件:把"现状逻辑"摸透,尤其是涉及增强和自定义字段的时候
最怕的就是业务顾问在 FS 里写"在标准函数里加一个自定义校验",但自己连那个标准函数在什么流程节点被调用、有没有 BAPI 替代方案、常不常被其他增强踩到都不知道。这种 FS 交给开发,开发还得先花半天去翻源代码,翻完发现你写的位置根本不对,又回来找你扯。
我的经验是动笔之前先花时间跟开发顾问对齐一下技术可行性。遇到标准功能不满足的场景,优先问一句:有没有标准配置项可以解决,而不是上来就写增强?你连标准功能都没吃透就上增强,等于买了一堆冗余代码,后面升级运维全是坑。这件事我见识过太多反面案例,某模块顾问动不动就让人写自定义表,结果标准里有个类似功能只是没人知道。
2.3 第三件:列一个"字段清单"和"异常清单"草稿
别小看这个动作。提前把涉及的所有数据字段列出来——销售订单号、客户编码、物料编码、数量、金额、日期、状态、创建人等等——按"来源系统/模块、取值逻辑、是否必填、显示格式"列一张表,你会发现很多需求其实还没定义清楚。光一个"日期",是订单创建日期还是确认日期还是计划发货日期?你不列这张表就发现不了自己有多含糊。
异常清单则是把所有你能想到的不正常情况写下来:主数据缺失、重复提交、数量为零、权限不足、跨月操作、多人并发。你写 FS 的时候盯着异常清单逐个确认,内容自然就厚实了,开发想挑毛病都挑不出来。
3. FS 正文的七个核心板块:内容与写作顺序
我见过很多模板把 FS 写成十几个章节,看起来很专业,实际写起来又臭又长,开发看起来也费劲。我自己用下来的经验是,一份业务顾问写给开发看的 FS,有七个板块基本就够了。关键是这些板块的顺序千万别乱,因为乱了你和开发都容易看晕。
3.1 需求概述与术语约定
这个板块很简单,但很少人认真写。概述不是让你写作文,两三百字把这个需求解决什么问题、影响哪些模块讲清楚就行。还有一个很多人忽略的点:术语约定。
SAP 项目里到处都是缩写和行业黑话,每个公司叫法还不一样。同一件事有人叫"交货单",有人叫"DN",有人叫"外向交货",你不在 FS 开头统一口径,开发就容易理解偏。我写过的 FS 里都有个小表格,列上术语、缩写、统一解释,别嫌啰嗦,这能省掉后面大把的沟通成本。
3.2 业务现状与系统现状描述
很多顾问觉得这个板块可有可无,实际上它特别重要。开发顾问不一定懂你的业务链路,你直接告诉他"现在系统里销售订单审批通过了就直接创建交货单",他可能不知道前面还有信用检查、可用量检查这些环节。业务现状写清楚,他才知道你的需求处在整条链路的哪一环。
系统现状则要写清楚"当前使用的标准功能是什么、是否已有相关增强、增强在哪个用户出口或 BAdI 里、有没有过往的关联需求记录"。这些信息能帮开发快速定位改动范围,避免重复造轮子或者撞车。
3.3 详细功能设计(核心中的核心)
这是 FS 的命根子。你要在这里把"系统到底要做什么"讲得滴水不漏。我的习惯是把这一部分拆成三个层面来写:
- 输入条件:用户在哪里触发这个功能?事务代码是什么?或者是在某个 SAP 标准屏幕上点按钮?没有这个功能,用户就没法操作,所以先写清楚入口。
- 处理逻辑:系统拿到输入之后一步一步干什么。这一步一定要用编号列表写清楚,1、2、3、4,每一步的判定条件要明确。尤其是有分支判断的地方,用"如果……那么……否则……"的句式,别怕啰嗦。分支逻辑是最容易被开发做错的地方,你写含糊了就是给自己埋雷。
- 输出结果:功能处理完之后,屏幕上显示什么、数据库表里写入什么、有没有输出单据或消息提示。很多人只写"保存成功",完全不写保存到哪张表、哪些字段有值哪些为空,测试的时候开发自己对着表发愣,出了问题谁也不认。
3.4 字段级说明与数据处理规则
功能设计讲的是"流程",字段说明讲的是"数据"。我强烈建议在 FS 里放一张字段明细表,每一行描述一个关键字段,列清楚字段名、界面标签、存储表/字段、数据类型长度、是否必填、默认值、来源逻辑、转换规则。这张表写好了,开发几乎可以照着直接写代码,都不用反复找你确认。
数据处理规则更多是用来描述"字段的值是怎么来的"。比如"该日期默认取当前系统日期,但若用户已维护计划交货日期,则取计划交货日期;两者都不满足时报错"。这种描述越细越好,别怕写的像操作手册,开发就吃这一套。
3.5 异常与容错处理场景说明
我敢说,八成被开发退回的 FS 都是因为异常场景没写全。开发不是不愿意做异常处理,是没人告诉他异常逻辑该怎么定,他怕自己写了又被业务怼"谁让你这么处理的"。所以你要主动写。
建议用表格的形式列异常场景:异常名称、触发条件、预期系统行为、提示消息文本。比如"客户主数据未维护销售区域,保存时报'E:请先维护客户销售区域数据'并阻断保存"。你把这些写清楚,开发直接照抄,测试照着覆盖,客户验收也没话说。
3.6 权限与日志要求
权限这一块容易被初阶顾问漏掉。你得写清楚:哪些角色/用户组可以访问这个功能,有没有数据层级限制,操作结果要不要写日志,日志记录到什么粒度。SAP 体系下权限控制一般通过角色和授权对象实现,但 FS 里至少要把业务上的权限要求写清楚,具体的授权对象配置那是开发的事。
日志要求也一样。有些功能涉及敏感数据或后续追溯,你要明确要求记录操作日志,包括操作人、操作时间、变更前后值。没写这条,真出数据问题你连谁改的都查不到。
3.7 附件与追溯信息
最后别忘了把相关的东西贴在 FS 后面或者作为附录:业务流程图、界面原型截图、参考的 SAP Notes、关联的需求变更单号、会议纪要里相关的决策记录。这些附件既是补充证据,也是后续追溯的线索。尤其是界面原型,哪怕你用 Excel 画一个大概布局,都比纯文字描述强一百倍。
4. 文字表达的艺术:让技术和业务都能看懂,且没有任何歧义
内容板块定了,接下来是表达。很多需求写出来不是"不对",而是"含混"。含混比错误更可怕,因为错误能被一眼看出来,含混是大家各自以为自己看懂了,最后做出来谁都不满意。这一节我单独拿出来讲,因为这是决定性的一条。
4.1 多用"应该动词",少用"可能动词"
写 FS 的时候,每个动词都要经得起推敲。你说"系统应该阻断保存",那就是必须阻断;你说"系统可以考虑弹出提示",那就完蛋了,开发会当作可以不弹。"可以""可能""或许"这类模糊词,在 FS 里是毒药。你要么不写,要么写死。
我自己的习惯是写完一段话回头扫一遍,看到"可"字就停下来想:到底可不可?要是可,那在什么条件下可?写清楚。语气上宁可生硬一点,也别留弹性空间。
4.2 用表格和编号列表代替大段散文
FS 不是文学作品,没有人会欣赏你的排比句。一旦涉及多个条件、多个步骤、多个字段,立刻用表格和编号列表来组织。为什么?因为表格天然带上下文,读者可以横着看字段关系,竖着看字段属性;编号列表天然带顺序,读者不会看串。
我见过有些顾问写的 FS 像作文,一个自然段里塞了四个条件、两个例外、一个补充说明,开发看了三遍都不知道到底几个分支。这种人不是文笔差,是没想清楚。你把同一个内容改成表格和列表,立马就清晰了。
4.3 每一句话都要有唯一的解释
写完一段之后,你可以做一个简单的"歧义测试":把这段话拿给一个不懂业务的人看,让他用自己的话复述一遍。如果他复述的意思和你脑子里想的不一样,说明这段有歧义。比如你说"审批通过后系统自动创建交货单",有人理解为审批的每一步都创建,有人理解为全部审批完成后才创建。你加一个词"全部审批通过后"就没有歧义了。
还有时间副词要小心。"保存时"是用户点了保存按钮那一刻,还是数据落表那一刻?"完成后"是流程走完还是状态更新完?能加前缀的就加前缀,把触发点写精确。
4.4 提示文本也要写进 FS
很多 FS 只写业务逻辑,完全不写用户看到的报错消息。开发到了做代码的时候,只能用系统自带的或者自己编,结果弹出的消息跟业务实际不匹配,客户测试时指着屏幕问"这句话是什么意思?"
我的做法是每个关键异常场景都在 FS 里给出标准的提示文本,包括消息类型(错误、警告、成功)、具体措辞。这看起来是小事,但在客户眼里就是"专业度"的体现,而且也是你做需求分析时思考深入不深入的证据。
5. 写完 ≠ 完事:评审、确认与后续跟踪的正确姿势
FS 不是一个人闷头写完就发的。从初稿到定稿,中间至少要经过三次不同角色的审视,每一次都能让它变得更扎实。很多人就是在这一步偷懒,导致出问题。
5.1 FS 评审会怎么开最有效
至少在线上先自己审一遍:对照需求清单、字段清单和异常清单,把遗漏项补上。如果这都没过,就发出去评审,是在浪费大家时间。
第一次评审是和开发顾问对齐技术可行性,重点是"能不能做、成本多高、有没有更优方案"。你别把这次会当成走过场,要认真记录开发提出的每个疑问,回去修改。第二次评审是和客户关键用户确认业务逻辑,重点是"是不是你要的、有没有理解偏差"。第三次就看情况了,改动小就邮件确认,改动大就再拉一次会。
一个很实用的技巧:评审会之前把 FS 录一份屏幕视频,自己在视频里把整个逻辑走一遍给参会者看。这比大家各看各的、各问各的高效得多,减少很多低质量对话。
5.2 签字确认的正确时机
签字确认要在需求冻结、FS 定稿之后,而不是需求还没聊清楚就让人签字。FS 签字的本质是确认"业务逻辑的基线",一旦签字,后面再改需求就是变更管理流程,不是随便加两条描述就能带过。很多顾问为了省事,草稿阶段就让客户签了字,真出了偏差再想改,客户一句"你都签字了"就把你堵回去了。
5.3 上线前的 FS 追溯清单
到了测试阶段,FS 的作用还没结束。我通常会把每个功能点拆成可测试的行项,对应到测试用例上:FS 第几条逻辑对应哪个测试场景、预期结果是什么。这一张追溯表在 UAT 和上线评审时非常有用,客户问"这个需求测了吗",你直接翻表就能答出来。
千万别等到测试挂了才回头看 FS。测试发现偏差时,先判断是开发实现错误、测试理解偏差还是 FS 本身写得不清楚。如果你自己写得不清楚,老实承认,修改 FS、重新走流程,这才是负责任的表现。
6. 几个必须避开的经典坑:来自真实项目的踩坑记录
这一节是我最想写的内容。文字技巧都可以练,但这些坑是真的付过学费才长记性的。每一条后面都有真实的项目影子,我不点名是哪个项目,大家心领神会。
6.1 坑一:把"结果"写成"想法"
有一种典型的错误写法:"希望能提高订单处理效率,减少手工操作"。这句话看起来没错,但开发看了等于没看。什么算"提高"?哪一步"减少"?统统没定义。正确写法是把目标转化为可落地的系统动作:"系统在 VX01 事务中增加批量打印按钮,一次最多选择 50 行交货单,按模板输出 PDF 并自动触发邮件发送至调度组邮箱。"这才叫需求,前面那句只能叫愿望。
6.2 坑二:字段取值逻辑写一半
举个例子,你写"交货单创建日期取自订单日期"。开发照做了,结果测试发现某些订单是三个月前的,交货单日期显示三个月前,客户说不对。你写的时候没考虑"订单日期可以被修改""部分交货单比订单晚了几周"这些情况。所以字段取值逻辑里的"默认值、覆盖条件、异常条件"一个都不能少。每一句话最好都往死里问一句:什么时候这个规则不成立?
6.3 坑三:编号混乱导致引用困难
FS 里最方便引用的是什么?是"第 3.3.2 条"。但很多人写着写着编号断掉、重排、自己引用自己不对,开发只好在文档里搜关键词,搜到的还不一定是想找的那条。我的建议是写完初稿之后做一个全文档的交叉引用检查,凡是在正文里写了"参见第几节""对应字段表第几行"的地方,逐条核对编号。这个动作花十分钟,省的却是沟通时的无数分钟。
6.4 坑四:忽略"旧系统数据"和"并行上线"场景
做过数据迁移项目的都知道,FS 写得再漂亮,上线第一天往往被"历史数据"干翻。你的新逻辑假设所有数据都是干净的,但生产库里可能有一堆老数据不符合校验规则。所以 FS 里要专门写一段:历史数据怎么清洗、存量数据如何处理、并行期间新旧系统数据怎么核对。不写这一段,上线带上数据之后,等着你的就是一连串的脏数据报错。
6.5 坑五:一个人扛着所有逻辑,从不找开发预审
我见过最可惜的场景:某个顾问辛苦写了一周,自认为无懈可击,发出去之后开发扫了两分钟就来问"这个标准函数不支持这种模式,你是不是应该考虑用 BAdI 增强"。他所有工作付诸东流。原因很简单,他没在动笔前做技术可行性对齐。写 FS 一定不要闭门造车,尤其是涉及增强、接口、报表这些有技术门槛的内容,先用半小时和开发确认方向,方向对了再拼命写。
7. 内容之外的另一层:格式化模板与版本管理的门道
这部分很少人正儿八经讲,但对实际协作至关重要。你以为把内容写对就完事了?格式乱、版本乱、命名乱,照样让你的 FS 变成灾难。
7.1 格式化基础:每个人打开都长一样的文档
FS 交付对象很杂,有人用 Word,有人用 Excel 画字段表,有人直接把内容塞进在线文档。我的建议是统一用 Word 或支持导出 PDF 的在线文档,并且把所有行距、字体、标题层级、表格样式在开始写之前就固定下来。写完导出 PDF 再发出去,别发可编辑文件。为什么?因为你永远不知道别人打开后会怎么改、怎么删、怎么搞得面目全非。PDF 版是正式交付版,可编辑版只放在项目内部盘里留档。
7.2 版本管理的三条铁律
第一,每次修改版本号要递增,并用"v1.0""v2.0"这种格式,别用"最终版""最终版2""最终版3"这种谁都分不清的命名。第二,每次修改要在文档末尾或者修订页记录"修改人、修改日期、修改内容摘要"。第三,给客户和开发的永远只发最新版本,旧版本保留在内部目录做追溯。
我见过太多因为版本混乱导致的返工事故:开发看的是 v1.0,客户确认的是 v2.0,测试测的是 v1.5,最后四个人三个版本,谁都觉得自己没做错。FS 版本管理不是行政工作,是质量管理的一部分。
7.3 模板的意义是"消除空白恐惧"
给新人一套合理的 FS 模板,不是让他们偷懒,而是帮他们建立完整思考的框架。很多新人坐在电脑前头脑一片空白,模板告诉他"先填概述、再列术语、再画现状、再写逻辑",他就有抓手了。所以模板要有,但更要明白模板只是骨架,血肉是你对业务和系统的理解。把模板当成全部的人,写出来的永远是空壳子。
8. 从"能写好"到"稳定写好":我的个人经验与收尾建议
文章写到这,很多该讲的技术点都讲完了。最后分享一点我自己的体会。写 FS 这件事,单次写一份两份不难,难的是每次都稳定输出高水平的东西。这里面的关键是建立自己的检查清单。
我的检查清单大概有二十来项,核心是几条:字段清单是否完整、每个字段的取值逻辑是否闭环、异常清单是否覆盖输入缺失与权限问题、每处分支都有没有 else、提示文本是否明确、与既有增强是否冲突、历史数据处理是否考虑、版本号和签字页是否更新。每次发布之前过一遍清单,虽然会多花半个小时,但后面省下的是几天的扯皮。
还有一个小技巧:把写好的 FS 放一晚上,第二天再读一遍。人在写作当下很容易沉浸在自己的假设里,睡一觉之后脑子清醒了,就更容易发现自己写的东西其实有很多"想当然"。我就是靠这一招抓住了不少逻辑漏洞。
最后送大家一句话:FS 不只是给人看的说明书,它是你业务思考的具象化产物。你能把 FS 写到无懈可击,本身就说明你把业务和系统都想透了。这个能力,不管你是做顾问还是以后转管理,都是带得走的硬资产。希望这篇东西能给正在 FS 里面挣扎的朋友一点真刀真枪的参考。