这个企业所得税怎么算这么多把我整得焦头烂额!我到底应该怎么办!

又到新年了日历又要从2011年翻到2012姩了,这使我有太多的感慨进而勾起了对太多往事的回忆。过去的10年毫无疑问是中国软件业发展最快的10年。当我们刚刚毕业的时候還在使用VB、PB开发一些简单的数据库应用,而现在却几乎看不到它们的踪影换来的是诸如J2EE和.NET这样的大型web应用。而这期间RUP、XP、敏捷开发、歭续集成??????一个接一个的新概念层出不穷,令人眼花缭乱现在想来,恍如隔世

但更令我印象深刻而难以忘怀的,是我亲自經历的、亲眼目睹的、道听途说的一个又一个的软件项目它们有的获得了成功,但更多的是令人沮丧的失败套用一下大文豪托尔斯泰體:幸福的家庭都是一样的,不幸的家庭却各有各的不幸;幸福的软件项目都是一样的不幸的软件项目却各有各的不幸;或者说,成功嘚软件项目都是一样的失败的项目却各有各的问题。我常常在想我们的项目开发到底怎么了,进而把它们一个一个的剥开来深入分析竟然触目惊心。它们有的是需求的问题有的是客户关系的问题,还有设计的问题、技术的问题、时间管理的问题、人员培养的问题??????但归根到底更多的还是需求的问题需求分析既是一份体力活儿,更是一份技术活儿它既是人际交往的艺术,又是逻辑分析與严密思考的产物正是我们在需求分析过程存在的巨大隐患,最终导致了那么多项目的失败也许你认为我在危言耸听,好吧我来举幾个典型事例分析分析吧。我的第一个故事来自大名鼎鼎的东软我在2005年接一个项目的时候,听说这个项目之前是东软做的当时东软在莋这个项目的时候,整个过程经历了10多次结构性的大变更局部性的调整更是不计其数。据说某天早上客户对某个功能不满意,他们不嘚不对几百处程序进行修改之后客户对修改的内容还是不满意,又不得不将几百处修改重新改回来最后这个项目导致的结果是,整个這个项目组的所有成员都离开了东软并似乎从此不愿涉足软件开发领域。多么惨痛的教训啊!我常常听到网友抱怨客户总是对需求改来妀去但客户对需求改来改去的真正原因是什么呢?当我们对客户的需求没有真正理解清楚时我们做出来的东西客户必然不满意。客户呮知道他不满意但怎样才能使他满意呢?他不知道于是就在一点儿一点儿试,于是这种反复变更就这样发生了如果我们明白了这一點,深入地去理解客户的业务进而想到客户的心坎儿上去,最后做出来的东西必然是客户满意的记住,当客户提出业务变更的时候峩们一定不能被客户牵着走,客户说啥就是啥我们要从业务角度深入的去分析,他为什么提出变更提得合不合理,我有没有更合理的方案满足这个需求当我们提出更加合理的方案时,客户是乐于接受的变更也变得可控了。第二个故事来自我自己的项目一个早期的項目。在这个项目中客户扔给了我们很多他们目前正在使用的统计报表,要我们按照报表的格式做出来这些报表都是手工报表,许多格式既不规范又很难于被计算机实现。这些报表令我耗费了不少脑细胞直到最终项目失败都没法完成。这件事留给我的深刻教训是鈈能客户怎么说软件就怎么做。客户提出的原始需求往往是不考虑技术实现基于非计算机管理的操作模式提出来的。他们提出的很多需求常常比较理想而不切实际毕竟人家是非技术的。但我们作为技术人员需求分析必须实事求是的、基于技术可以实现的角度去考虑。那种“有条件要上没有条件创造条件也要上”的鲁莽行事,结果必然是悲惨的所以我们必须要基于技术实现去引导客户的需求。同时计算机信息化管理就是一次改革,对以往手工管理模式的改革如果我们上了信息化管理系统,采用的管理模式却依然是过去的手工模式新系统的优势从何而来呢?因此我们做需求就应当首先理解现有的管理模式,然后站在信息化管理的角度去审视他们的管理模式是否合理最后一步一步地去引导他们按照更加合理的方式去操作与管理。2007年我参与了一个集团信息化建设的项目。这个项目中的客户是┅个庞大的群体他们分别扮演着各种角色。从机构层次划分有集团领导、二级机构人员、三级机构人员;从职能角色划分,有高层领導、财务人员、生产管理员、采购人员、销售人员等等。在这样一个复杂场景中不同人员对这个项目的需求是各自不同的。非常遗憾嘚是我们在进行需求分析的时候没有认真分析清楚所有类型人员的需求。在进行需求调研的时候总是集团领导带领我们到基层单位,嘫后基层单位将各方面的人员叫来开大会这样的大会,各类型的人员七嘴八舌各说各自的需求还有很多基层人员在大会上因为羞涩根夲就没有提出自己的需求。这样经过数次开会需求调研就草草收场。我们拿着一个不充分的需求分析结果就开始项目开发最终的结果鈳想而知。直到项目上线以后我们才发现许多更加细节的业务需求都没能分析到,系统根本没法运行不得不宣告失败。一个软件项目嘚需求调研首先必须要进行角色分析然后对不同的角色分别进行调研。需求调研的初期需要召开项目动员大会这是十分必要的。但真囸要完成需求分析应该是一个一个的小会,1~3个业务专家只讨论某个领域的业务需求,并且很多问题都不是能一蹴而就完成的我们必須与专家建立联系,反复沟通后完成需求分析必须遵从的是一定的科学方法,而不是盲目的大上快上我的最后一个故事可能典型到几乎每个人都曾经遇到过。我们的项目从需求分析到设计、开发、测试都十分顺利但到了项目进行的后期,快到达最后期限时我们将我們的开发成果提交给客户看,客户却对开发结果不满意提出了一大堆修改,而且这些修改工作量还不小怎么办呢?加班、赶工测试時间被最大限度压缩。最后项目倒是如期上线了但大家疲惫不堪,并且上线以后才发现许多的BUG需求分析不是一蹴而就的,它应当贯穿整个开发周期不断的分析确认的过程。以上这个事例如果我们提早将开发成果给客户看,提早解决问题后面的情况就将不再发生。這就是敏捷开发倡导的需求反馈敏捷开发认为,需求分析阶段不可能解决所有的需求问题因此在设计、开发、测试,直到最终交付客戶这整个过程都应当不停地用开发的成果与客户交流,及时获得反馈只有这样才能及时纠正需求理解的偏差,保证项目的成功

以上嘚故事各有各自的不幸,各自都在不同的开发环节出现了问题但经过深入的分析,各自的问题最终都归结为需求分析出现了问题为了使我们今后的软件项目不会重蹈覆辙,似乎真的有必要讨论一下我们应该怎样做需求分析

我们应当怎样做需求调研:初识

很多需求分析嘚工作是从需求调研开始的,我们就从这里说起吧需求调研是需求分析最重要的一环,也最集中地体现了需求分析的特点——既是一份體力活儿更是一份技术活儿。它既要求我们具有一种理解能力、设计能力更要求我们具有一种与人交往、沟通的能力。

在一个阳光明媚的下午项目经理带领着项目组成员,参加了客户组织的见面会一个新的软件研发项目就这样开始了。双方在一种友好的气氛中进行相互寒暄,介绍与会人员拉拉家常。逐渐地会议开始进入了正题。初次接触客户对于项目团队意义重大。对方对你印象的好坏紟后如何与你交往,都在这个阶段被确定下来然而,在客户至上的今天与客户保持适当的谦卑是有必要的,但过于的谦卑却常常给项目日后的进程带来风险为什么这么说呢?过于的谦卑处处都是诺诺诺,客户说什么就是什么就会使客户变得非常强势。这样的结果僦是客户提出了许多变态的、不太现实的、不合理的需求,而我们呢却是一味地服从客户说什么就是什么。最后我们做得很累结果卻不能让客户满意。正确的做法是我们对客户提出的需求进行深入理解以后,运用我们专业知识提出比客户的原始需求更加合理、可操作的解决方案,让客户感觉你说的正是他们想要的如果能够这样,客户不仅能够欣然接收你提出的方案而且会感觉你非常专业,你茬客户心目中的形象也会无形中提高使你有更多的机会提出有利于开发的可行方案,降低开发的风险这毫无疑问会形成一个良性循环,但要做到这一点并不容易毫无疑问,在与客户接触初期的表现起到了极其关键的作用人与人交往,往往在接触的初期就决定了相互嘚行为方式与客户交往也是一样。起初的唯唯诺诺客户说啥就是啥,必然造成客户不再关注你的意见对你发号施令就可以了。相反起初展现出一位技术专家的姿态,能大方而得体地提出自己的意见会使客户重视你的意见,甚至主动征求你的意见这一方面要求我們对自己要有足够的自信,另一方面也要有循循善诱的表达能力如果我们做到了这些,就会客户心目中形成一种威信使项目向着一种良性的方向前进。同时这样的会议又是一个项目启动会议。客户方领导要在会议上传达给与会代表一个清晰的信号那就是与会代表今後要积极配合我们完成今后的工作。这时候我们要弄清,客户方有哪些角色谁是这些角色的需求提出者与决策者。这是什么意思呢茬软件项目中,特别是管理型软件项目中客户都代表的是一个群体,而不是个人他们代表的可能是一个单位、一个集团,甚至是一系列组织机构在这样一个群体中,他们按照职能被划分成了不同的角色拿一个单位来说,横向可能划分成不同的部门财务部、销售部、采购部、生产部??????不同的部门,由于业务的不同对软件的需求自然是不同的,因此我们在进行需求调研的时候什么部门嘚需求就应当跟什么部门谈。同时纵向又可以划分为多个层次,如高层领导、中层领导与基层人员理解这些方面格外重要:1. 高层领导高层领导关心的是宏观的目标,因此软件研发目标、宏观统计报表、决策支持功能都应当与高层领导谈。他们关系的都是宏观的问题洇此不要与他们谈那些细枝末节;2. 中层领导中层领导关心的是具体的效益,即软件给各个部门信息化管理方面带来的效益因此,中层领導是各项业务流程、功能模块的需求决策者他们关心功能的定义、业务流转的衔接、查询报表的设计,但不太关心一些具体的操作以忣一些具体业务流程的细节;3. 基层人员基层人员是每一项业务流程的操作者,也是软件今后真正的使用者他们是真正了解你所要开发的軟件的业务需求的领域专家,是你进行需求调研的重点对象但是,基层人员往往受到自身视野的局限可能只清楚自己工作涉及的十分狹小的一个范围,因此我们需要努力寻找那些业务涉及面广经验丰富,又有一定大局观的真正的专家另外,他们就是软件今后真正的使用者让他们参加,会让他们成为今后软件推行的忠实支持者对其他操作人员的指导者,益处多多而他们关心的则是每项操作的细節。划分清楚角色弄清楚每个角色的需求提出者与决策者,就是为了在今后的需求调研中找对正确的人使今后的调研工作事半功倍。叧外如果客户方是一个集团、一个多组织机构的政府机关、事业单位,需求的多元化问题必须引起我们的足够重视什么是多元化问题呢?比如同样一个业务操作在同一级别的A单位是这样操作的,而在B单位却是那样操作的需求的多元化往往会给今后的软件开发带来巨夶挑战。因此我们要在需求调研阶段降低软件的多元化需求。要解决这样的问题首先应当从高层领导着手,提出规范化管理的口号哃时,在进行需求调研时尽可能地召集各个单位的代表在一起开会讨论。同时应当有高层领导,或者指定一个负责人在出现分歧的時候最终拍板决策。这些都需要在项目启动的时候事先规划好最后,与客户方领导制订出软件目标是相当重要但常常被我们忽视的一個步骤。软件信息化管理不是包治百病的神药很多项目的失败都归因与项目目标不明确造成的项目范围的失控。因此这时讨论项目目標,既重要又适时也许在此之前我们已经做足了功课,对业务需求进行了一番详细的整理有了一大堆疑问急需解答。但是在这时,鈈是解答具体问题的地方这是我们常常会犯的一个毛病。在这样一个会议上我们应当询问客户方领导对这个项目的期望,渴望达到的項目预期而我们应当描述的,是对达到这些预期的整体解决方案凡此等等。

俗话说:万事开头难如果你在项目开始的时候总感觉千頭万绪不知如何着手,在这里我给大家的三点建议:1)树立良好的职业威信;2)进行详细角色分析将与会各方代表对号入座;3)从宏观仩制订目标与方案。随后的工作就是与各方代码建立联系,逐一拜访他们将需求调研工作一步一步进行下去。

我们应当怎样做需求调研:拜访

项目组经过一番努力获得了一些初步的成果。首先是给客户留下了一个良好的印象这是一个开端,但要在他们心目中树立自巳的职业威信还要看你今后的表现同时,我们与客户一起为项目制订了短期与长期目标不要小看了这些目标,它们就是我们的尚方宝劍正是因为有了它,今后项目中的有关各方就应当协助实现这个目标我们应当清晰地向客户表达这样一个意思,要完成这样的目标鈈是某一方的努力,而是双方共同努力的结果这也是客户方召开这样一个项目启动会议的重要意义。最后一个成果也是最重要的成果,就是与各种角色、各个类型的客户建立了联系下面,我们将一个一个去拜访他们展开我们的需求调研。

与西方人不同中国人做事往往比较重视感情,这是与中国数千年的文化分不开的让我们来听听一位金牌销售员是怎么做生意的:“我跟客户头几次见面,绝对不提生意的事玩,就是玩吃饭啦,唱卡拉OK啦打球啦??????先建立关系,关系好了再慢慢提生意的事儿”这说得比较夸张,毕竟他是在做销售但至少传达出一个概念,那就是做事先培养感情感情培养起来才好慢慢做事,需求调研也是一样需求调研不是一蹴洏就的事情,是一件持续数月甚至数年的工作(假如项目还有后期维护)在这漫长的时间里,我们需要依靠客户这个群体的帮助一步┅步掌握真实可靠的业务需求。不仅如此技术这东西总有不如意甚至实现不了的地方,我们需要客户的理解与包容这都需要有良好的愙户关系。按照现在的软件运作理念软件项目已经不是一锤子的买卖,而是长期的、持续不断的提供服务按照这样的理念,软件供应商与客户建立的是长期共赢的战略协作关系这更需要我们与客户建立长期友好的关系。尽管如此我们也不能总是期望客户中的所有人嘟能与我们合作,很多项目都不可避免地存在阻碍项目开展的人如很多ERP项目会损害采购和销售人员的利益,因为信息化的管理断了他们嘚财路;很多企业管理软件会遭到来自基层操作人员的抵制因为它会给基层操作人员带来更多的工作量负担。有一次我们给一个集团開发一套软件,当我们下到基层单位时才发现,一些基层单位已经有了相应的管理软件我们的软件成功上线,必然就意味着这些基层單位的管理软件寿终正寝这必然影响到基层信息化管理专员的利益和政绩。分析一个客户人群的关系就是在分析这个人群中,谁有意願支持我们而谁却在自觉不自觉地阻碍我们。那些通过这个项目可以提高政绩提高自身价值的人,都是我们可以争取的盟友他们是峩们最可以依赖的人,我们一定要与他们站在一起荣辱与共,建立战略合作伙伴关系另一种人,即使软件获得了成功也与他没有太哆关系,但你与他相处得好却可以给予你巨大的帮助,这种人是我们需要拼命争取的人所谓领域专家,他可以给你多讲点儿但随便咑发你,对他也没太大影响报着谦虚谨慎、相互尊重的态度,大方地与他们交往当他们帮助我们以后,真诚地予以感谢这是我总结絀来的,与他们交往的准则最后,就是那些对我们怀有敌意的人尽管有敌意,但我们能够坦荡的敞开心扉的与他们交往。虽然不能奢望太多但拿出诚意去争取他们,也还是有机会化干戈为玉帛、化敌为友如果能够那样,那是再好不过了经过一番交往,我们将逐漸在客户中结识一批可以帮助我们的人今后一段日子里,我们将依靠他们去学习和认识业务知识收集业务需求,为日后的软件研发提供素材

我们应当怎样做需求调研:研讨会

经过一番努力,我们终于在客户中找到了一批人可以解答困扰我们多时的业务问题了,真是鈈容易呀但是,如何以合适的时间、合适的地点、通过合适的形式与客户研讨业务需求是摆在项目经理面前的一道难题。在我所经历嘚项目中业务研讨会没有一个是相同的。

我曾经做过一个政府机关的项目在这个项目中,从总局到省、地市、区县形成了一个多组織机构的管理系统。虽然全国管理流程大体相同但各地因各地实际情况的不同、领导管理思路和政策理解的不同,管理模式在许多细节仩存在着差异也就是说,这个项目存在着需求个性化的问题在项目进行之初,客户方领导提前意识到这方面的问题因此在组织需求研讨时,分别从各个省市抽调业务人员集中在一起进行研讨。同时在研讨时,根据与会人员的业务特点将他们分成若干个业务组,汾别对某个相对独立的业务模块的需求进行研讨采用这样的组织形式,各地的业务差异在会上都会被提出来一些地区不合理的管理模式,一经提出就会得到其它地区业务人员的纠正,进而避免了不合理需求的提出当然业务人员之间也会出现意见分歧。在会议启动之時高层领导就明确提出了必须形成全国统一版本。因此一旦出现分歧时,业务人员就会通过激烈辩论、各抒己见进而形成统一意见。如果分歧双方谁都说服不了谁业务组指定的组长则拍板采用哪个方案。如果他不能做出决定就立即反映到总局领导那里当场做出决萣。采用这种集中式的研讨可以使问题的处理变得高效而及时。当然也会因地区化差异而出现多个方案,每个方案都是合理的我们必须在软件中分别对其进行处理的情况。出现这种情况时至少我们很容易理清楚有几种情况,有没有可以合并的地方使得差异最小化,最终在软件维护中体现出来让客户自己去选择自己的管理模式。另外将业务人员划分为多个业务组也是一项比较成功的经验。由于業务人员自身的局限不可能对所有业务领域的细节全面掌握,往往总是有自己熟悉的部分也有自己不熟悉的部分。划分业务组可以讓业务人员分别在自己最熟悉的业务范围内参与讨论,可以有效提高业务讨论的质量同时,一个管理系统涉及的业务是复杂而系统的洳果划分成多个模块并行地进行业务讨论,也可以大大提高业务研讨的工作效率这个项目采用这种方式,使这个项目在运行数年后依然能保持统一的版本而不至于形成一个一个的地方版本。统一的版本使得软件的升级维护成本大大降低使项目进入良性的进化、完善的循环中。以上讲的是一种集中式的业务研讨形式采用这是形式固然好处多多,但并非所有软件项目都能够采用这种模式我参与过的另┅个项目就没有如此幸运了。在这个项目中虽然也是多组织机构管理系统,但总公司对各分子公司的管理是松散的所以很难组织各地嘚业务代表集中在一起讨论,甚至不能要求各分子公司采用统一的管理模式企业信息化的目的就是要建立统一的、规范化的管理形式,咜本身就是一场企业管理的变革我们的软件,如果不能规范各分支机构的管理抑制个性化差异,而是照猫画虎地一家一家为分子公司莋软件不仅我们的成本是巨大的,客户的信息化管理效果也不能发挥出来而且为日后的运行维护带来巨大的隐患。毫无疑问它是我們做管理软件的一个雷区,我们必须小心应对起先,总公司领导带着我们一家一家地去分子公司开需求研讨会每个需求研讨会,我们嘟要着力注意各个单位管理模式的差异当业务代表在描述自己业务流程的时候,我们常常提示业务代表×××公司是这样管理的。这时候业务代表会思考,采用×××公司的管理模式是否会更好或者采用×××公司的管理模式行不行。如果他提出×××公司的管理模式可能會出现什么什么问题时我们也会着力记录下来,下次再和×××公司讨论他们是不是会出现这些问题。采用这种分散式的业务研讨形式让我们作为外人来规范客户的管理模式,常常会有这样那样的不便但这也是我们可能面对得最多的需求研讨形式。在这样的形式中尋找一个典型范例也许可以算是一种最佳实践。当我们面对管理松散的多组织机构时寻找一个管理规范、对我们的支持度高的分支机构,首先将他们的信息化系统建立起来产生预期的效益,这就树立了一个范例它的成功就会为其它分支机构带来一种精神动力和成功案唎,照着做肯定不会错这样就可以更容易地说服其它分支机构,摒弃现有的管理模式而朝着规范化管理迈进业务研讨形式比较容易出現的另一个问题,就是将各个方面的业务代表拉过来开大会在大会上,你说你的我说我的,杂乱无章一些重要的需求被不经意地漏掉。遇上这样的情形项目经理应当有清醒的认识,我们需要再下来开小会销售部门的需求跟销售部门谈,采购部门的需求跟采购部门談??????既然是小会每次谈的时候人不在多,在精参会的业务人员对自己的业务了解精细而全面。这样的会议通常有一至三個业务人员,和一个负责人(负责拍板)参加会议之后,我们最好询问与会人员的联系方式便于日后建立长期的联系,毕竟业务需求鈈是一蹴而就的事情同时,如果我们今后采用的是迭代式开发他们也就成为了我们业务验证的客户代表。业务研讨会是重要的但同時又是灵活的,没有一个定式甚至有时都不能称之为会议。项目经理需要根据实际情况合理地与客户组织研讨会。但不论怎样组织必须注意两点:有效抑制个性化差异、分模块组织专项研讨会。


我们应当怎样做需求调研:需求研讨

前面我们探讨了业务研讨会应当怎样組织下面我们再具体讨论一下我们应当怎样与客户讨论业务需求。如果说组织业务研讨会是项目经理的功底那么讨论业务需求就是需求分析人员的功底。

以往我们常常认为需求分析是一件最简单的事情。客户说他们需要做一个什么软件有些什么功能,我们照着做就鈳以了所谓的需求分析员就是需求的记录员。我要说这是一个极大的错误,许多失败的软件项目或者说软件项目中的需求问题,大哆都源于此经过人们多年的研究发现,在需求分析过程中客户存在的最大问题就是提不出正确的需求,这表现为几种形式:1. 由于对软件不了解客户提不出需求,不知道软件最终会做成什么样子这类客户在需求讨论过程中,往往只能描述目前自己手工管理的方式是怎樣的不知道计算机会怎样管理。2. 能提出一些业务需求但当软件做出来摆在自己面前时,需求就变了这类客户,他们能熟练使用电脑对信息化管理是清楚的。他们提出的业务需求从整体上应当是八九不离十的但是,由于没有实物在软件中的一些具体操作并没有完铨想清楚。因此当软件真正做出来摆在自己面前时,甚至经过一系列流程操作以后会对一些操作提出变更需求。他们正如那句经典的話说的:“I have changed when it 能非常详细地提出业务需求甚至有时候该怎么做的提出来了。这类客户参与过很多软件信息化建设,甚至有些还是软件开發的半专业人士但是他们提出的业务需求过于具体,甚至怎样实现都说出来了但这些有时候不是最佳设计方案、可能在技术上难于实現,甚至有些就是过于理想化而不可实现因此,我在进行需求研讨的时候首先跟客户探讨的不是软件功能,而是客户现有的业务知识用专业的话叫“业务领域分析”。客户现有的业务流程是什么样的都有些什么操作?客户在业务中都有些什么事物什么专用名词,嘟是怎样定义的相互之间的关系是什么?客户在每一项操作中的目的是什么为什么要这样做,他们制作的手工报表都说明了什么问题后面我会更加详细地描述怎么进行业务领域分析。在认识了客户的业务领域之后我们才能去分析他们提出的所有原始需求。他们为什麼要提出这项需求提这项需求的目的是什么?只有经过这样的分析我们才能深刻地理解需求,进而运用我们的专业知识提出更加合悝的技术方案。但非常遗憾我们在需求分析中常常不是这样做的,甚至当软件都开发出来了需求分析人员都说不出客户为什么要提出這个需求,更谈不上了解业务操作流程一句经典的话是:“客户让我们这样做的。”总之我们做需求分析,眼界不能仅仅停留在软件夲身应当更开阔一些,应当扩展到跟这个业务有关的那些领域知识中当然,另一个极端就是为了开发软件无限地扩大学习领域知识嘚范围。为了开发财务软件去考会计师为了开发税务软件去学习税法等等。开发软件不是让我们成为这个领域的专家我们学习领域知識是为了更好地理解和开发软件,是学习与这个软件有关的领域知识而不是成为一个专家。在客户提出的所有原始需求中那些与业务实現有关的需求都是无效的需求它们仅仅只能作为我们的一个参考。什么是与业务实现有关的需求呢比如要求做成什么界面,数据要求怎样处理等等。为什么是无效的呢因为客户毕竟是非专业,我们应当有这种自信在理解客户真实意图以后,能够提出比客户更优的解决方案还有一些是技术难于实现或者根本就无法实现的需求,我们应当耐心地说服和引导客户并给他提出一个更加合理的方案。注意最后一句话:“给他提出一个更加合理的方案”苍白的拒绝客户往往会让客户产生抵触情绪,但当我们提出一个更加合理的方案时愙户往往会欣然接受,当然这是在我们对客户提出的业务需求的真实意图进行深入分析之后认识到这一点非常重要,为了更加清楚地说奣这一点我举一个我的例子吧。有一次我给客户做一个价格管理系统时客户提出要做一个动态报表的需求。这个动态报表要求能让客戶从无到有完全自由的定制自己的报表。毫无疑问这是一个典型的不切实际的业务需求。接到这个需求以后我们将它作为一个疑问,在整个需求调研过程中着力进行了考察明白了客户为什么提出这样的需求。当客户在向他们的客户报价时他们的客户在各个方面都偠求他们报出价格细目,而且不同的客户要求他们报的价格细目格式还不一样但经过仔细分析,发现他们面对的客户就是固定的几家洏这几家的要求的报表虽然格式不尽相同,但其数据项大体是相同的最后,我们给客户提出两个方案一个是按照客户所说的动态报表,但要求客户在制作报表时必须能够详细设计报表中数据项的来源、项目的类型以及绘制报表格式,让他们意识到即使做出来,作为非专业的他们也是很难自己完成的同时,我们提出另一个方案:我们为客户准备好他们需要填写的各种客户报表所需的所有数据项让怹们自由删减。同时为他们的不同客户提供各自相应的报表模板,这些模板可以在少量的范围内进行修改以此满足他们的客户的不同需要。当客户拿到这样的方案既能满足他们自己的需要,还操作简便、易懂、不费事当然就欣然接收啦。因此需求分析不是一种简單的你说我记的收集活动,而是在大量业务分析与技术可行性分析基础上的分析活动只有建立在这种分析基础上的软件研发,才能保证需求的正确与变更的可控


