作者回复: 很感动,写了这么长的留言。这是个很生动的案例。像这样的环境,虽然说根源不是瀑布模型造成的,但是瀑布模型确实加剧了问题。
对于这种开发模式,邹老师在《构建之法》中有精彩的论述:“老板驱动的流程:笔者在和中国一些企业的软件开发者交流的时候,听闻不少人提到开发流程事实上是由行政领导主导,或者由公司的老板驱动,我们姑且把它命名为老板驱动的流程。” 领导“有极大权力, 极小责任”的驱动方式。
这种项目可以考虑调整为快速迭代的模式(下一篇会提到,核心就是控制每次的需求),尽早上线核心功能,上了慢慢改,下个迭代改。就像老话说的:“生米先煮成熟饭”。
还有PM应该要能顶得住压力,在一个迭代中应该不改或者少改,才能继续推进。
另外,也能理解这种项目不是靠个人就能改变太多的,适当的时候提一些建议,改变能改变的,接受不能改变的。
最后,有具体问题也欢迎继续留言讨论,很乐意提供建议:)
作者回复: 你这个比喻很有意思的👍,下一篇关于衍生模型的很多例子完全适应你这个比喻。
敏捷开发的Scrum可能还是有点不一样,每个Sprint并不完全按照这个周期,但是在一个Sprint的某个用户故事的开发,其实也适用于这个环。
所以你说的关于这几个阶段的功夫,确实都得练好!
作者回复: > “如果产品的需求变化不大,产品设计者的前瞻性和设计能力比较强,设计的框架的伸缩性强,是不是瀑布式的开发会优于敏捷开发呢?”
如果满足你说的前提,再加上没什么进度压力的话,瀑布模型像计划性、质量、过程控制都是很好的,是不是比敏捷开发好这个我不好随便下结论,因为敏捷开发理想情况下一样可以质量高。问题是绝大部分时候真的不是理想情况。
> 对于较大的项目,如果能做到合理的项目分割,划分,那么在分项目中再实行瀑布式开发,是不是效率也会挺高?
是的,你说的这种大的拆小的是下一篇会讲的迭代模型,基于瀑布模型,但是更小,也更高效。在再下一篇我还会对比迭代模型和敏捷开发,希望能帮助你更好的理解其中的差别。
很多人不愿意尝试其他瀑布模型之外开发模式,可能是因为已经对瀑布模型太熟悉了,多看看多学习一下其他模型好的地方,再尝试实践也是很好的。
作者回复: 你这个总结的特别好👍
我以前不是科班的时候,就是怎么都想不明白大项目怎么开展,后来改专业到软件工程后,就觉得这是很自然而然的事情了。
而且虽然我们大学只讲了瀑布模型,但是后来再看迭代模型,马上就明白怎么回事了。当然也有科班也有问题,例如我刚开始对敏捷就有点不屑一顾,觉得瀑布模型就很好呀:)
作者回复: 通常两种方案:
1. 砍需求,以保证可以按时完成
2. 快速迭代,可以及时响应变更
作者回复: 文档这部分,没有什么统一的模板。我的观点是,文档最关键的地方在于达到其目的,格式是其次的。
文档的目的我觉得主要是两点:
1. 写文档的过程中帮助你梳理清楚逻辑
2. 写出来的文档是要用来沟通的,让其他人通过文档明白你的思路
所以建议不用太在意格式,重点放在内容上就好了。
作者回复: 感觉大家项目经历都很丰富,一些内容触动了大家留言的想法💡
很喜欢看大家的留言,可以了解大家想要什么有什么问题,也可以了解到很多有意思的项目,根据留言还可以调整后面的内容呢。
谢谢
作者回复: 04就会讲迭代模型,是最容易从瀑布模型演进过去的,可以很有效的应对需求不清楚的情况。其实你这种情况最好是05敏捷开发,但是实施难度要大一些,不够了解的话还不如迭代模型。
具体到实施上来说呢,就是你考虑把大瀑布拆成小瀑布,固定迭代的周期(例如2-4周),每个迭代都发布一个可以运行的版本(非常重要),本质上还是瀑布,但是这种模式,可以让你先选择优先级高的需求,当前迭代如果没搞清楚需求也没关系,下个迭代改进完善。
可行性分析和需求分析在后面章节会涉及。
作者回复: 👍
是的,瀑布模型虽然问题比较多一点,但是意义重大。后续的模型都是为了解决瀑布模型而努力的。
作者回复: 具体还是看什么应用,App还是Web还是其他,Web的话Axure应该是不错的选择。
如果是App我最近看到一个高保真的原型设计工具 framer 非常厉害:
https://www.framer.com/
作者回复: 谢谢夸奖。
其实这就像上课,课后的答疑。毕竟一篇文章不可能面面俱到,难免有没讲到和没讲清楚的地方,通过留言和回复,可以把这些问题补充说明清楚。
作者回复: 《10 | 项目计划:代码未动,计划先行》会讲时间估算。
通常时间估算并不需要特别精确,初步的需求分析就可以大致估算出每个阶段需要的时间。大致时间确定后,就可以设置里程碑。里程碑定了后再确定细的计划。
虽然我觉得甩锅不是什么好事,但是如果你真要甩锅,最简单有效就是设置流程去划分责任:)
上线后有问题其实很正常的,重要的是要有合理的机制:
1. 及时发现问题,监控报警、用户投诉反馈等
2. 马上解决问题,对线上版本有专门的代码分支,可以随时打补丁修复,测试上线
3. 避免后续再犯同样的错误。要分析原因,看什么导致问题,然后改进流程。
希望以上回答能解答你的问题,如果还有不清楚的欢迎继续留言。
作者回复: 大功能确实会超过一个迭代周期,这种情况下,还是应该坚持按时发布更新,先把完成的小功能和bug修复发布,没完成的放在后面的迭代中继续完成。不然就又回去大瀑布了。
作者回复: 《构建之法》中说:软件=程序+软件工程,不无道理
作者回复: 是的,其实我这也算是抛砖引玉,提出一个观点,然后引发更多讨论,有时候甚至讨论的观点更精彩!👍
那你可以尝试快速迭代试试,如果周期能短一点,也许对于需求的响应能迅速一点,能改善一点。
作者回复: 认同的,做之前先要想清楚。我昨天正好写了一个微博:
> 我在带新人的时候,一般都会要求他们在实现一个稍微大一点的项目的时候,先做一个简单的设计,想清楚分哪些模块,模块之间关系是什么,要提供哪些对外的接口等。对设计文档格式没有要求,但写完要给我Review,我会提一些建议,其实就是帮他们想清楚。
> 这么做主要目的让他们在写文档的过程中,把问题考虑清楚,不要上手就写代码,结果写一半才发现当初有很多问题没考虑到的,要大概甚至重写。
https://www.weibo.com/1727858283/HjAaacaMl?from=page_1005051727858283_profile&wvr=6&mod=weibotime&type=comment
作者回复: 还是看项目类型吧,因为架构一定是构建在需求之上的,如果需求不明确,很难设计出来合适的架构,所以难免会改,反倒不如先设计合适的架构,后面慢慢修改,一定阶段后重构。
作者回复: 你说的第二个方案应该还是可行的,因为甲方关心的是产品质量和价钱,如果你的方案价钱差不多,质量可以更好,他们应该会支持的。
当然这个很多时候不是一个人就能解决的了的。及时是瀑布模型,也可以借鉴一些其他模型好的实践来优化,例如在开发阶段采用迭代模型或者敏捷开发,采用持续集成提升效率。
作者回复: 即使只有一个人,建议也要做简单的需求分析和设计,做完后,形成简单的文档,找人评审一下,提一些意见。
因为你写文档的过程,给别人讲的过程,其实是在帮助你思考,帮助你梳理清楚逻辑,避免在实现的时候发现好多问题没想清楚。
还有一个思路就是快一点迭代,每一个迭代解决优先级最高的问题,然后下一个迭代中改进上一个迭代的问题。
项目中犯错误其实很正常的,重要的时候要总结,看看通过什么方式能改进,避免犯类似的错误。
作者回复: 如果你在1.1发现bug,需要甄别一下紧急程度,紧急的话,就1.1分支修复,然后hotfix,不紧急的,就1.2修复好了。
分支合并有两种策略:1. 不合并,如果有bug fix,各个分支同步修改;2. 分支合并回主分支,例如1.1上线时创建分支,1.2开始在主分支开发,开发时发现1.1的bug,只更新1.1分支,再定期把1.1的分支合并回主分支。
敏捷开发中,通常建议只做刚刚好的设计,不必要考虑太多后续的需求变更,定期再重构(例如你可以重新设计表,然后把旧数据导入)。
极客时间有个《从0开始学架构》的专栏(也出书了)不错,你可以看看。