软件项目和其他项目的区别
软件项目和其他项目不一样,是因为它产出的东西是软件系统。软件有自身的特性,它是虚拟的但也有自己的“模样”,它包含了很多计算机相关的技术,里面也很复杂,它有自己的“生产”方法。
主要体现在以下几个区别:
1.软件需求定义相对困难
需求不清:特别是To B的定制化项目,因为业务的复杂性,需求会比较朦胧模糊,多数情况客户自己也不十分清晰或者只能形容个大概。又或者自己内心有清晰的想法,但无法用准确的方式描述清楚,说不明白。
“我希望要有这个功能,那个功能”–可能功能之间是矛盾的,或者没有逻辑性组合不起来。
“我希望这个功能又炫又酷”,“我希望这个界面是简洁大气的”。–这个时候需求设计人员就哭晕在卫生间了。
需求多变:很多时候是项目开始的时候并没有没有圈定项目的范围、指定基线。前期的规划可能也没有完整的结构,为了实现目标不得不变。即使项目开始的时候定义清楚,需求也会因为各种原因经常变动,甚至会出现同一个功能反复变。
需求多变是永远不变的,我们要接受这个事实。如果变更的成本过低,那么变化就会更频繁,所以我们要学会怎么去控制和处理多变。
分析不明:同样的一个软件系统的要求,不同的客户描述会不一样,不同的需求分析人员理解会不一样。我们做需求分析的过程中,还经常会有理解错误的情况,各说各话的情况。需求分析人员,把系统定义得复杂或简单它也会差别特别大。
需求分析人员要理清楚需求,最终定义清楚产出的软件是什么样子,有哪些功能,需要怎么操作,边界在哪里,接口又有哪些确实不容易。
在软件项目中,需求的定义准确,是软件项目成功的关键因素。
2.智力密集型团队
参与软件开发过程的是一群有各种专业知识的技术型工程师,技术型人才的性格差异也比较大。之前我们有一位从玛氏公司跳槽过来的研发助理就感叹:“知识分子比较难管,软件的项目管理过程也比玛氏的项目管理难多了”。
软件项目的产出,也主要是靠这些技术人员的大量高强度脑力劳动。对于这样的团队管理很依赖项目经理对内容的理解。特别是项目经理或其他管理人员并不是非清楚技术的情况下,管理会更加困难。
因此,项目经理要了解一定的技术知识,才能融入到这样的团队中去有效地沟通,让项目成员发挥自己出自己的智力、才能和创造精神,也才能更有利的做出准确的决策。
3.技术复杂程度高
以开发技术举例:实现同样的功能,可以有各种不同的设计,不同的层次结构。比如三层架构,MVC,MVVM,前后端分离,领域模型等等。同样的结构设计,可以用各种不同的开发语言,不同的框架和组件。比如SSM、.NET Core等。以及有各种不同的编码结构(设计模式)和代码的写法。
同样的一个功能,有的人一个类文件写到底,有的人有比较好的面向对象结构,面向切面结构。同样的一个方法有的人写1000行有的人写50行就行了。
技术的强弱,差别是非常大的。可能有的工程师2天能完成的工作,换一个人2个星期都完成不了。
4.开发软件有不一样的过程和方法
一些工程管理方法上,和其他的项目是类似的。比如都涉及项目计划、进度管理、风险管理、资源管理、质量管理和沟通管理等多个方面。但是因为软件的特征,又显得和其他的项目不太一样。它有自己的整套独特的开发过程和方法。
软件是虚拟化的产出,它有自己的结构特性,比如应该更多的考虑复用等等。