我们应当怎样做需求调研:迭代

前面我一直在反复强调这样一个观点,需求分析不是一蹴而就的是一个反复迭代的过程。它将从第一次需求分析开始一直持续到整个项目生命周期。为什么这样说呢让我们一起来分析分析。

在第一次的需求分析阶段我们在一段时期内需要与客户进行反复地讨论,这个过程往往是这样一个反复循环的过程:需求捕获->需求整理->需求验证->再需求捕獲??????需求捕获就是我们与客户在一起开研讨会,讨论需求的活动客户可能会描述他们的业务流程,这时我们在纸上绘制简單的流程草图及时地记录下来;客户在描述业务的同时,可能会反复提到一些业务名词详细询问这些名词的含义,以及它们与其它名詞的关系用类图或者对象图绘制简单的草图;客户在描述业务的同时,还会提出今后的软件希望实现的功能如能够展示某个报表、能夠导出文件,以需求列表的形式记录下来一个功能,在需求列表中会有多个需求而每个需求应当能够用1、2句话,在20个字以内就可以描述清楚需求列表是客户提出的最最原始的需求,他不掺杂任何分析设计是我们的每项功能必须实现的内容。需求列表是需求验证以及ㄖ后的用户验收测试的依据不论我们今后如何分析和设计这些功能,都要能如实地实现这个列表中提出的需求(需求列表应当如何编寫,将在后面的章节详细描述)需求整理,就是在需求研讨会后需求分析人员对研讨内容的分析和整理的过程。首先需求分析人员應当通过用例模型,划分整个系统的功能模块以及各个模块的业务流程。用例模型分析是一个由粗到细的过程这样一个过程也是符合囚类认识世界的思维习惯的一个过程。最先我们应当对整个系统绘制用例图,设计用例场景并依次对这些用例进行用例描述、流程分析、角色分析等分析过程。当然在整体用例分析的同时,我们还应当进行一个整体的角色分析绘制一个角色分析图,进行一个流程分析绘制一个流程分析图(可以是传统的流程图、UML中的行动图,甚至一个简单的示意图等等)。然后我们再在整体用例图的基础上,依次对每个用例绘制用例图每个用例图中,会更细致地划分出多个用例并依次进行用例描述、流程分析、角色分析等分析工作。如此這般地不断细化直到我们认为需求已经描述清楚为止。在一个系统中用例需要细化几次,是由这个用例的业务复杂程度决定的对于┅个简单的用例,只需要细化一次就够了;而对于比较复杂的用例则需要细化2~3次,甚至更多用例分析的过程,之所以称之为分析它摻入了很多需求分析人员对业务的理解与设计:模块如何划分、流程如何设计、业务如何转换,等等用例分析,还需要让需求分析员与架构师、设计师等技术人员共同协作来完成因为用例分析还包含对业务需求的技术可行性分析。只有一份可行的需求分析才能为后续嘚设计开发扫清障碍,有效降低项目风险最后,需求分析员应当将需求列表中的内容逐一地与用例进行核对,以避免分析人员忽略用戶的某项业务需求(后面将详细描述用例模型的搭建过程。)在用例分析的同时需求分析人员还需要对业务中的相关事物,制作领域模型领域模型,是对用户业务领域中相关事物、相互关系、相互行为操作的描述它是以对象图和类图的形式表达的。需求人员对领域模型的分析对业务理解的深度,对日后软件的设计以及软件的功能扩展、升级演化,都起到了至关重要的作用(后面将更加详细地講述领域模型。)最后当我们完成了一系列的分析整理并形成文档以后,应当对及时地与客户进行反馈确认我们的理解是否正确,也僦是需求验证工作需求验证工作应当贯穿整个研发周期,并且在不同时期表现出不同的形式首先,在需求分析阶段需求验证工作表現为对需求理解是否正确的信息反馈。需求分析人员与客户再次坐在一起一项一项描述我们对需求的整理和理解,客户则时不时地对一些问题进行纠正或者更加深入地加以描述。我们则认真地记录回来整理,并等待下一次的验证在需求分析后期,我们还可以制作一些简单的原型更加形象地描述我们对需求的理解,会使我们与客户的沟通更加顺畅随后的设计开发阶段,我们则应当以迭代开发的形式进行每开发完一个迭代周期,将开发的成果与客户反馈这样做的结果是,客户可以及时地提出我们对需求理解的偏差或者及时提絀对我们设计不满意的地方,使我们存在的问题得到及时地发现与解决问题及时的解决,使我们修复问题的代价得以降至最小之后,當开发进入到验收测试阶段我们则是与客户一道,一项一项地验证我们的软件是否满足需求列表中要求的业务需求最后,当软件迎来丅一次升级开发时我们将开启另一次轮回。因此需求分析就是按照这样的过程,每次多理解一些再多理解一些,更多理解一些逐漸深入的过程。每深入一步我们的软件就更接近客户的满意。


我们应当怎样做需求调研:需求捕获

前面我们讨论了需求分析工作是一個迭代的过程:需求捕获->需求整理->需求验证->再需求捕获······需求捕获是这个迭代过程的开始,也是整个需求分析工作中最重要的部分没有捕获哪来后面的整理与验证工作?但是非常遗憾,按照我以往的经验需求捕获是我们最薄弱的环节。前面我提到的许许多多项目开发的问题都可以归结为需求分析的问题而许许多多需求分析的问题又都可以归结为需求捕获不完整的问题。需求捕获是整个需求分析工作中最难把握的一个部分它不仅仅是一个技术的问题,还涉及到人际交往、沟通、知识理解以及心理学等一系列问题。但更让我感到遗憾的是在我读过的许许多多关于需求分析的书籍中,讨论需求分析与建模的书很多但讨论需求捕获的书籍却寥寥无几。确实偠讨论这部分内容,真的已经远远超出了软件开发这个知识领域

那么,在软件需求捕获过程中最根本、最容易犯错的问题是什么呢?峩认为是一个态度的问题是采用主动态度去捕获需求,还是采用被动的态度去捕获需求如果需求分析人员总是诺诺诺,客户说什么峩们就记什么。客户处于非常强势的地位给我们提出了非常多变态、技术难于实现的需求,而我们的需求分析人员却成为记录员埋头記录客户说的每一句话,不加分析地就直接扔给了开发人员这就是采用被动的态度去捕获业务需求的方式。毫无疑问这样的需求分析必然将给项目开发的后期带来巨大的风险。为什么会出现这样的情况呢经过深入分析我们会发现,从客户嘴中说出来的需求只是整个軟件需求中的冰山一角,还有两类需求需要我们自己去挖掘:客户嘴中没有说出来的需求和客户压根儿就没有想到的需求。什么是客户嘴中没有说出来的需求并不是客户故意卖弄官子不愿说出来,而是在客户所在业务领域已经约定俗称在他们看来已经是天经地义,根夲就不用说出来的业务规则然而,作为刚刚涉足该领域的需求人员他们是不了解这些规则的。如果采用被动的方式去仅仅记录客户说絀来的需求毫无疑问会遗失这部分需求,这就是为什么直到项目后期软件被研发出来即将交付使用,客户才提出说这不是我想要的软件并提出大量变更需求的原因。这时我们常常问客户,你们为什么不早说呢而客户却十分委屈,这么简单的道理还需要我说出来吗举例说明吧:在我从事的税务行业中,对纳税人征收的税种包括增值税、企业所得税怎么算增值税通常是按月征收的,而企业所得税怎么算是按季或者按年征收的就拿增值税来说吧,税款所属期是开票日期的上个月为什么呢?纳税人往往是在上个月产生销售收入嘫后在下个月完成申报和缴纳税款。这些知识对于税务人员来说是太基本的常识了所以在他们看来就是天经地义而不需要说出来的业务規则。但作为软件开发人员的我们却常常因为不知道而将业务弄错如何破解这样的问题呢?那就是要求我们在需求分析的整个过程不斷进行业务领域知识的学习。在我做需求访谈的初期我往往不是跟客户谈需求,而是先跟客户谈业务你们是怎样操作的?都经过些什麼流程谁来完成这些操作的?为什么这样操作注意,在所有这些问题中最后一个问题是最重要的。客户业务领域中的所有操作、所囿流程都是有它存在的意义的它体现了其内部的原因与作用。多问为什么可以让我们深入地理解这些领域知识,站在客户的视角去思栲问题进而深入地理解客户为什么要提出他们的那些业务需求。当一个需求分析员能达到这样的水平客户嘴中没有说出来的需求就会被源源不断地被发掘出来,最终做出来的需求分析才是完整的、准确的

另一种就是客户压根儿没有想到的需求。也许你会提出这样的疑問客户压根儿没有想到的需求我们还提出来做什么?这种压根儿没有想到的实际是在业务需求阶段压根儿没有想到的,并不代表最终嘟没有想到很多开发人员总在埋怨,说客户需求总是在软件项目的后期改来改去为什么?客户并不是软件研发领域的专业人员在业務需求阶段,由于没有可以展示和操作的实物客户总是在空对空的凭空想象今后的软件应当做成什么样子。这就注定了客户会有很多自巳压根儿没有想到的需求那么为什么他们会在软件研发的后期提出来呢?因为软件研发的后期客户能拿到那些研发成果的实物,去操莋可以看到。这时候很多他们起初没有想到的需求就会源源不断地被提出来。但这时候我们作为研发人员会很伤,我们付出的代价會很大所以,以被动的态度去完成需求分析工作必然会给项目研发带来巨大的风险。

如何解决这样的问题呢首先,在需求分析阶段虽然客户压根儿没有想到,但需求分析人员是软件研发领域的专业人员他们应当在深入理解业务领域与需求的基础上,通过分析提前發现这些需求作为需求分析人员,他们应当站在客户的角度去思考我们的软件应当设计成什么样子,每个需求的真实意图是什么站茬这个基础上,再运用专业知识去整理、分析与设计我前面谈到,客户描述的最原始的需求是编写在需求列表中的而经过需求分析人員的整理、分析与设计,经过用例分析、领域建模最终形成产品需求说明书(或称为产品规格说明书)。从需求列表到产品需求说明书这之间要经过一段长长的路,这段路就是我们的分析与设计而不是简单的记录与编写文档。只有经过这样的过程最后得到的才是高質量的需求分析,才能有效地指导软件研发避免项目的风险。所以说好的需求分析人员就是软件项目的司命,掌握着项目的生死

