2007年10月19日星期五

软件开发的未来

【对我来说,文中所提到的问题也是我一直迷惑的:为什么瀑布模型总是那么难以支撑整个开发工作?我甚至一度归咎为“中国人做事不规范,所以没有办法一次性的将需求搞清楚,需要在开发的过程中不断的修改需求,从而造成了开发周期难以控制。”,但是现在看起来,老美也有这个问题,而且已经有了方法论。】

1975年,弗雷德里克·布鲁克斯(Frederick Brooks)写了一本非常经典的关于软件项目管理的著作:《人月童话》,在这本书中,他令人信服的指出,增加人手对于软件开发来说,弊大于利, 并不会加快开发进度,相反只会带来麻烦。原因是人员的增加导致了沟通成本的非线性急剧上升。

Brooks的书面世前的五年,一个名为“瀑布模型”的软件开发理论面世了,该理论将已经成熟机械设计方面的理论应用到软件开发上来,其原理就是如果需要构建一个系统的话,需要遵循需求收集、系统设计、系统实现、测试,并且最终形成产品,这是一个流水线式的作业流程。

瀑布模型从其产生到现在已经很长时间了,而我们在软件开发上面的认知也更多了,目前一致认为,瀑布模型是有缺陷的,因为它太死板、不切实际。在现实世界中,软件往往最初的设计是有缺陷的,需要在开发过程中不断的对需求进行完善,那种认为从一开始就应该想到系统设计的方方面面的想法是不可能的。相反地,当今最好的软件都是采用一种灵活的方式进行开发和设计,这种灵活的方式使得开发人员可以不断的调整软件,从而适合业务模型以及客户的需求。

随着现代开发语言(Java、PHP、Python和Ruby等)的诞生,丰富的软件库、空前的软件架构(比如Amzon的架构),软件开发的方法已经有了一个飞跃,Digg、del.icio.us、Youtube以及其他Web时代的新宠都是由少数几个优秀的程序员编写而成的,当今要编写一个软件你需要的仅仅是几个人就足够了。本文我们将回溯一下软件开发的历程,以及未来的发展方向。

为什么瀑布模型会失败
非技术人员经常会认为软件真的是“软”的,而且做任何修改都是非常容易的,尽管软件对他们来说是不可见的,而且也确实没办法像看得见的橡皮筋一样任意扭曲,但他们仍然会固执的这样认为。当然这不是事实,软件跟其他的机械系统一样,有其固有的设计和结构,并不是那么“软”。

然而实际情况是快速发展的业务又确实需要软件要不断的做出变化,而传统的软件开发方法则完全没有办法适应这种变化,如果使用瀑布模型的话,这种转变是不太可能的,因为整个开发周期太长,系统不断的被重新设计,所耗巨大,而且容易造成软件的不正常运作。


问题的症结就在于瀑布模型的问题,我们太过于自信以至于相信在第一次就可以将整个软件设计的完美无缺;第二个问题则是从自然界来看,完美的系统不是一次性设计好的,而是不断进化的。正是这种进化的理念,促使了软件轻灵设计模型的出现。

敏捷软件设计方法(Agile Methods)——进化的软件
上个世纪的九十年代,一系列的敏捷软件设计方法问世了,这些方法尽管在细节上存在着这样或者那样的不同,但他们都有一个共性:就是认为必须要重新构想软件设计的方法。首先:软件本身必须要包含变化,今天所设定的假设和需求,明天是可能会发生变化的,而软件必须对这些变化做出快速的反馈。为了适应这种挑战,敏捷软件开发方法倡导简单的软件。以最简单的系统满足今天的需求,并为明天的变化做好准备,随时接收调整。

为敏捷软件开发方法所倡导的两种方法值得我们注意:重构和开发人员测试。在Martin Fowler的《Classic Book》一书中对重构有着非常完美的描述,重构就是改良现有代码而不影响业务逻辑。


正是重构,可以使敏捷软件开发方法可以使软件保持其结构清晰而不至于一塌糊涂。像装修人员不断的改进屋子里家具的布局一样,敏捷开发工程师可以方便的移动代码,以适应新的变化,同时确保以最简洁、最优化的代码,满足我们的业务需求。

为了确保开发人员的修改不会影响到原来的代码,敏捷开发模型引入了单元测试。每一个项目开展的时候,单元测试的范围随之扩大。每个测试都着重于系统的单一的元件,并且确保该元件以预期的方式运行。一般来说,单元测试需要不断的进行,以免需求的变化导致代码产生错误。


使用敏捷软件开发方法开发的软件成功的几率一般比较大,因为软件不断的进化以适应可能产生的需求,这样产生的软件就好象一个有机体一样,不断的进化和调整,以适应生存环境的变化。毫无疑问的是,敏捷软件开发方法对我们固有的软件开发方式是一个冲击——原来软件开发的过程是动态的、持续的。

重点不是语言,而是函数库
当我们探讨更好的软件开发方法的时候,软件开发语言也在不断的进化之中,C++取代了C语言,现在则又是Java语言。Perl非常不错,然而PHP和Python则更好,最近的开发工具热点是Ruby,它通过自然的方式来编写代码,从而广受欢迎。由于开发语言的进化,我们有了一系列非常完美的、可实现功能基本上类似的开发工具。

当人们在挑选不同的开发语言的时候,实际上大家所关注的焦点并不是语言本身,而是函数库,C++就没有像Java那样的标准库,Java当然是一个不错的语言,但是人们已经使用了C++数十年,之所以Java能够异军突起是因为Java给出了一系列丰富的、可重用的函数库。对PHP来说也是这样,之所以Web开发多数选择PHP语言就是因为PHP本身提供了大量的函数库,对Web开发和数据库处理提供了良好的支持。


除了函数库之外,开源运动也为整体软件架构的提升做出了不少的努力,值得一提的是,仅Apache组织本身就创建了大量的高质量、可重用的代码。当前时代,我们已经有了大量的基础函数库,从而可以为我们编写复杂的软件提供各种支持。我们明白了新的软件开发的方法论,而且我们又有大量的工具,这意味着什么呢?

未来的软件开发:只需要几个优秀的开发工程师而已

早期,为了开发出好的软件产品,不断的投入人力,而结果反倒并不理想。而近期的社交网络的爆发使我们见证了一个有趣的现象:只有几个工程师开发出来的软件产品,却为上百万用户所用仍能保持正常的运转,这是怎么做到的呢?

其秘密就是仅有几个核心的优秀工程师,通过一点纪律约束和大量的激情,几个工程师就可以做出相当复杂的软件产品。由于有现代化的编程语言、大量的函数库和敏捷的软件开发方法,几个在车库里面的优秀的开发人员就可以完成成百上千的平庸的工程师集合起来都不能完成的优秀的软件。


未来几年我们可能会看到以下的一些变化:
  • 高质量的、充满热情的软件工程师将会非常抢手而且很容易赚到更多的钱;
  • 没有好的编程技能的工程师将无法在这个行业生存;
  • 我们今天见证的社交类软件的现象将扩展到企业级软件;
  • 在软件产业,经济因素将变得不那么重要;
  • 计算机行业将继续成为一个高竞争、受人追捧的行业;

结论
具有讽刺意味的是,我们跟着布鲁克斯的《人月童话》走了一圈,发现20年前成立的理论,到今天仍然成立,只不过多了些新的论据而已。通过敏捷软件开发方法、高效的编程语言和大量的函数库,我们完全可以推翻旧的软件开发的教条,仅靠几个优秀的工程师就完全可以开发出具有复杂功能的软件系统。技能在软件工程中具有很高的重要程度。

没有评论: