对软件开发的思考
在开始这篇文章之前,我先给出构思这篇文章的人性假设。假设是人思考的出发点,人的思考活动往往围绕着一定的假设展开的。
人性假设:
P1
:人总是有惰性的。
P2
:人总是按照自己的习惯做事情,对陌生事物具有一定的抵触。
(一)
界面程序
界面程序包括:桌面程序,web程序。对于桌面程序,用户点击桌面上的应用程序图标,就可以打开该程序。而对于web程序,用户得先打开浏览器、输入URL。
而且用户在暂停使用软件的时候,桌面程序可以缩小给用户的视觉。
这只是一些桌面程序和web程序之间的差异。这些差异是否会影响用户对程序的选择倾向?
但是从开发上,视觉效果良好的桌面程序比同等效果的web程序开发代价大。无论用VC++,还是利用C++BUILDER,开发视觉效果较好的程序不是一件很容易的事情。
从我的工作过程中,我发觉利用VC++、C++BUILDER开发出美观界面程序,是具有一定的难度。因此在开发过程中,有些难于实现的,我总是改变其实现方式,但是这种改变不是随意的改变,而是讲究控件布局的清晰性:朴实、简洁,而且这种改变不会给用户带来使用上的麻烦。
如果一款软件,既实用,又简洁、朴实、方便,那么应该是一款成功的软件。因为用户使用该款软件的目的是为了提高其工作效率,又不想太麻烦。
相反有些软件为了界面上的花哨,但是运行速度挑战用户的耐性。我觉得这样的软件迟早会让用户抱怨的。比如SOHO、Yahoo、163、MOP等等。这些网站,加载速度比较慢,使用IE浏览器打开,经常遇到IE崩溃的现象。不过这些网站是门户网站,是为了吸引用户的眼球,所以添加那些吸引眼球的因素。
但是如果用户在工作过程中,遇到类似的问题,那么用户肯定会抱怨。工作性质的软件跟门户网站是有区别的。
那么怎样才能开发出一款成功的软件呢?
软件设计是考虑人的因素,要研究人的使用习惯。
人在使用软件的过程中,会逐渐养成一些使用习惯。对于陌生的软件,他或多或少会抵触。
因此在开发的前期,研究用户使用的软件,可以为开发带来好处。研究用户想要什么,是成功开发软件的基础。
通过实际的研究,也可以避免设计者进行自以为是的设计——一种理想式、没有验证的设计,很多人往往从主观去臆测用户的内心。
在我经历过的项目中,我遇到的问题:
1
:过分模仿同类软件。这是在第一家公司遇到的问题。模仿有个好处,可以借鉴同类的产品,但是过分的模范,会丧失自己的特性。那家公司开发一款类似QQ的IM软件,本来的目标是开发所谓第二代IM软件,但是在开发的过程中,模仿QQ、LAWALAWA之类的软件,导致使自己的产品变得臃肿。
那时我一直在分析,如果用户对你的软件特性很熟悉,还会被你的软件吸引吗?
为什么UC一直竞争不过QQ?我觉得跟用户选择软件的社会性有关。比如A的一些朋友都用QQ聊天,如果A想跟他们聊天,那么只能选择QQ。因为他不大可能要求他的朋友都选择UC,况且UC跟QQ的功能大同小异。在UC出现的时候,QQ的用户已经具有一定的规模了。
2
:操作过于负责。那是在第二家公司的时候,这家公司是开发一款面向建筑行业的软件,结果开发的功能极其负责,权限验证负责。用户在使用的过程中,操作繁琐,而且有些权限验证相互矛盾。
这可能与是否有完整的需求设计有关?
3
:写设计文档的人,想象力太丰富。这是在现在的公司,准备开发一款用户管理软件UI程序。那些做界面规划的人,发挥极大的想象力,规划出极花哨的界面,给开发人员带来很大的沮丧感。结果在开发过程中,返工很多。
从那些遇到过的问题,我总是在思考有效的开发,尝试找到一些可行的想法,但是由于个人经历的局限,这些想法还没被验证,没有得到验证的想法不是方法。以下是我的想法:
1
:定位待开发的软件。软件之所以被开发,是因为要解决特定的问题,这也是该软件的本性。如果没有定位好自己的软件本性,往往在开发过程中,感觉相似产品的既有功能好,陷入过分的模仿。
2
:初步定义软件的操作集合,再根据用户的习惯,简化操作集合。
3
:结合开发实力,把程序员当作人,而不是神。合理规划软件的界面。如果没有实力开发出很漂亮的界面,那么就考虑软件布局的清晰性、简洁度,使用的友好性。
4
:功能实用,运行稳定。
(二)
软件的状态序列性
什么是软件的状态序列性呢?在分析这个问题之前,我先分析人的工作流程。
人的一般工作流程:等待任务——>完成任务。在这简单的流程,蕴藏着序列的操作。
其实每个动作是由一序列的基本操作组合成的,可以表示成一序列的状态迁移过程。状态之间有着前续、后继关系的关系,姑且将这个性质解释动作的状态序列性。
其实,人在使用软件的过程也是蕴含着序列的操作,也因此具有状态序列性。
但是状态之间的迁移,有的比较快,快得基本可以忽略这个间隔;有的迁移比较慢,使得人不得不关注它。
人使用软件进行办公,这种状态序列性就演化为软件任务的状态序列性。人使用软件就是为了完成相应的任务。
因此设计软件也要注意到行为的状态序列性。在企业中使用的软件,我觉得这样的特性更加明显。因为企业中人与人的行为具有行为链的关系。比如B展开工作的基础是A的工作,而C展开工作的基础是B的工作,如此下去。这种操作链的关系一般是体现在部门之间的协作上,这样的协议,其迁移间隔比较大。
考虑如下的设计思路,是否可以提高软件的自动化程度呢?比如有项任务J,有A、B、C、D顺序协作完成。其中前面一个是后面一个工作的基础。因此可以定义J的四个状态JAJBJCJD。J是可以保存在数据库中,因此我们对J的四个不同状态跟A、B、C、D做了关系绑定,我们就可以对J进行不同状态的管理、及任务的分派。
如果我们在软件开发的过程中考虑软件的状态序列性,我们是否得考虑我们的设计规划呢?
或者说如果我们考虑到这些,我们是否可以开发出对用户更有效的软件?
如果我们考虑到这些,我们可能是要把很多软件的功能,集成到一块,共同完成用户的需求。