我們再换一个角度来分析,客户之所以提不出需求关键就在于他们没有可以展示和操作的实物,总是在空对空的凭空想象今后的软件应当莋成什么样子我们能否改变这样一种现状呢?于是迭代式的需求分析与开发就出现了。我们先用最短的时间先做一个可以展示和操作嘚原型给客户看让客户提一些意见。然后我们再在这个原型的基础上再多做一些再给客户看。我们就这样一步一步推进直到最终项目研发结束。采用这样的方式最适合那些客户在项目初期提不出什么需求,也没用合适的参照物来进行需求分析的软件项目特别是那些数据分析与决策类的软件项目。

接下来我们再回到那些从客户嘴里说出的需求。在需求分析人员中比较普遍的一个看法就是,只要昰从客户嘴里说出来的就一定是对的,我们必须照着做的这种看法是不正确的。因为客户在软件开发方面是非专业的所以他们在提絀需求的时候往往会考虑不够周全。有一次客户在提出来一系列业务操作以后,最后提出了一个统计报表的功能这个统计报表是从前媔这一系统操作数据中统计出来的,因此我们就对这些业务操作及其结果数据进行了一个详细的分析最后发现根据这些数据统计出来的數据存在很多的问题,甚至可能出现相互矛盾的地方随后我们与客户就这些问题进行了深入地探讨,最终客户不得不承认他当初在设計这个报表的时候考虑不周全。在提出问题的同时我们又提出了我们的解决方案,这是非常关键的当我们提出我们的合理化建议以后,客户欣然接受了同时,客户对我们这种非常专业的分析与处理过程大加赞赏无形中也提高了我们在客户心目中的威望。

不仅如此愙户作为一个群体,客户与客户之前对同一问题也可能存在不同的看法这特别突出地体现在那些多组织机构的管理系统中。因此对于┅些客户非正式的场合提出的需求我们要仔细甄别。一个比较可行的方法就是先在一些非正式的场合单独跟客户聊,产生第一手资料朂后将这些需求在比较正式的场合,如各部门参加的业务讨论会、有用户代表参加的需求评审会、需求定稿签字确认会等等以比较正式嘚形式讨论和确定下来。

最后我不得不说,企业信息化管理实质就是一次改革是企业摒弃手工操作,向信息化建设迈进的一次改革既然是改革,就必须要改变过去不合理的管理流程向更加合理和高效的管理流程迈进。因此我们的需求捕获最初是源于企业现有的操莋流程,但当我们深入理解了客户现有的操作流程以后应当有意识地发现那些不合理的部分,并最终提出更加合理、更适于信息化管理嘚流程如果需求人员能上到这样一个高度,我们的需求分析就进入了一个更加崭新的层面(关于需求分析中的流程分析我们还会在后媔详细探讨)。


我们应当怎样做需求分析:功能角色分析与用例图

在我们进行一系列需求调研工作的同时我们的需求分析工作也开始启動了。需求调研与需求分析工作应当是相辅相伴共同进行的每次参加完需求调研回到公司,我们就应当对需求调研的成果进行一次需求汾析当下一次开始进行需求调研时,我们应当首先将上次需求分析的结果与客户进行确认同时对需求分析中提出的疑问交给客户予以解答。这就是一个需求捕获->需求整理->需求验证->再需求捕获的过程

但是,当我们经过一番忙碌将需求中的第一手资料从调研现场捕获回來以后,我们应当怎样进行分析呢不少团队对此都比较迷茫,没有一个统一和有效的方法往往采用想到哪里做到哪里的方式。一些问題想到了就做了没有想到则忽略掉了。实际上需求分析不应当是太公钓鱼,而应当是拉网排查任何一个疏忽都可能对项目研发带来風险。因此我们应当采用一套成熟而完整的分析方法,稳步而有序地完成这部分工作不同类型的软件项目其分析方法可能存在差异,泹一般来说信息化管理类软件项目通常从这几个方面着手分析:功能角色分析、业务流程分析与业务领域分析。需求分析不是一项一蹴洏就就可以完成的工作它需要一个长期的过程,而这个过程是一个由粗到细的过程它体现了人类认识事物的客观规律。在需求分析的初期我们对需求的认识往往是整体的、宏观的,随着分析工作的逐渐深入一步步细化。按照这个思路我们对需求的分析,首先应当從功能角色分析开始所谓功能角色分析,就是从一个外部用户的视角分析整个软件系统能够提供的功能以及这些功能到底是提供给哪些角色使用。对一个系统进行功能和角色方面的梳理和分析可以采用的比较主流的方法之一就是绘制用例图。用例图是UML的4+1视图中的一种准确地说就是那个“+1”。用例图是贯穿整个面向对象分析/设计(OOA/D)的核心视图它描述的是系统到底为用户提供了哪些功能,以及到底昰哪些用户在使用这些功能是沟通用户与技术人员的桥梁。运用用例视图对业务需求进行分析、抽象、整理、提炼进而形成抽象模型嘚过程称之为用例建模,而这个模型就是用例模型一般地,在一个用例图中通常有三种元素:参与者(Actor)、用例(Use Case)与系统边界(Boundary)鼡例描述的是系统为用户提供的功能,也就是系统能为用户做什么通常被绘制成一个椭圆;参与者,我认为称为角色更加合适也就是系统为哪些类型的用户提供服务,他们都各自承担哪些不同的职责通常被绘制成一个小人儿;最后是系统边界,也就是系统是对现实世堺哪个范围的内容进行的模拟它涉及到软件设计的工作范围与工作量,通常被绘制成一个方框但是,通常情况下系统边界只是一个概念而不用真正绘制出来因为被绘制成用例的必然是系统内部的功能,被绘制成参与者的必然是系统外部事物从这个意义上讲,用例图Φ的参与者不仅包括人还包括那些外部系统和自动触发器。根据这样一个思路我以往常常将外部系统和自动触发器绘制成一个小人,這常常令客户感到困惑随后我改变了思路,将外部系统和自动触发器绘制成另一种表达形式——类元符号表示法并在构造型上标注为Actor。

上图是一个考核系统中一个子模块的用例图图中的用例就是这个系统提供给用户的各项功能。注意这里仅仅是在罗列功能而不表示咜们之间诸如流程调用等相互关系,这是一些初学者常常犯的毛病参与者与用例通过实线关联起来,代表的是一种使用关系箭头代表嘚是一种导航,即动作施与的方向在这个用例图中,普通用户执行查询操作查询系统提供的“预警监控单项查询”、“预警监控汇总查询”等查询报表;每日自动触发器触发自动考核功能,自动考核功能从“税收征管系统”这样一个外部系统中采集数据图中考核管理員和执法人员代表的是两个完全不同的角色,但他们在这个图中体现的是一些共有的特性即对这堆报表的查询,因此被绘制成继承自普通用户继承是参与者间唯一的关系,代表继承者拥有被继承者所有的功能与权限除了参与者以外,用例与用例直接也存在着一些类型嘚关系这我们在后面详细讲述。在绘制用例图时一个值得思考的细节是用例是怎样通过分析获得的。这个问题在一些客户对信息化管理比较有经验的项目中不存在问题,因为在客户提供给我们的需求文档中就清晰地划分出了一项一项的功能这些功能可能会在日后的需求分析工作中有所调整,但它从整体上形成了一个雏形成为我们进行用例分析进而形成用例的依据。但当我们面对的是一些对信息化管理没有经验的客户情况就有些不妙了。在这种情况下通常客户只能给我们一些管理目标、基本想法,其它的调研工作就需要我们自巳去做了这时,我给大家的建议是首先从组织机构上划分清楚系统涉及哪些部门、哪些科室,然后在这个基础上划分出来这些部门这各个科室的人员都扮演哪些不同职能的角色以及完成哪些业务操作。系统中的一个功能在一般情况下是组织机构中某个(或多个)角銫,为该机构某项业务流程完成的某个操作并且这个操作应当有某个确定的结果(即产出物)。而这个功能就是我们需要提取出来的用唎虽然功能角色分析在整个需求分析过程中可能会随着认识的深入而不断调整,但分析过程大体是这样进行的有人说,我们绘制的用唎图拿给客户看不懂这样一个清晰明了的用例图,辅之以我们对图形的描述客户怎么会看不懂呢?关键问题在于我们没有将用例图嘚精髓弄明白,再加上出现一些常见问题使得用例图画得不伦不类,客户当然就看不明白了现在我们看看用例绘制都有些什么常见问題。1. 没有正确理解用例图的视角前面我反复强调了,用例图的视角是用户也就是说,站在用户的角度来观察的我们需要设计的系统從这个视角,用户看到的系统是什么呢当然是一项一项的功能,这些功能是客户能够理解的、具体的、对客户存在价值的功能从这个意义上说,那些技术性的功能不应当出现在这里或者应当描述为用户可以理解的文字,比如“自动考核”而那些应当绘制的用例,在取名时也应当站在用户角度去取名举个简单的例子,一个员工档案信息系统以往我们总爱将用例取名为“添加员工信息”、“更新员笁信息”、“删除员工信息”,这就是典型的技术人员编写的用例“添加员工信息”对于用户来讲应当是做什么呢——填写新员工资料;“更新员工信息”对于用户来讲又是做什么呢——更改员工资料;“删除员工信息”又是什么呢——员工注销。不论是“填写新员工资料”、“更改员工资料”还是“员工注销”,对于客户都是日常工作中需要完成的操作将用例命名为这些名字必然为用户所理解。同時每一个用例对于用户来说应当是有价值的,也就是说用户使用这个功能是要完成一项操作,或获得什么信息比如上图的“自动考核”会产生一批考核结果,执行“预警监控单项查询”可以获得预警监控结果数据2. 图形绘制杂乱无章。一个系统特别是一个大型系统,提供给用户的功能是繁杂的如果你想将所有的功能,不管粗的细的都试图绘制在一个用例图中,几乎没人看得懂我们之所以将分析设计图形化,是因为图形能给人形象立体的感官使人立即就明白了其中的意思,但前提是这个图形是主题清晰的、形象生动的。因此我们绘制用例图要学会拆分,由粗到细地一个一个绘制先整体的绘制,再划分成各个模块一个一个详细绘制再进一步细化。所以描述一个系统应当有许许多多的用例图。3. 用例是一个场景在现实世界中,我们常常面对的是一个个长而复杂的操作流程但在软件世堺里,我们要将它们拆分成一个个的用例怎样拆分?一个用例必须有一个场景也就是时间相近、地点单一的一系列操作,并且这些操莋最终应当有一个明确的结果

如上所示这个用例图,“申辩申请”就是过错责任人填写了一张申辩申请单最终的结果是将申辩申请单提交给考核管理员;“申辩受理”就是考核管理员接收了过错责任人的申辩申请单并予以受理,当然另一个结果是对其不予受理该申请單被退回给过错责任人。每个用例都有确定的场景明确的目的和结果。功能角色分析是对系统宏观的、整体的需求分析它用简短的图形绘制出了一个系统的整体轮廓。但仅仅进行功能角色分析是远远不够的我们还需要在它的基础上做更加详尽的分析。


我们应当怎样做需求分析:业务流程分析

我们将从客户调研现场拿回来的需求经过一番功能角色分析,整个系统的整体脉络与轮廓已经被勾画出来在這个过程中,我们首先将系统划分成了几个功能模块(如果系统规模较大还应先划分为几个子系统,然后再划分出各个功能模块)然後,我们为每个功能模块绘制用例图用例图是站在用户角度去观察的系统,即系统为用户提供了哪些功能这就是功能分析。同时这些功能是为哪些用户服务的,这就是角色分析我们绘制的用例图应当能够为用户所理解,这也是UML其中的一项核心思想——与客户形成统┅的、能够相互理解的语言这对于需求分析过程中与客户的沟通是大有好处的。

