最近半年一直在反思瀑布模式和敏捷模式的使用。



因为我的第一家公司是传统软件公司,软件流程包含了一整套的初始需求、方案设计、招投标、需求分析、概要设计、详细设计、开发、测试、试运行、全面上线、后续改造与维护等流程,虽说知道的不深,但也还算是了解。因此可以说,我对传统的瀑布模式是比较熟悉的。



现在的这家公司,因为是互联网企业,所以要求速度要快,快速响应最火的热点。但去年这家公司用瀑布模式比较多,速度慢且费时费力。因此今年在大力推进敏捷+微服务。







我很赞同之前我的老板和我说的一句话:“没有任何一个系统是按部就班就能做成功的”,因此我即不认同标准规矩的瀑布模式,也不认同疯狂激进的敏捷模式。







举例说明A:在上一家公司瀑布流程标准的时代,我负责的一个社保项目,由于开发团队对项目的需求和流程十分熟悉,配合熟练,因此,我们跳过了概要设计和试运行阶段。

举例说明B:之前有业内BAT人员来给我们讲解敏捷模式,各种疯狂,例如表的结构不需要设计,放一个大JSON,不需要测试流程直接上线、不需要产品设计人员…….但是,太激进了,我们无法相信这个能起到实际效果。更倾向认为,这个是程序员为了个人的懒惰的目的而做的一种宣传。毕竟,这个行业有太多的程序员和太多的退役程序员,他们的号召力太强悍(但程序员有个缺点:术业有专攻,程序员做出的东西,有95%以上都是复杂而没有用途的“技术牛角尖”)







因此我不认同标准规矩的瀑布模式,也不认同疯狂激进的敏捷模式。







去年,领导要求规范化,但是那会儿我们的团队磨合不够,举个例子:写个API接口,六个人有四种完全不同的写法;对于分布式服务,一群人认识不清,只有一个人大概了解的,但是也是一知半解无法说服其他人;对于系统的总体架构,修改频繁,甚至对于一个英文的中文解释都有N多个,“支付渠道、支付通道、支付路由………..”

因此,无法立刻出一个统一的规范标准,唯一的可行之路,就是先实现一个基本可用的版本,然后在实践中探索规范。——其副作用就是:当时很多人认为我们的行为是不规范的。







在这一年中,领导屡屡提及规范化,要求我们做项目要按照标准流程去做。我们也响应领导号召,尽最大努力的增加规范,例如,版本管理流程、DBA执行规范、代码评审规范、代码总结规范、接口文档规范,部门培训规范…………..



但我很担忧有一天我们会成为一个庞大的,繁杂的,无人认识的系统,然后大家散伙各找各妈。







因此我在后半年一直在反思瀑布模式和敏捷模式的使用。







直到前段时间总结了我们的做法,略有所得:



—————————————————————————————————————————————————————————-



如果说:项目的稳定+流程的规范是一个重型的极端,而立刻快速的上线是一个轻型的极端













































































































重型项目工程(瀑布)



轻型项目工程(敏捷)

流程要求

100



流程要求

0

版本管理

100



版本管理

10

数据库管理

100



数据库管理

10

配置管理

100



配置管理

10

开发人员培训

100



开发人员培训

100

上线速度

10



上线速度

100

技术稳定性

100



技术稳定性

100

DBA执行规范

100



DBA执行规范

10

代码评审规范

100



代码评审规范

10

代码总结规范

100



代码总结规范

10

接口文档规范

100



接口文档规范

0

……




……




从这张图上看到:无论是瀑布模式还是敏捷模式,无论是重型项目工程还是轻型项目工程,做的都是相同的东西,仅是需要的努力程度不同。



因此,我很反感那些说“敏捷比瀑布好”的,也很反感那些说“瀑布比敏捷好”的。







我认为,瀑布和敏捷,是相同性质工作的两个极端,而作为项目负责人,是一名老司机的角色,在道路上既不能靠左路边行驶,也不能太靠右边行驶—这容易掉沟里。



