写这一篇文章的初衷来自于我从一个人blog上看到的东西,他在blog上及其坚定地说了这样一句话:业务永远比技术重要。而在现实中,我也总是听到这样的声音,即决定一个软件项目成败的最大因素并不是技术问题,更多的是业务问题。有时候我们也经常看到有人以“过来人”的身份告诫后来者:不要执迷于技术细节,更多的要去了解各种业务。
首先我想用几句话概括我的观点:即
n 一个软件项目如果能够成功,技术因素和业务因素都是必不可少的
n 软件项目失败的一个重要原因,很多人简单归结为业务没有搞清,却没有看到背后的问题是人本身在试图搞清楚这个问题时候方法不正确
n 领域知识,也就是很多人嘴里的“业务”并不能够让你的能力有长足的发展
n 方法论永远比单纯的知识更重要
什么样的软件项目可以成功呢,在我看来,一个成功的软件项目有以下特点:
n 良好的用户反馈,用户认为这个软件正确地实现了他们的需求,同时可以方便地使用这个软件
n 成本控制恰当,软件企业获得了所需要的利润,用户对自己的支出表示满意
n 按时交付,或者说交付的时间在用户可以接受的范围之内
一个软件项目如果想要成功,需要各个层面的努力,这其中有几点尤为重要:
n 对用户需求的充分发掘
n 高素质的开发人才
n 良好的实现方案和技术架构
n 合适的团队管理和开发模式
这几点都是能够对一个软件团队在实施软件开发中起到决定性作用的因素,在中型或者大型软件开发团队中,这些因素是缺一不可的。如果没有对用户需求做明确的定义,那么软件的开发就是南辕北辙,而缺了人才和技术,一个软件项目是没有办法继续下去的:人们会发现有那么多的事情自己办不到。在几十甚至几百人的软件团队里,如何有效地协作就成为了一个令人头疼的问题,解决这个问题,要靠开发过程的明确定义和正确的管理。
认为有些因素不如其他因素重要,将让你的软件团队陷入困境。因为实际上这些因素是缺一不可的,就好比人要走路需要两条腿一样,是左腿重要还是右腿重要呢?结论是,无论你缺了哪一条腿,都不能够顺利的行走。
对于“业务”整个词,我把对它的理解分为两个方面:领域知识和用户需求。领域知识就是你所在的这个行业,这个地域,这些客户的一些共性。而用户需求是什么我就不用解释了。
一个软件项目失败,可能有多种表现形式,但是如果我们考察一下那些失败的软件项目,可以发现有很多是因为没有弄清楚用户的需求就匆忙进行了开发,结果陷入了用户不满意,软件被迫修改,工期延长,延长的过程中bug层出不穷最后项目失败的怪圈。这也是很多人认为他们所说的“业务”比“技术”更加重要的原因。
但是我们要再仔细地探究一下:到底是什么原因导致了我们不能够清楚地发掘用户的需求呢?相信会有很多不同的答案。关于这一点,我会写另外一篇文章来阐述这个问题。在这里我只想表达我自己的一个观点:没有良好的定义需求,大体上可以有两个原因:1,没有正确的方法去探索用户的需求。2,没有一个好的机制来对用户需求的变化作及时反馈。
没有正确的方法去探索用户的需求,意味着在软件团队里,需求定义人员,通常也就是系统分析师的工作没有做到位,甚至缺乏“会”探索需求的人。没有好的机制对用户的需求作反馈,说明软件开发过程的定义缺乏灵活性,我们从软件工程的角度来看,一个良好的开发模式,应当事先如何应对用户需求反馈的方法,如果没有,它就不是一个好的模式,满足不了在现代瞬息万变的社会中大型软件开发的需要,而这,需要有一整套的方法和制度进行保障。
如果我们审视一下我们身边软件开发团队中的系统分析师这一个角色,我们就会发现,在中国,很多软件团队中没有合适的人选,说得更加明确一些,没有人有足够的能力充任这一角色。在这种情况下,通常会退而求其次,由开发设计人员或者领域专家来作对用户需求的定义工作。
这样有什么弊病呢?软件开发人员和需求分析人员所需要的能力是不同的,一个是提出分解问题,解决问题的能力,一个是汇总问题,探索问题所在的能力。所以由软件开发或者设计人员充任系统分析师,往往不能够看到问题的实质。于是有了第二个选项,即由一个领域专家来充任系统分析师,但是领域专家的问题是他虽然对所处的领域很熟悉,但是他所熟悉的是这个领域的过去和现状,而软件系统所要解决的是如何改变现状的问题,如果缺乏预见性和分析判断综合的能力,领域专家也很难代替系统分析师的角色。
系统分析是一种能力,它需要方法论的支持,需要智慧,需要交流的能力,迅速领悟的能力。但是系统分析师并不一定必须是领域专家,他可以向其他的领域专家进行咨询,和他们讨论,进而找出问题所在。
领域知识对于系统分析来说是必须的,但是我想说的是,比领域知识,也就是很多人经常挂在嘴上的“业务”更重要的是你的分析方法,是你获取和分析领域知识的方法。没有获取知识的方法,你无法在面对新的事务时候仍然从容不迫,没有分析问题的方法,你看不到用户那些有意义或者无意义的描述后面的东西,你了解不了他们的心。
作为一个系统分析师来讲,永远不要被用户或者专家嘴里的专有名词吓倒,因为你有一颗睿智的头脑可以迅速明白这些名次的含义,你有一套科学的方法论做为工具来分析他们的说法是不是有意义,你有敏锐的观察力让你能够看到他们心里所想的事情。
很多软件公司都是在做某一个或者几个特定行业的应用,很多软件工程师或者刚开始从事系统分析的人会听到别人这样的劝告:我们所在的这个行业业务复杂如牛毛,你一定要多学习,不要执迷于技术。这些说法本身没有错误,但是它忽视了一点:领域知识固然重要,但是最重要的还是发现和分析的方法。如果你只是单纯的学习这些领域知识,而不去对这些知识做发掘和分析,更重要的,不去掌握发掘知识的方法的话,你所掌握的这些知识很快就会被淘汰掉,你所已经掌握的这些知识对于你在别的领域的发展不会有大的作用,它并不能够让你的能力有长足的发展。而方法论则是普遍的。这就好比一个程序员,如果只是执着于某种编程语言的一些要素,比如这个文件怎么打印,那个socket怎么连接,而不去想潜藏在背后的编程思想,不去想语言中一些共性的东西,那么总有一天他所熟悉的语言会被淘汰掉,而这个时候,他会发现学习新技术是那么的耗费时间,因为他只是在追逐一些片面的东西。