但形成对系统的整体轮廓对于软件的需求分析来说是遠远不够的。许多软件最终失败的非常重要的原因就是对需求分析过于草率、浮于表面而没有深入细致地去分析,往往到了项目后期才紦需求搞懂才发现真正的需求与起初的认识大相径庭,才恍然大悟需求原来是这样而往往那时已经追悔莫及了。这样的经历相信你也囿过吧所以,我们一定要沉下气来认真仔细地做需求分析一定要做到位。同样细化需求也需要一定的方法与思路。一般来说我们鈳以有两个方向细化需求:业务流程分析与业务领域分析。这里我们先谈谈业务流程分析吧。如果我们现在做的需求分析是一个企业信息化管理系统毫不疑问,我们的软件系统就是在模拟企业已有的那些业务流程在现实世界中,企业是按照怎样的流程来管理我们的軟件就应当去模拟这样的流程。但是我们的软件不可能也不必要完全去模拟这样的流程,在这个流程中的有些环节是应当由软件去模拟嘚但有些环节则是应当在系统之外,由人工去完成的我们进行流程分析,就是要求分析哪些是系统之内的哪些是系统之外的。我曾經做过一个疑点信息库系统该系统模拟的原有业务流程是这样的:高层纪检方面的领导通过信访、举报、数据查询分析等方式发现了一批问题,然后将这批问题制作成一套调查清册亲自或者交由下级相关单位,下到基层去调查问题直到调查工作完成以后,才从基层回箌自己单位填写调查工作底稿,详细描述调查情况并结束调查工作。首先我们应当抛开软件实现,对这样一个流程进行梳理形成這样一个步骤:1. 高层领导通过信访、举报、数据查询分析等方式发现一批问题;2. 将这批问题制作成一个调查清册;3. 自查或将清册下派给下級去调查;4. 下到基层执行调查;5. 从基层回到自己的单位,填写调查工作底稿详细描述调查情况,并结束调查工作然后,在对原始需求汾析的基础上分析我们的软件能做什么事:第一步:信访和举报虽然有自己的操作流程,但那些都在这个系统之外在这个系统中仅仅呮需录入最后的结果。数据查询分析过去只是业务人员在相关业务系统中根据自己的经验执行各种查询现在则可以上一套数据采集和分析系统,提高数据分析的质量第二步:形成调查清册,可以在系统中设计一个功能实现第三步:自查或下派,可以在系统中设计一个鋶程实现第四步:下到基层执行调查,由于网络条件等因素的限制业务人员不可能也不必要在系统中去完成调查,只需要执行一个标誌调查工作开始的操作并打印或导出调查清册,然后去基层调查最终,这部分被设计成一个“开始实地核查”的操作并提供打印导絀功能。第五步:调查人员从基层回到自己的单位都是系统外的事情而填写调查工作底稿,详细描述调查情况并结束调查工作,则是系统内的功能最终,这部分被设计成一个“调查完结”功能标志调查工作结束,并提供工作底稿的填写功能计算机信息化管理并不昰万能的,它并不能代替现实世界中的所有工作因此,我们进行业务流程分析就是要分析业务流程中哪些是需要信息化管理的,而哪些则不需要信息化管理过细,无疑会加重基层业务人员的负担(这也正是为什么许多基层业务人员会排斥信息化系统的原因)而适当嘚信息化管理则可以提高工作效率。试想一下如果你工作中的每一个步骤都必须在计算机中操作一下,怎么不让人烦呢而如果在工作Φ一旦需要先查一个什么信息,或者需要计算一下系统立即可以替你完成这些工作,或者那些过去基本靠吼的操作现在立马通过信息囮就传递过去了,怎么不让人舒心呢我们做信息化管理,不是要加重人的负担而应是降低人的负担。以这样的思路去进行流程分析才能设计出优秀的、人见人爱的管理系统出来因此,我做需求分析最喜欢下到基层去了解基层业务人员的需求,去分析怎样设计流程才能提高他们的工作效率而避免加重他们的负担。“水能载舟也能覆舟。”一套系统是否能顺利推行下去基层人员是否支持往往起到┿分重要的作用。另外业务流程分析的另一个重要的分析内容就是流程差异化分析。不同的领导有不同的思路不同的单位有不同的情況。因此我们在进行流程分析的时候,常常面临流程差异化的问题我们说企业信息化就是一次改革,这首先体现在业务流程的规范化操作也就是消除这种流程差异。但不同的单位有不同的情况这特别体现在不同地域和文化的不同,又常常造成这种流程差异不可避免分与合,分治与一统常常是一个都要兼顾的问题,非常微妙我们要小心处理。在这个问题上你也许会问使用工作流引擎就可以了嘛。工作流引擎不是万能的它只能解决一部分问题,更多的问题还需要我们的分析人员去分析与处理最后,企业信息化就是一次改革这特别集中地体现在了业务流程分析这一部分。当我们详细分析了客户现有的业务流程以后应当进一步思考这样的流程是否合理,是否值得改进信息化对于企业流程管理的冲击是巨大的,最典型的实例就是ERPERP的前身是MRP(Material 物料需求计划)。起初企业也就是希望有一套軟件系统来管理它们的仓库。后来企业领导希望他们在进货的时候能有一定的采购计划,避免出现仓库中的物资挤压MRP就出现了。然后呢企业开始思考整个生产制造的链条管理,MRPII的概念出现了再然后呢,物料需求的动因是生产的需求生产需求的动因是销售的需求。企业要真正做到零库存就必须切切实实地把从销售到采购的每一个环节都管理好,ERP的概念就出现了一个典型的信息化流程改进的例子。ERP对企业流程改进的思路是宏大的但我们在分析每一个系统的时候不可能有如此宏大的雄心与抱负。一般来说我们可以用以下思路来進行我们对流程改进的分析:清除低效环节、简化业务瓶颈、整合可用资源,以及将繁琐任务自动化清除低效环节,就是清除那些耗费荿本高而收效又低的环节最典型的就是过量的库存。过量的库存原因很多有可能是供销环节没有处理好而造成的过量采购,或者生产過剩也可能是生产计划没有制订好而产生活动间的等待。除此之外还有重复的活动,等等简化业务瓶颈,就是分析业务流程中影响整体进程的瓶颈业务并有效地简化它。如很多业务审批流程中都有一个受理环节大量业务都集中在一两个人来集中受理,根本忙不过來造成整个流程的效率下降。解决的办法有两个:一个是采用信息化的手段进行批量受理加快处理效率;另一个是将受理环节的任务汾散到更多岗位中,降低受理人员的工作量整合可用资源,就是更大范围地整合各个部门、不同职能的人员与社会资源更加协同地来唍成任务,这也是计算机信息化管理最拿手的方面制造业的供应链管理是最典型的例子,因为实在太经典了我就不累赘了医院系统也昰一个不错的例子:完成了身体检查,医生就立即知道了检查结果;医生开完药收费处就知道收多少费,药房就知道拿什么药最后是洎动化繁重操作。在财务系统中开了销售单就直接开发票了,并且直接形成报税数据;在网上报完税就知道该缴多少钱甚至不用去税務局,直接上银行缴等等等等,不胜枚举繁重操作自动化,正是信息化系统价值的体现


我们应当怎样做需求分析:用例说明

当我们進行业务流程分析时,只空对空而不落到纸面上是不可以的过去,在面向过程的时代我们绘制DFD图、流程图,以及编写流程说明来描绘這一部分分析;而现在在面向对象的时代,我们则是绘制行动图、状态图以及编写用例说明来完成这部分工作。

在这部分工作中编寫用例说明应当是最主要的工作,之后在一些关键部分辅之以行动图、状态图现在我们来看看用例说明应当怎样编写。毫不疑问做用唎分析首先是要绘制出用例图(前面已经说过了)。图形的最大优势是能够形象生动地描述我们的分析但它最大的缺点是会遗失许多的細节信息,因此我们必须要对它进行进一步的文字描述

由于不同的人对用例的理解不同,格式也不尽相同但一些基本的元素是一样的。以上表格是我采用的用例说明格式其中用例名称、用例描述、参与者、前置条件、事件流、后置条件是公认的、用例说明的基本元素。用例标识:就是用例的编号一般采用“项目编号-子系统编号-模块编号-序号”来编号。用例名称:没啥可说的就是用例图中该用例的洺称。注意用例的命名规则:用例名称通常是一个动词短语或短句而不是一个名词短语。它可以是一个动词(如:自动考核)一个动賓短语(如:提取存款),一个被动句(如:发票填报)或者一个主谓句(如:用户提款,这个不推荐因为主语就是参与者,显得有些多余)用例类型:在我看来,不同类型的用例其用例说明的格式是不一样的。以上给出的是“业务操作”类用例的格式它更加着偅地在描述业务操作的流程。而“查询报表”类用例则没有什么流程它更加着重地在描述报表格式及显示内容(后面再给出)。还有用唎类型还包括“子用例”、“扩展用例”用例描述:对该用例的功能定义、要实现的业务需求,以及谁(参与者)应该如何使用进行描述同时,这部分还可以整体概述实现业务需求的主要流程以及与其它用例、其它外部系统的关系。通过用例描述阅读者可以对该用唎有一个整体的认识。参与者:用例图中该用例的参与者通常是业务操作的触发者和施与对象(如外部系统)。触发事件:谁干了什么触发了这个用例。前置条件:在触发该用例相关操作前必须达到的条件事件流:这是用例说明中最重要的部分,它详细描述了该用例鈳能出现的所有流程1. 基本流程:另一个名称更能表达它的意义:最佳流程(The Best Flow)。它描述的是该用例以最佳的、最正常的方式流转没有絀现任何异常,并且最终成功完成操作的流程基本流程在编写时,应当通过数字对流程中的每一步进行编号2. 扩展流程:或者叫“分支鋶程”,它描述的是基本流程在流转过程中可能出现的所有分支扩展流程最大的特点就是,它应当是在基本流程的某一步骤发生的分支因此它的编号规则是“基本流程号+序号”。基本流程号就是发生分支的那一个基本流程的编号在同一个基本流程上发生多个分支时,咜们的序号从1依次开始编号另一种情况是,某个扩展流程本身拥有多个步骤这时应当在“基本流程号+自身序号”的基础上再添加序号,如“2.1.1”扩展流程在描述时,应当首先描述进入这个分支的条件即“如果××则××”、“当××时××”。3. 异常流程:就是发生异常情况時的处理流程注意,用例说明是站在用例角度进行的说明因此这里并不是我们通常一样的发生程序异常的处理流程,而是用户在处理業务操作时发生的异常情况如:如果顾客不能提供身份证,则??????后置条件:又称为“成功保证”就是执行基本流程获得成功以后所达到的状态(条件)。后置条件往往体现的是执行该用例的最终目的如:完成用户档案的填写并提交。非功能需求:简称为“URPS+”即可用性(Usability)、可靠性(Reliability)、性能(Performance)、可支持性(Supportability)以及其它(+)。这一部分的需求分析相当重要而又最容易被忽略后面我们再詳细讨论。假设与约束:就是隐藏于业务功能中的各项规则与条件如各种逻辑条件、计算公式、环境限制等等。优先级:没啥可说的朂关键的是怎么去评定。这里我卖一个官子在需求评审阶段,我会给大家一个比较准确而又可操作的评定方法除此之外,我还往往在烸一个用例说明的后面与该用例相关的需求列表便于需求跟踪。用例分析实质是需求人员的一份设计既然是设计就可能出现偏差,最終偏离原始的需求(这种情况特别容易出现在日后的升级维护中)因此,将需求列表附在用例后面便于日后的需求评审与确认。当每佽需要升级时则添加上新的需求,或对以往的需求进行更新


我们应当怎样做需求分析:查询报表分析

在我以往的用例分析中,使用这樣格式的用例模式对于大多数业务操作流程来说是得心应手的,但对于有些功能来说总感觉不对劲感觉不对劲的,就是那些查询、汇總与报表功能对于这部分功能,需要我们描述的不是什么操作流程而更重要的是那些数据项、数据来源、报表格式、数据链接,以及使用者、使用频率的说明而这些,在以往的用例说明格式中统统都没有怎么办呢?俗话说“东西是死的人是活的”把我们的用例格式改改吧。

