事实上,撰写项目规划和设计文档,最重要的不是文档的模版和格式,而是里面的具体内容,它往往需要结合实际客观环境因素来综合考虑,平衡取舍,是一个需要充分脑力活动的工作。尽管如此,在大多数情况下,还是有一些相对通用的指导原则可以帮助我们更好的完成这项工作。
首先,需要有明确项目背景,目标,以及核心需求分析
换句话说,就是这个项目从产品或业务的角度,最核心的推动力是什么?再换句话说,痛点是什么?
有痛点自然就有目标,你希望项目最终以什么方式解决问题,能达成什么目标。
背景和目标的阐述,必须要能够自然合理的推导出下一部分内容:项目的核心需求/功能是什么。
如果项目背景,目标的描述不能起到这个作用,那这一节内容就没写好,因为项目方案文档就缺乏了根本的出发点,后续的内容都没有了好坏对错判断的基本依据。
举个例子,如果我想构建一个数据交换服务或ETL系统,那么上述各环节的内容可能是(简化的写):
背景 : 当前数据ETL链路极端难用,效率低下,稳定性差,维护代价高,用户抱怨多等等。
目标 : 用户全自助,简单易用;可维护性好;性能高;可靠性好。
核心需求 :比如针对“用户全自助,简单易用”这点(其它目标可以类似分析推理),可能是:
提供统一的,标准化的配置后台:用配置的形式表达ETL业务语意,屏蔽下层实现细节。
提供完善的错误反馈信息/机制:让用户能自助解决使用中遇到的问题。
ETL业务流程标准化:将最佳实践沉淀下来,通过配置的方式让用户选择,减少重复工作,降低用户开发的难度,规避使用姿势错误可能造成的问题。
其次,需要对现状和问题进行充分的收集和分析
从方案文档的角度来说,放在这里,是为了进一步细化问题,分析目标,核心需求与当前现状的差距在哪里,具体有哪些实际问题需要解决。为后续具体的实现方案,准备必要的输入信息,确定工作的优先级,重要性,项目迭代的步骤等等。
需要强调的是,现状和问题分析,要围绕前面的核心需求的条目展开,两者是强关联的,不要相互脱节,各讲各的
最后,是输出解决方案
定完需求目标,分析完问题和现状,接下来才是规划具体做什么,怎么做,什么时候做
做什么:
做什么和前面项目目标的要求刚好截然相反,需要输出明确的可执行的事项,而不是模糊的不可执行的要求。
具体做的每一件事情,都要和前面的核心需求和现状问题对应上。如果你发现有些工作,和前面的目标没有任何关联性,那么考虑一下目标是否需要再评估调整,或者这件事情根本就是不重要的。
要做的事项列表,是一个经过归纳思考以后的总结,而不只是一个个零散的事情的随机列表。需要有重点和优先级。如果有必要,以归类,分组等形式结构化的组织相关联的事项。
完整的事项列表,应该是一个和最终目标对应的完整解决方案,而不仅仅只是完成目标工作中的某一个环节。
比如面向用户的终端产品项目,需要包括整个产品的交互逻辑,业务流程的规范设计等等,而不仅仅是对底层系统实现和后台功能点的设计。
这点很多同学也很容易忽略,总觉得功能和架构的实现才是有挑战,需要规划的内容,而产品的形态并没有花心思去琢磨,事后开发前端时才来考虑。实际上后者可能才是真正影响项目成功的关键,也很可能会影响到底层架构的设计和取舍。类比一下,好比一个用户产品都开发完了,才来考虑埋点,数据采集和数据分析的工作,这时候就很被动了。
怎么做:
前期方案文档,没有必要列出详细的技术方案细节,只需要一个整体的技术方向选型和初步的架构设想。但是,如果是涉及到核心需求能否有效满足的关键的技术点,有可能影响整体的架构或产品实现的,那就有必要就可能的方案的进行详细的评估并得出初步的结论。
无关架构或进度安排的方案细节,没有必要写太多,可以后续再补充。
方案中有不明确的地方,即使没有时间调研,也不要简单的略过不写,要在文档中明确的把问题写出来,给出下一步调研的方向计划等。归根到底,方案文档中,对每一个已知重要的问题,都需要一个明确的结论或者可以后续跟进的计划,以免事后遗漏。
再强调一下,做什么和怎么做就是手段,既然是手段,就要写得足够具体,具体到有明确的可落地实施的事情,有明确可以衡量的标准,或者针对当前存在的一个具体问题,不要在这个地方又写得像目标,没有明确的可执行的点。
继续举上文数据交换服务的例子,针对其中的一个核心需求:
ETL业务流程标准化:将最佳实践沉淀下来,通过配置的方式让用户选择,减少重复工作,降低用户开发的难度,规避使用姿势错误可能造成的问题。
这个内容要写具体的要做的事项。以下方式来写可能就是不合格的,因为不够具体,还没有足够思考:
总结最佳实践
生成标准的流程
总结常见的错误
以下内容可能就更加明确,更加可落地一些:
统一当前增量数据导入的存储,合并,归档方案
将常见合并,去重逻辑标准化,通过配置自动生成任务脚本
制定ODS快照表生命周期管理方案,规范存储路径和命名方式,定期清理过期数据。
什么时候做,谁来做:
这是做什么和怎么做的进一步延伸,需要强调的是整个项目如何实施的整体步骤计划,而不仅仅是简单的列一下每项工作的人员和排期,
需要分析系统可能的迭代步骤(包括可能的短期应急和长期解决方案),上下游依赖梳理,需要协同进行的工作,最终项目上线时可能的业务迁移,数据迁移,系统集成等等外围工作的安排。
如果不是工期严格要求,deadline为导向的项目,整体的依赖和步骤往往才是在项目规划阶段需要重点阐述的内容,也是有可能对整体产品的进度,风险产生影响的事项
而具体工作工期的安排,说实话,多数情况下,反到没有那么重要。如果整体工作和步调没考虑周全,工期排得再科学,再精细,也毫无意义。
总结一下,什么时候做什么事,最重要的目的,不在于工期的计算,甚至也不是人力资源的安排,而是为了理顺事情依赖关系,控制可能的意外风险,提升项目开发进度的可控性。
总体原则:
项目方案规划文档的根本目标是统一认识:明确问题,确定重点,阐明路径,控制风险。
文档的撰写方式,是目标和需求先行,围绕出发点,逐步递进展开。
文档的基本要素:背景,目标,核心需求,现状问题分析,关键方案难点解析,总体实施路径,工作事项列表,进度计划安排。
再细化到一些注意事项:
核心需求,必须是核心的,一定要实现的内容!不能缺,也不能滥。
问题现状,工作事项,必须呼应核心需求,要有明确的相关性,不要无的放矢。
围绕最终目标,输出完整的端到端的解决方案,而不是局部环节的方案。需要从最终产品/功能形态的角度考虑要做的事,而不是仅仅考虑底层技术实现。
事项目标列表,不要仅仅罗列要做什么事,更重要的是说明想要得到的结果,而不仅仅是描述实现手段。
所有工作事项,需要明确思考过实施步骤,重要性和优先级,结合目标和需求,进行抽象归纳,而非简单随机罗列。
要有明确的计划排期,但更重要的是,要完整的分析思考可能的上下游和周边工作依赖。排期只是结果,完整的梳理才是关键。