当我1999年进入互联网行业工作的时候,华为刚刚通过了著名的CMM认证。当时作为一个小程序员,非常向往业界经典的软件开发模式。因为看上去,如果企业实行了CMM,我们程序员就不用再天天为了老板一个拍脑袋的主意而加班开发了,各种各样的奇葩需求和无理变更,也会烟消云散。但是,在接下来的十几年,几乎没有那个互联网公司再去通过CMM认证。是否CMM这种软件开发模式,就根本不适合互联网行业呢?这是一直以来我都在思考的问题。反而是跟随着互联网企业的一步步长大,我无意识的体验了很多现在流行概念的早期实践:敏捷、重构、持续集成、DevOps,这些实践一开始都非常的幼稚粗糙,但是却真正的伴随着互联网业务的逐步成长。所以,在讨论互联网服务的开发模式时,我认为必须要先搞清楚互联网服务开发的核心问题是什么。
本质:服务,而不是产品
软件到底是“服务”还是“产品”,这个话题一直都非常具有争议。作为程序开发者,实际上是非常希望软件能够是一个产品,因为软件的后续维护和修改,往往是“导致”项目失败的最常见原因。然而事与愿违的是,在互联网企业中,打多数的软件项目,表现出来的是典型的“服务”特征:
因此,在互联网行业中,软件开发更多的是以一种服务的形式存在。这种特征,在对需求的分析管理;开发技术的选择;集成与测试;运营和客服四个方面,都导致了不同于“产品”型软件的巨大差异:
由于服务必须保持长期的稳定可用,又要具备快速的更新部署能力,所以系统集成的效率和质量要求非常高。所幸的是系统运行的环境大多数都是在可控制的空间里(比如开发公司自己的机房内)。
服务是公司和客户的一种持续沟通和交互的过程,并非一个单向的发售行为,所以互联网服务需要更多细致的运营和维护的工具,否则难以做到迅速而细致的满足海量的互联网用户的需求。
小米的MIUI开发节奏
在各种项目管理的课程里面,陈述了大量针对人去工作的方法。各种会议、报告、表格、评估、测量多不胜数,然而软件项目进度的控制,依然是一个难度堪比登月的事情。—————对于很多项目经理来说,程序员们基本是一个黑盒子,他们自己都不知道一个事情需要多长时间干完,就更别提别人怎么去预估和控制。这里最大的问题,我觉得是:我们往往总是想着怎样“控制”住软件项目的进度,而忽视了如何减少不利于项目进度的因数。实际上影响软件开发进度的主要因数,一般有一下几个:
针对上面说的几个问题,很多都可以通过应用更好的开发工具来解决。比如一些新的需求类型,我们可以求助于互联网上丰富的开源软件和开源库;面对需求变更,我们可以使用设计模式、单元测试等工具;开发中的事务问题,更是可以有大量业界先进工具可用:SVN,Git,Jira,Project,IDE,Chef,Docker……
与其我们拿着鞭子抽打程序员,还不如给程序员更好的开发工具,这样对于项目进度的推动,其实更有好处。
互联网公司是由人组成的,人是会流动的,有一些小型的公司,往往会因为一两个核心员工的离职,造成整个系统的代码无法看懂,无法修改,从而最后导致公司完蛋。这种糟糕的情况,不止一次的出现过。然而,如果我们能有一套完善的开发流程,或者是习惯,以及配合良好的开发环境,加上有一定质量的代码,是完全能做到把项目代码,在不同程序员之间顺利交接的。可惜我们很多公司管理者,并不重视程序员用什么工具开发软件,也不知道如何去提高代码的可读性,所以造成我们的项目特别害怕人员变动。如果我们把人员变动看成是一个必然会发生的事情,那么我们就会更重视整个代码的开发环境和开发过程,从一开始就把开发规范确定下来,规定使用什么环境,应用何种工具,并且坚持执行,同时在实践过程中不断的改进。只有这样有预备的去做,最后才会保留的住公司真正的资产。
一家互联网公司,我们在评估其开发资产的时候,并不应看他“拥有”多少行代码,因为这些代码是无法直接卖钱的。而互联网公司的开发速度,以及这个速度背后的能力才是最重要的。
感谢大家的阅读,如觉得此文对你有那么一丁点的作用,麻烦动动手指转发或分享至朋友圈。如有不同意见,欢迎后台留言探讨。