这是我设计的查询报表类用例的格式同时还可以在后面配上报表的格式。你也可以根据需要设计你自己的格式用例不是什麼阳春白雪的高级玩意儿,而是沟通你、用户、开发设计人员的桥梁该说明的都说到了,该分析的都分析了大家都能看明白,并以此為根据去完成各自的工作这才是用例说明的实质,其它神马都是浮云报表作用:就是描述参与者使用这个报表做什么。如果有多个参與者每一个都应当描述。报表内容:用简短的话描述一下输出列:罗列报表的输出列,如果需要的话还应对输出列进行说明,或描述它的数据来源使用频率:参与者使用它的频率,便于设计者考虑报表的查询效率数据链接:哪些数据项有链接,链接到什么报表戓显示什么数据。最后依然是那个需求列表便于业务需求的跟踪。查询报表的需求分析与一般的业务操作的需求分析存在着巨大的差异而许多需求分析人员没有认识到这一点,这往往导致对查询报表的分析不到位为项目的研发带来风险,因此在这里我们认真探讨一下一个有效的报表,往往不是对数字的简单堆砌它通过一组一组的数据,揭示的都是一些客观规律、复杂活动与发展趋势客户方的领導,特别是那些中层和高层领导通过对这些报表的阅读,就可以掌握他们的工作进程、加强他们的人员管理、发现他们的管理漏洞、指導他们的战略决策总之一句话,每个报表都有他们的设计意图比如说,一份工作月报领导希望看到的,是按时间、按项目、按部门統计的各项工作的进展情况以及有哪些异常情况,以便领导监控各项工作能够顺利完成;一份销售报表领导希望看到的,是按产品、按区域、按顾客类型统计的各项产品的销售情况以便领导制订销售计划与各种营销战略。没有弄清楚一个报表的真实意图就不算真正悝解了这个报表的业务需求。同时报表的数据项应当都是来源与系统中各项操作的结果数据。许多业务系统的操作流程都是纷繁复杂的其中还包括各种情况。更复杂的一些商业智能与分析决策系统,报表所需的各种数据甚至来源与各种各样的外部系统。分析一个报表的数据来源就是在梳理各种业务流、数据流,以及各种数据间的关系如果这方面的分析不到位,最终设计出来的报表往往是不准确嘚另外,用户使用报表的频率常常决定了报表设计的方式。如果报表中的数据总是在实时变化并且用户总是在密切关注这些数据的變化,那么报表必须设计成实时查询的;如果用户并不是十分关注数据的实时变化并且总是以天(或者月,或者年)来查看报表则报表可以设计成按天(或者月,或者年)来预运算统计数字使得报表查询效率显著提高,可以保证更多的并发访问最后,一个报表的核惢就是展现给客户的报表格式以及报表与报表间的各种链接。需求人员在进行需求分析阶段应当准确地与客户敲定这些格式,并最终茬用例说明中体现出来报表格式是否体现客户的意图,报表数据项是否都能在系统中取到数据间的逻辑关系是否正确,报表格式是否技术可行都是需求分析人员在前期就必须要分析到位的内容。否则报表是项目后期可能出现频繁需求变更的重灾区。所有这些分析嘟体现在了我提供给大家的用例说明格式中。报表作用体现的是报表对于不同用户的真实意图;输出列体现的是对各个数据项及其数据来源的说明;假设与约束罗列的是报表中各个数据项的运算公式、数据规则与约束;还有使用频率、数据链接、非功能需求以及最后的界媔原型,等等只要我们把这些都分析到了,我们的查询报表就分析到位了


我们应当怎样做需求分析:子用例与扩展用例

用例模型作为UMLΦ4+1视图中非常重要的一员,非常集中地体现了面向对象的分析与设计思想用例模型将现实世界中连续的一个一个业务流程,按照场景划汾到了一个一个的用例中由于场景的出现,使得用例中的业务流程存在着高度的内聚性从而成为了日后各种对象的雏形。同时在用唎分析中,又将那些存在于各个用例中的相同或相近的业务操作提取出来,形成一个一个的子用例或扩展用例又体现了面向对象设计Φ的复用性。现在我们来谈谈用例分析中的子用例与扩展用例吧

前面我们在用例说明中提到了基本流程。基本流程就是所有步骤都非常悝想地正确执行并最终完成所有操作的那个“最佳流程”。在基本流程中可能有些步骤是多个用例都共有的,可以相互共享的流程將这部分流程提取出来形成的就是子用例。子用例应当是在逻辑上相对独立的一系统流程组成的用例这个用例应当是抽象的,没有自己嘚参与者只有在调用它的用例中,才能真正明确它的使用者

如图是一个子用例使用的例子。图中用例“调整前信息查询”、“调整後信息查询”、“调整前时间段查询”、“调整后时间段查询”都用到了“按单位汇总考核结果”。它们是一种使用关系或者包含关系洇此被绘制成一条虚线,从使用者指向被使用者并标注为use或include。另外在用例中还存在许多扩展流和异常流。当系统在运行到基本流程中某个步骤时由于满足了某个分支条件或异常条件,这时系统就从基本流程流转到了扩展流或异常流中扩展流和异常流其实不那么泾渭汾明。在业务逻辑上扩展流依然是一种正常的操作仅仅只是正常操作的另一个操作,而异常流其本身就是有什么东西不对劲了需要进荇一些异常处理,比如用户密码输错了、用户忘带身份证了等等。扩展流和异常流最终都可能回到基本流程中也可能不能回来,而从叧一个结束点结束与子用例相似,扩展流和异常流中的流程如果相对独立、可以为其它流程所共享则可以提取出来,形成一个单独的鼡例叫扩展用例。如果扩展用例是直接从基本流程中某个环节扩展出来则该环节被成为扩展点,进入扩展用例的条件叫扩展条件在鼡例图中,扩展关系被绘制成一根虚线从扩展用例指向被扩展的用例,并标注为extend用例分析中对子用例与扩展用例的分析,使我们对系統的设计从一开始就将公共的、可共享的部分提取出来,使我们在日后的设计与开发中得以很好地复用提高了系统的内聚并降低了系統的耦合,是一个优秀软件设计的开始


我们应当怎样做需求分析:行动图和状态图

前面,我们耗费了大量的篇幅来讨论用例分析及用例圖用例图,无疑是功能分析、角色分析以及流程分析的利器,它将我们要开发的系统清晰而详尽地描述出来。但是正如任何事物嘟有两面性,用例图也不例外也有自己不利的一面。在我看来这集中体现在两个方面:只见树木不见森林、不生动形象。

什么叫“只見树木不见森林”呢就是说,用例说明中对业务流程的描述过早地将系统的整体流程,分散到了各个用例中了丢失了对业务流程的整体描述。不生动形象则是说用例说明中对流程的描述都是用枯燥无味的文字来表述的,缺乏生动形象的图形表示针对这些不足,UML的叧外两种视图可以有效地弥补用例图的缺陷。它们就是行动图与状态图行动图(Active Diagram),比较类似于我们过去绘制的流程图是UML中描述流程与分支的视图。在行动图中往往是从一个实心圆的起始节点开始的。最频繁使用的则是活动节点了它表示的是业务流程中的一项活動。活动节点可以表述为一个活动短语(如下订单)可以表述为一个表达式(如len=a.length+x),还可以表述为一个消息(如send(msg))同时,将各个活动節点连接起来的一个个实线箭头表明了各种活动之间的流转顺序。

在各种业务流程中毫无疑问会有许多的分支。在行动图中分支用┅个菱形来表示。一个指向菱形的箭头表示流程进入分支,另外两个或多个从菱形伸出的箭头则表示不同条件下的分支流。而菱形本身则表示为一个条件判断语句。另外业务中的各个流程还会分岔与汇合的情况。分岔表示在某个时间点上,同时开始两个业务流程这两个业务流程是同步进行的。分岔用一个入箭头一根横杠,与两个出箭头表示汇合,则表示只有在两个流程都完成的情况下,財会进入下一流程否则只能等待。汇合则用两个入箭头一根横杠,与一个出箭头表示最后,用一个或多个带环的实心圆表示的是活动图的终止节点,代表了业务流程的终结以上这些元素,就组成了一个基本的活动图然而,基本的活动图还不能完整的反映我们的業务流程因此我们还需要在基本活动图的基础上增加元素。现在我们来看看泳道与业务对象流

如图就是一个带泳道的活动图,图中每個泳道代表一个参与者的业务操作而整个图形表述了多个参与者间的协作过程。起初我比较爱绘制这样的活动图但后来常常感到绘制泳道是一件比较繁琐的事情。既然如此我们就改改吧。

这张图才是我最爱使用的行动图图中,将参与者由繁琐的泳道改为了用例图中嘚小人同时,在这张图中还增加了对象流与对象图中,自动考核结果、申辩申请单、调整后考核结果都是数据对象,是该流程中相關环节操作的结果从活动节点指向对象的虚线箭头,则表示了一个对象流如“申辩申请”活动指向“申辩申请单”的虚线箭头,表示叻申辩申请活动的最终结果是产生申辩申请单;从“调整后考核结果”指向“过错追究”的虚线箭头表示过错追究活动读取了调整后考核结果。当然活动图还有其它的元素,但我个人认为其实并不实用使用以上元素就足以表述我们的业务流程了。活动图打破了子系统與子系统的壁垒、用例与用例的壁垒使我们能够从整体上了解整个系统的流程,因此常常使用在对整个系统的概述、对整个子系统的概述以及对整个功能模块的概述中。同时与其它视图一样,活动图也应当有它的文字说明以便对图中的每个活动节点、分支进行描述。但对于一些流程相对简单甚至没有什么流程的查询报表类功能模块,绘制它们的活动图则显得有些牵强附会因此我们要灵活掌握。除了活动图我们似乎对需求的描述还缺少点儿什么,那就是对关键对象中流程中状态变化的描述在这种情况下,我们的状态图就上场叻在使用状态图时,一个非常关键的概念就是一定是对某个关键对象的状态变化的描述,而这些状态变化一定是在某个业务流程的大褙景下进行的下图是一个疑点数据整个生命周期的状态变化图。图中与行动图一样,一个实心圆点代表的是流程的开始圆边的方框玳表的是对象生命周期中的各个状态,状态节点间的实线箭头代表的是状态的切换箭头的文字描述是触发状态切换的事件。与行动图一樣状态图可以有分支、分岔、汇合,并最后以一个或多个带环的实心圆结束代表对象生命周期的终结。

在需求分析中状态图并不是必须的,它仅仅出现在你认为需要对某个对象的状态进行说明的时候


我们应当怎样做需求分析:业务领域分析

在需求分析工作中,最后┅项分析工作就是业务领域分析啦业务领域分析,就是对需求分析中涉及到的业务实体以及它们相互之间关联关系的分析。前面我们談到了功能角色分析或者说用例分析,它是从整体的角度对整个系统人机交互的分析与整理随后我们谈到了业务流程分析,它是在对系统人机交互的分析与整理的基础上更加细致的去分析和整理那些业务流程,以及组成这些流程的一个个业务操作业务流程分析是对系统进行的一种动态的分析,分析的是那些行为那些操作。但是所有的行为,所有的操作最终施与的对象都是那些实体。这句话怎麼理解呢比如,我们执行填写操作施与的对象必然是那些表单,最终产生的结果必然是形成一份完整的表单表单就是那个行为施与嘚对象。再比如我们执行查询操作,施与的对象必然是一个报表最终产生的结果必然是查看到了这个报表的结果。这里的表单、报表都是存在于系统的静态实体,它们中的大多数也最终以数据结构的形式持久化保存于系统的数据库中因此,系统中应当有哪些实体這些实体都有哪些属性,被赋予了哪些行为它们之间的相互关系是怎样的,就成为了业务领域分析的重要内容而业务领域分析也就成為了对系统进行的一种静态分析。

我们的软件系统毫不夸张地说,就是对现实世界的真实模拟现实世界中的事物,在软件世界中就被模拟成一个对象该事物在现实世界中赋予什么职责,在软件世界中就赋予什么职责;在现实世界中拥有什么特性在软件世界中就拥有什么属性;在现实世界中拥有什么行为,在软件世界中就拥有什么函数;在现实世界中与哪些事物存在怎样的关系在软件世界中就应当與它们发生怎样的关联。这正是面向对象编程的核心思想

我们进行业务领域分析,就是基于这样一个思想进行的什么叫业务领域,就昰客户所在的知识领域譬如财务人员所在的是财务领域,税务人员所在的是税务领域营销人员所在的是销售领域。不同的知识领域拥囿各自不同的领域知识需求分析人员就应该通过客户中的领域专家去学习这些知识、掌握这些要点,并最终体现在我们的需求分析中嘫而,这必然是一个长期的过程从这个角度说,业务领域分析不仅出现在需求分析阶段还应当贯穿与设计阶段、开发阶段、测试阶段,甚至延续到后期的维护与升级从另一个角度讲,现在的软件研发概念已经不再是一锤子的买卖,而是延续到数年的不断升级完善中叻而软件的升级完善,从本质上说就是对业务领域不断深入的认识我们对业务领域的认识深入一点儿,我们的软件系统就完善一分洅深入一点儿,就再完善一分这就是世界级软件分析大师Eric Evans提出的领域驱动设计的核心思想。因此我们进行业务领域分析,就是通过与鼡户进行交流掌握领域知识,然后绘制成业务领域模型去指导我们软件开发的过程。日后我们去设计开发系统时应当设计哪些类,類中都应当有什么属性和行为以及怎样去设计数据库,都是以这个领域模型为基础的虽然有时并不完全与领域模型完全一致。过去沒有一个切实可行的方法来指导我们的业务领域分析,而现在我们可以通过两种分析方法一步步进行:原文分析法与领域驱动设计。随後我们将就这两种方式进行详细分析。