项目负责人的职责,是动态的根据需求,调整这辆车在路的位置:



            1、不能掉沟里,让车无法前进—》管理要求太重则负担太重,管理要求太轻则稳定性不足,都会导致项目无法推进



            2、需要满足乘客的要求———-》领导就是乘客,乘客经常说“师父靠一下边,我拍照”,领导经常说,这个不规范,要增加管理要求,或者这个没用的东西给去掉



            3、需要避开前方的障碍———-》开车时,路上会有石头,你要避开,而项目推进时,前方经常有障碍,例如:隔壁友邦系统不给力,前方有技术难点,后方有依赖系统在催。。。。。。



            4、需要选择最近的路线———-》需要选择最近的路线,开车是为了省油。项目负责是为了节省程序员的成本。



            5、、、、、、、、、、








因此,我推荐的方式,是根据环境,根据总体需求,根据团队的目标,选择那些需求要用,那些需求要舍弃,最终目的是:整车人安全到站,大家开开心心回家过年。








如何做到这个目标呢?:



1、凡是引入一个需求,这个需求必须是可以反向去除的



        举反例说明:引入配置管理部的规范,提交SVN和BUG号要绑定才能提交,这个略微有点违反这个思想,因为加上这个功能,那么就永远无法去除了。此类需求一多,则系统会越来越重,并且无法减肥。



        举正例说明:引入了PRE环境测试需求,要求项目上线前才PRE进行测试,这个规范就是可以反向去除的,因为我们在DEV-UAT环境测试完,如果项目紧急,可以直接对UAT封版,UAT测试,UAT回归,UAT验收,直接上线,这种需求就是可增加可删除的。



2、明确我们的目标,我们是用成果说话的,没有成果,一切都没有意义



        举反例说明:考英语四级,努力的考了3次,每天被单词到晚上10点,报各种培训班,订各种资料,阅读各种英文资料,故事可歌可泣听的都哭了………………….然而没考过,这就从一个悲情故事变成了一个可笑的故事。没结果就没有意义。



        举正例说明:高中时,你肯定有一个同学,平日不好好学习,但是考试成绩很好,因此老师各种优待,家长各种宠爱………………….成果比一切都要重要。



3、明确没有什么是必须的,包括:规范、稳定、DBA、总结、文档、接口……….



        如果你认为“XX是必须的”,那你的人生已经失败了一半,因为你没有认识到:“成果是最重要的,而附属的那些东西是不重要的,当然,如果这个成果必须由一个附属的去支撑,那么附属也同样重要”



        举反例说明:隔壁系统,具有各种规范,具有各种的要求,具有各种的管理,一个项目里一个开发三个测试……然而导致项目推诿严重,项目无法推进



        举正例说明:我们系统的初创时期,由于一无所有,因此不需要“僵化流程”,不需要“冗长规范”,并且能扛着领导的“一定要规范”的压力没有增加这些内容,所以项目推进迅速,成果显著,部门绩效极高,高层非常认可。



4、项目负责人一定要有责任心:



        4.1、了解项目各方的需求人:产品需求、领导需求、测试需求、程序员需求、友邻部门需求、各项目干系人的需求



        4.2、分析这些需求哪些是必须的,哪些是可延后实现的,哪些是可以舍弃的



        4.3、仅最大努力,把必须的需求实现,把可延后实现的需求放到同期实现,把舍弃的需求尽量列入计划



        4.4、此时会有个问题:项目负责人的责任心,因为在此情况下,会出现委托人问题,各方要做需求实现,但是项目负责人会为了工作的轻松程度,尽可能的把可延后的需求延后实现。此时需要各方的博弈,最终结果会是各方得到一个平衡,项目成功上线,满足了各方的需求。



                这就是项目负责人的意义:平衡各方需求,把一件事情抹平。同样而言,如果一个项目负责人延后了太多的项目,就会被换掉,这是自然规律。



       







以上是鄙人狂妄的见解,请不认可的同志们就当是笑谈吧



——————————————————————————



因此说:项目负责人这个工作,是艺术而非技术。但艺术水准是无法衡量的。



人类趋于稳定,不想冒风险,因此我一直致力于成为一个技术人员,因为技术水平是可衡量的。就比如13年初那会儿,会Hadoop就比其他人牛……再比如今年,精通docker就比其他人牛……



这就是为什么很多人喜欢做IT,IT有一条非常稳定的技术路线,沿着路线走,你总会成功的。