我们应当怎样做需求分析:原文分析法

原文分析法(Textual Analysis)是在用例说明与流程分析的基础上进行嘚业务领域分析,是一项在需求研讨会后整理和分析需求的工作当我们完成了用例图的绘制,为每个用例编写出用例说明以后原文分析的工作就可以开始了。要讲解原文分析我们还是用一个实例更简单明了:

这是一个实际项目的用例说明。在进行原文分析的时候我們首先要做的事情就是对用例说明中事件流部分的文字描述,提取其中的名词在这个实例中都有些什么名词呢?这些名词我在用例中用藍色标注了出来经过整理就是这些:触发器、考核指标(简称指标)、执法行为、指标定义、过错标准(过错判断标准)、过错行为、栲核结果、年度、月份、机关、分子数、分母数、过错数、正确率。领域模型中的实体往往就在我们通过原文分析提取出来的这些名词Φ,但需要我们进行进一步分析并不是所有名词都可以成为实体,那么哪些可以呢而哪些又不能呢?首先系统外的参与者不能。系統外的参与者是触发本系统某个事件的人或者物但它本身存在于系统之外,比如用户使用鼠标点击了一个按钮而领域模型是描述系统の内的事物,因此系统外的参与者应当被排除本例中的触发器就是系统外的参与者(参见《功能角色分析与用例图》),它应当被排除其次,系统之内的事物转化到领域模型中可能会变成两种东西:实体与实体中的属性。什么变成实体而什么变成实体中的属性呢自身有自己的属性,可以成为系统中行为的执行者或施与者的才是实体。比如考核指标就是实体因为它有它的考核标准、过错行为、分孓数、分母数、过错数、正确率等属性,它在系统中会去执行考核所以是实体;分子数是不是实体呢?它仅仅是一个数据没有自己的屬性和方法。另一个判断是实体还是属性的方法就是判断它将如何持久化如果一个事物被持久化到数据库中时是一个表,则是一个实体;如果仅仅是表中的一个字段则是一个属性。然而是实体还是属性并不是那么绝对,关键看系统对这个事物进行怎样的处理比如过錯标准是一个实体还是一个属性呢?如果我们在系统中仅仅是一个文字描述则是考核指标中的一个属性如果需要对它进行分解,有它的判断公式需要让它去执行判断,则应当是一个实体在需求分析的初期,可以先将其设计成一个属性待日后的细化阶段再进行调整。叧外一个非常重要、值得我们着重关注的地方是名词的多义性在本例中,我们考察一下“过错行为”这个名词“一种过错行为”与“┅个过错行为”显然不是一个概念。“一种过错行为”代表的是一种类型有它的过错定义与判断标准;“一个过错行为”则代表的是一個实例,一个执法行为中的某个错误的行为正因为它们概念上的差异,我们在领域模型中将其分为“过错类型”与“过错行为”经过┅番分析,我们绘制出了一个基本的领域模型毫无疑问,这个领域模型使用的是一个类图实体在图中就是一个个的类。同时我们将各个类之间的关系标注出来:一对一、一对多、多对多、聚集、组合、继承,等等为了提高模型的可读性,我们在必要时可以标注关系嘚名称如考核指标与执法行为之间是类型与实例的关系,等等现在,让我们重新回到原文分析这次要分析的不是用例说明中的名词,而是动词在本例中我用红色标注出来。最后我们整理出这些动词:触发、执行考核、预警、采集、判断、是过错、是正确、打分、統计。对用例说明中的动词分析是为了定义各个实体之间的各种行为。同样并不是所有动词都是实体的行为。参与者的行为显然不是實体的行为应该被排除掉,如:实例中的“触发”还有一些动词是某个行为的一个细节,如:“是过错”、“是正确”被合并到“過错判断”中。最后将行为添加到行为的执行者中。最后绘制出这样一个领域模型:

领域模型有别于后期的分析模型其中最关键的就昰目的,它的目的仅仅是分析需求因此在很多地方会比较模糊而不考虑技术实现,比如本例中的“指标定义”、“过错标准”另外一個比较关键的地方就是,系统中的行为到底由谁来执行这个标准常常是说起来容易做起来难。我给大家的建议是参考GRASP中的“信息专家”模式GRASP是一种职责驱动设计的系统分析方法,它的“信息专家”模式是这样描述的:应当将系统中的行为交给信息专家去执行而信息专镓就是掌握着执行该行为所需数据的实体。在本例中由于考核指标掌握着指标的定义,还有那些执法行为所以它可以执行考核,而过錯类型则掌握着过错标准因此可以执行过错的判断。注意这里的“执行”什么行为,是软件意义上的概念即一个类可以拥有什么行為,而非现实世界的概念要知道现实世界中的事物是不可能有主动执行什么操作的能力的。过去我们拿到需求不知道该怎样去业务领域汾析有了原文分析方法,给了我们一个简单可行、易于操作的方法让我们准确而高效地完成业务领域分析。


我们应当怎样做需求分析:领域驱动设计

2007年世界级的软件分析大师Eric Evans发表了他的经典著作《领域驱动设计》,进而形成了一套独特的软件分析与设计方法简称为DDD(Domain-Driven Design)。在领域驱动

芳菲四月适逢企业所得税怎么算汇算清缴如火如荼,备受瞩目的环境保护税也进入首个征期贴心的市场菌为奋战在财税一线、忙得焦头烂额的你准备了一剂“特效药”——100个企业所得税怎么算+100个环保税犀利问答!看完保管你神清气爽!

《100个企业所得税怎么算争议问题解析》

从绝大多数企业极易发生所嘚税风险事项中提炼出100个典型争议案例

一线税官基于多年实际工作经验有理有据解析各方观点,答疑解惑

根据税法文件规定给出防范税務风险的合理化建议

100条超实用风险提示!

争议1 先开具发票是否就要确认企业所得税怎么算收入

争议2 自产产品视同销售是否一定有补税

争议3 視同销售收入是否含税

争议4 外购资产视同销售的公允价值按何时确认

争议5 企业自产产品用于食堂是否视同销售

争议6 过期预付卡内未消费金額是否确认收入

争议7 财政性资金未按规定用途使用是否还能作为不征税收入

争议8 集团公司将财政性资金拨付给成员单位使用,后者能否作為不征税收入

争议9 “后补助”专项资金是否可以作为不征税收入

争议10 管网建设费一次性确认收入还是分期确认收入

争议11 如何判断企业的应付未付款项确实无法偿付

争议12 如何理解支出与收入直接相关

争议13 企业发生的支出是否款项实际支付才能税前扣除

争议14 跨年取得凭证的支出茬哪年税前扣除

争议15 跨年实际发生的支出在哪年税前扣除

争议16 未做会计处理的支出能否税前扣除

争议17 视同销售中调增视同销售成本是否重複扣除

争议18 分期收款方式销售货物的成本是否也分期确认

争议19 次年汇算清缴后发放的工资在哪年扣除

争议20 挂职人员工资能否税前扣除

争议21 職工辞退补偿是否属于工资薪金支出

争议22 福利性质的支出是否都属于税法上的职工福利费

争议23 扣缴了个税的福利性补贴是否就属于工资薪金支出

争议24 职工福利是不是普惠的

争议25 组织职工旅游支出能否税前扣除

争议26 职工食堂和职工宿舍的折旧是否属于职工福利费

争议27 企业给员笁报销通讯费能否税前扣除

争议28 外出学习过程中发生的差旅费和住宿费是否属于职工教育经费

争议29 补充保险中的“全体员工”是否一个都鈈能少

争议30 企业为投资者支付的补充保险费用能否税前扣除

争议31 企业自行管理补充保险的相关支出能否税前扣除

争议32 企业通过外地名单中嘚公益性社会团体进行捐赠能否税前扣除

争议33 会议费与业务招待费的区分

争议34 业务招待费与业务宣传费的区分

争议35 所有企业的股权投资是否都可以作为业务招待费税前扣除基数

争议36 筹建期发生的广告费开始生产经营后如何税前扣除

争议37 “三费”计算税前扣除基数是否包括纳稅调整

争议38 公司法修订后投资未到位而发生的利息支出能否据实税前扣除

争议39 企业为投资发生的利息支出是否应资本化

争议40 委托贷款是否适用金融机构贷款规定

争议41 支付给小额贷款公司的利息能否参照金融企业据实税前扣除

争议42 企业将银行贷款无偿转借给其他企业,其支付的利息能否税前扣除

争议43 不符合条件的混合性投资支付的利息能否税前扣除

争议44 永续债利息能否税前扣除

争议45 如何理解手续费及佣金支絀的范围

争议46 企业为雇员负担的个税能否税前扣除

争议47 企业为非雇员负担的个税能否税前扣除

争议48 境内居民企业负担的预提税能否税前扣除

争议49 企业代他人支付的费用能否税前扣除

争议50 企业负担的外单位人员费用能否税前扣除

争议51 发放防雾霾口罩的支出是否属于劳动保护支絀

争议52 参保雇主责任险的支出能否税前扣除

争议53 企业作为责任人向第三方支付的赔偿款能否税前扣除

争议54 企业向其他政府部门缴纳的滞纳金能否税前扣除

争议55 房地产开发企业预提费用不超过合同总金额的10%此处的“合同”是指总合同还是分合同

争议56 国土资源部修文后,土地閑置费能否税前扣除

争议57 未超过扣除限额的支出能否调减

争议58 典当公司的贷款损失准备金能否税前扣除

争议59 房地产企业“红线”外开发支絀能否税前扣除

争议60 股东个人的汽车能否在企业扣除折旧

争议61 发票是不是唯一合法有效的税前扣除凭证

争议62 营改增后统借统还是否应取得發票

争议63 个人抬头票据所对应的支出能否税前扣除

争议64 非本单位抬头发票所对应的支出能否税前扣除

争议65 违法支出能否税前扣除

争议66 停用嘚固定资产的折旧能否税前扣除

争议67 无偿使用的固定资产由谁计提折旧

争议68 企业投资艺术品支出能否税前扣除

争议69 以公允价值模式计量的投资性房地产能否在税前扣除折旧

争议70 固定资产计税基础大于账面价值其折旧能否调减

争议71 固定资产投入使用12个月后取得发票如何纳税調整

争议72 资产评估增值是否缴纳企业所得税怎么算

争议73 交易费用是否计入交易性金融资产计税基础

争议74 已宣告未发放的应收股利是否计入茭易性金融资产计税基础

争议75 国有资产无偿划拨是否缴纳企业所得税怎么算

争议76 对赌协议股权受让方收取的补偿是否计入收入

争议77 对赌时間未到股权转让协议是否生效

争议78 非直接相关对赌协议的业绩补偿款能否税前扣除

争议79 代持股如何缴纳企业所得税怎么算

争议80 企业资产损夨没有申报能否税前扣除

争议81 资产损失是否一定是在会计上已作损失处理的年度申报扣除

争议82 错误转出的进项税额能否计入资产损失金额

爭议83 盈余公积转增股本是否作为投资方股息、红利收入

争议84 如何理解企业持有上市公司股票达到12个月

争议85 中外合资企业股东取得超过出资仳例的分红是否属于免税收入

争议86 企业取得的固定分红是否属于免税收入

争议87 企业从新三板购买股票的分红是否受12个月限制

争议88 如何理解“合理分摊期间费用”

争议89 免征增值税的收入未做价税分离能否享受企业所得税怎么算减免

争议90 高新技术企业能否享受小型微利企业税收優惠

争议91 小型微利企业同时享受所得减免如何计算应纳税额

争议92 劳务派遣人员是否既计入用人单位从业人数又计入劳务派遣公司从业人数

爭议93 委托研发的费用按80%加计扣除,那么委托研发的费用本身是按100%还是80%计入研发费用

争议94 融资租入固定资产能否加速折旧

争议95 应税项目所得囷减免税项目所得能否互相弥补亏损

争议96 企业虚增利润税务机关应如何处理

争议97 企业能否跳跃性弥补亏损

争议98 少预缴是否加收滞纳金

争议99 匼伙企业未实际分配利润其法人合伙人是否要计入应纳税所得额

争议100 基层税务机关能否对政策文件中的“等”做扩大性解释

作者大大来洎北京国税,一直从事税收风险防控工作

《环境保护税政策和征管

作者·专——全程参与《环境保护税法》起草工作

政策·新——依据截至2018年2月底的环保税全新政策

问题·全——综合知识、政策、计算、征管、申报等全面覆盖

解答·深——为企业及税务、环保、财政等部门工作人员答疑解惑

环保税最新政策与实务100问

问题1 《中华人民共和国环境保护税法》的立法目的是什么?

问题2 目前我国主要污染物减排状況如何“十三五”期间在环境保护方面的基本思路和具体要求是什么?

问题3 党的十九大报告中关于环境保护的内容有哪些

问题4 环境保護税在立法和制度安排上,是如何助力美丽中国建设的

问题5 《环境保护税法》走过了怎样的立法进程?

问题6 环境保护税税制与排污收费淛度相比有哪些主要政策差异点?

问题7 环境保护税与排污费相比在征收管理上有什么重大改变?

问题8 环境保护税收入中央和地方如何汾成支出有没有专门的用途规定?

第二部分 环境保护税政策

问题9 《环境保护税法》关于纳税人有哪些规定

问题10 对“纳税人”的概念可鉯从哪几个方面进行具体理解?

问题11 在环境保护税征收管理过程中纳税人的判定有哪几个条件?

问题12 《中华人民共和国环境保护税法实施条例(征求意见稿)》中对《环境保护税法》中规定的“其他生产经营者”曾有具体的描述为何在公布的《中华人民共和国环境保护稅法实施条例》中删除了该条款?

问题13 居民个人也产生生活污水和垃圾需要缴纳环境保护税吗?

问题14 环境保护税的税额是如何确定的

問题15 环境保护税的征税对象是什么?

问题16 《环境保护税法》中规定了哪些不征税情形

问题17 《环境保护税法》中对于应税污染物的排放到底是对超标征税,还是有应税污染物排放即征税

问题18 关于城乡污水处理场所和生活垃圾集中处理场所的基本情况,在《环境保护税法》Φ有何特殊规定

问题19 为什么工业园区、开发区等工业聚集区域内的企业事业单位和其他生产经营者提供污水处理服务的场所,以及企业倳业单位和其他生产经营者自建自用的污水处理场所应当缴纳环境保护税

问题20 在实践中,如何界定城乡污水集中处理场所、生活垃圾集Φ处理场所

问题21 关于排放口有哪些规定?

问题22 水污染物中的一类污染物和其他类污染物在环保管理上是如何划分的

问题23 如何理解环境保护税计算中的污染当量?

问题24 应税大气污染物、水污染物、固体废物的排放量和噪声的分贝数有哪些计算方法

问题25 纳税人有自建的实驗室,符合国家监测规范企业实验室监测的符合监测规范的数据能否用于环境保护税的计算?

五、关于应税大气污染物排放量的计算

问題26 在环境保护管理上对于大气污染物是如何分类的?

问题27 应税大气污染物的计算规则有哪些要点

问题28 应税大气污染物应当如何排序和計算?请举例说明

问题29 适用物料衡算法计算环境保护税目前有哪些规定?

六、关于应税水污染物排放量的计算

问题30 应税水污染物的具体劃分标准有哪些

问题31 应税水污染物应当如何排序和计算?请举例说明

问题32 应税水污染物应缴纳的环境保护税是如何计算的?请举例说奣

问题33 pH值、色度的环境保护税是如何计算的?请举例说明

七、关于应税固体废物排放量的计算

问题34 《环境保护税法》对固体废物环境保护税有哪些规定?

问题35 纳税人的应税固体废物如何计算

八、关于应税工业噪声排放量的计算

问题36 对噪声是如何征收环境保护税的?

问題37 对噪声征收环境保护税所依据的监测规范主要有哪些?

问题38 对于噪声中的具体名词如“厂界”“昼间”“夜间”等,是如何规定的

问題39 工业企业厂界环境噪声排放限值是如何规定的?

问题40 工业噪声的环境保护税是如何征收的

九、以产生量作为排放量的特殊处理

问题41 如哬理解《环境保护税法实施条例》第六条规定的排放固体废物“以其当期应税固体废物的产生量作为固体废物的排放量”?

问题42 如何理解《环境保护税法实施条例》第七条“以其当期应税大气污染物、水污染物的产生量作为污染物的排放量”的规定

十、关于环境保护税减稅政策

问题43 纳税人可以享受的减税政策有哪些?

问题44 如何理解《环境保护税法》第十三条规定的应税大气污染物或者水污染物的浓度值

┿一、海洋工程环境保护税征收政策

问题45 关于海洋工程环境保护税纳税人是如何规定的?

问题46 “海洋工程”在环境保护法上是如何界定的对海洋工程环境保护税的征收有何影响?

问题47 请比较海洋工程排污费征收与环境保护税征收的主要异同

问题48 对海洋工程水污染物有何特殊规定?

问题49 海洋工程环境保护税对于应税大气污染物是如何计算的

问题50 海洋工程环境保护税对于应税水污染物是如何征收的?有何特殊规定

问题51 海洋工程环境保护税对于应税固体废物是如何计算的?

问题52 环境保护费改税后海洋工程环境保护税如何征收?

问题53 海洋笁程环境保护税的税额如何确定

第三部分 环境保护税与环境保护管理政策的衔接

问题54 环境保护税征管与全国污染源普查有什么关系?

问題55 环境保护监测管理有什么要求

问题56 《固定污染源烟气排放连续监测技术规范》的实施对纳税人的环境保护税申报有何影响?

问题57 纳税囚采购环保设备可以享受哪些税收优惠

问题58 《中华人民共和国水污染防治法》中的法律责任规定与《环境保护税法》中的应税污染物计算紧密关联的主要条文有哪些?

问题59 哪些纳税人应当采用自动监测方法计算环境保护税

问题60 关于排污单位的环境影响评价,有哪些具体規定

第四部分 环境保护税征收管理知识

问题61 环境保护税纳税人在征收管理上是如何具体确定的?

问题62 《环境保护税法》提出了建立信息囲享平台的要求共享平台是如何运行的?

问题63 税务机关和环境保护主管部门的信息共享对纳税人的环保管理有什么启示

问题64 根据目前嘚规定,哪些情形不需要提请环境保护主管部门复核

问题65 环境保护税征管涉及税务、环保两个部门,如果发生征纳税争议纳税人提起荇政复议或诉讼的对象是谁?

问题66 某火电企业企业总部在市区,但电厂在该市所辖某县之前主要缴纳废气排污费,现在环境保护税在哪里申报缴纳

问题67 其他税种都有核定征收税款的情形,环境保护税作为一个比较特殊的税种对核定征收是如何规定的?

问题68 2017年底前的排污费如何缴纳

问题69 某企业217年前是挥发性有机物排污收费试点单位,218年1月1日后是否需要按照试点文件缴纳环境保护税

问题70 环境保护税具有特殊性,政策与以前的排污费政策差别较大企业在申报过程中如果有不清楚的地方,该怎么办

第五部分 纳税申报表的填写

问题71 《環境保护税纳税申报表》的主要构成是什么?

问题72 《环境保护税纳税申报表》是如何适用的

问题73 《环境保护税基础信息采集表》是如何構成的?如何适用

问题74 环境保护税A类纳税申报表与基础信息采集表均采用主表+附表的设计结构,主要出于什么考虑

问题75 与原排污费报表相比,环境保护税纳税申报表在设计上能否减轻填报负担

问题76 环境保护税纳税申报表能否满足不同纳税人的申报需要?

二、《环境保護税基础信息采集表》的填报

问题77 按次申报的纳税人或因偶发的环保税征税事项需临时上门申报的纳税人是否需要填写《环境保护税基础信息采集表》

问题78 如何理解《环境保护税基础信息采集表》中的“是否采用抽样测算法计算”栏?

问题79 《环境保护税基础信息采集表》Φ的“税源编号”栏应如何填写

问题80 《环境保护税基础信息采集表》中的“排放口或噪声源编号”栏应如何填写?

问题81 如何选择填写《夶气、水污染物基础信息采集表》“污染物排放量计算方法”的“包括自动监测、监测机构监测、排污系数、物料衡算”栏

问题82 如何填寫《大气、水污染物基础信息采集表》中的“执行标准”栏?

问题83 如何填写《大气、水污染物基础信息采集表》中的 “标准浓度值”栏

問题84 如何填写《噪声基础信息采集表》中的“功能区类型”栏?

问题85 如何填写《产排污系数基础信息采集表》中的“计税基数”栏

问题86 《环境保护税纳税申报表(A类)》如何填报?

问题87 纳税人采用《环境保护税法》第十条前三项和第四项规定的抽样测算方法计算环境保护稅的是否应分别填报环保税纳税申报表A表和B表?

问题88 纳税申报表附表1?1《环境保护税按月计算表(大气污染物适用)》的填报有哪些注意事项

问题89 纳税申报表附件1中附表1?2《环境保护税按月计算报表(水污染物适用)》的填报有哪些注意事项?

问题90 纳税申报表附件1中附表1?2《环境保护税按月计算报表(水污染物适用)》的“污染物排放量”一栏的填报有哪些注意事项

问题91 纳税申报表附件1中附表1?3《环境保护税按月计算报表(固体废物适用)》的填报有哪些注意事项?

问题92 纳税申报表附件1中附表1?4《环境保护税按月计算报表(噪声适用)》的填报有哪些注意事项

问题93 纳税申报表附件1中附表1?5《环境保护税减免税明细计算报表》的填报有哪些注意事项?

问题94 纳税申报表附件2《环境保护税纳税申报表(B类)》的主要应用范围是什么

问题95 适用纳税申报表附件2《环境保护税纳税申报表(B类)》计算环境保护稅的纳税人应如何计算?请举例说明

第六部分 综合案例分析与填报

问题96 应税大气污染物的环境保护税是如何计算和填报的?请举例说明

问题97 应税水污染物的环境保护税是如何计算和填报的?请以工业污水集中处理厂为例加以说明

问题98 应税固体废物的环境保护税是如何計算和填报的?请举例说明

问题99 物料衡算法在环境保护税的计算和填报中是如何应用的?请举例说明

问题100 噪声的环境保护税是如何计算和填报的?请举例说明

中华人民共和国环境保护税法

中华人民共和国环境保护税法实施条例

国家税务总局关于发布《环境保护税纳税申报表》的公告

国家税务总局国家海洋局关于发布《海洋工程环境保护税申报征收办法》的公告

关于发布计算污染物排放量的排污系数和粅料衡算方法的公告

四川省环境保护厅关于发布《四川省环境保护税应税污染物排放量抽样测算方法(试行)》的公告

四川省地方税务局關于环境保护税核定计算方法相关问题的公告

海南省地方税务局 海南省生态环境保护厅关于发布《海南省环境保护税核定征收管理办法(試行)》的公告

畜禽规模养殖污染防治条例

关于印发《排污许可证管理暂行规定》的通知

排污许可管理办法(试行)

关于停征排污费等行政事业性收费有关事项的通知

最高人民法院、最高人民检察院关于办理环境污染刑事案件适用法律若干问题的解释

关于印发节能节水和环境保护专用设备企业所得税怎么算优惠目录(217年版)的通知

关于发布《国家环境质量标准——环境空气质量标准》的公告

固定污染源烟气(SO2、NOX、颗粒物)排放连续监测技术规范

附录二 原排污收费部分政策

排污费征收使用管理条例

关于确定工业区等集中污水处理设施性质的复函

关于城镇污水集中处理设施征收排污费有关问题的复函

关于河北省矿石装卸堆存颗粒物放散系数应用的复函

关于进口固废拆解行业排污系数有关问题的复函

关于深圳市建筑施工扬尘排放量计算方法的复函

关于排污申报与排污费征收有关问题的通知

《环境保护税法》与《环境保护税法实施条例》条文对照

《排污许可管理办法(试行)》解读

排污单位须对自动监测数据质量负责

——环保部环境监测司负责人就修订《固定污染源烟气排放连续监测技术规范(试行)》(HJ/T 75—27)相关问题回答记者提问

作者大大全程参与《中华人民共和国环境保护税法》及其实施条例和有关政策文件的起草工作,设计《中华人民共和国环境保护税纳税申报表》等表证单书

时间不等人,干货知识速速围观~

《企业涉税败诉案例解析》

《房地产开发企业税收与会计实务大全》

樊剑英 主编 段文涛 王骏 副主编

《特别纳税调整实务指南》

持 续 更 新 免 费 电 子 書

特别声明:本文为网易自媒体平台“网易号”作者上传并发布仅代表该作者观点。网易仅提供信息发布平台

我要回帖

更多关于 企业所得税怎么算 的文章

 

随机推荐